其他
快手基于 RocketMQ 的在线消息系统建设实践
The following article is from 阿里巴巴中间件 Author 黄理
为什么建设在线消息系统
业务希望个别消费失败以后可以重试,并且不堵塞后续其它消息的消费。 业务希望消息可以延迟一段时间再投递。 业务需要发送的时候保证数据库操作和消息发送是一致的(也就是事务发送)。 为了排查问题,有的时候业务需要一定的单个消息查询能力。
部署模式和落地策略
大集群 vs 小集群 选择副本数 同步刷盘 vs 异步刷盘 同步复制 vs 异步复制 SSD vs 机械硬盘
客户端封装策略
集群负载均衡 & 机房灾备
千万级 OPS
灵活的权重调整策略
健康检查支持/事件通知
并发度控制(自动降低响应慢的服务器的请求数)
资源优先级(类似 Envoy,实现本地机房优先,或是被调服务器很多的时候选取一个子集来调用)
自动优先级管理
增量热变更
多样的消息功能
延迟消息
事务消息
transientStorePoolEnable 这个参数必须保持默认值 false,否则会有严重的问题。 endTransactionThreadPoolNums是事务消息二阶段处理线程大小,sendMessageThreadPoolNums 则指定一阶段处理线程池大小。如果二阶段的处理速度跟不上一阶段,就会造成二阶段消息丢失导致大量回查,所以建议 endTransactionThreadPoolNums 应该大于 sendMessageThreadPoolNums,建议至少 4 倍。 useReentrantLockWhenPutMessage 设置为 true(默认值是 false),以免线程抢锁出现严重的不公平,导致二阶段处理线程长时间抢不到锁。 transactionTimeOut 默认值 6 秒太短了,如果事务执行时间超过 6 秒,就可能导致消息丢失。建议改到 1 分钟左右。
分布式对账监控
发送成功 | 成功 |
刷盘超时 | |
Slave 超时 | |
Slave 不可用 | |
发送失败 | 具体错误码 |
收到消息 消息丢失(或超时未收到消息) 重复收到消息 消息生成到最终消费的时间差 ACK 生产者失败(由消费者打点)
性能优化
欢迎点赞+收藏+转发朋友圈素质三连