消息中间件(四):Rocket顺序消息之最佳实践

点击上方“程序员小明”,选择“星标”

今晚可以不加班!

顺序消息

顺序消息缺陷

发送顺序消息无法利用集群Fail Over特性消费,顺序消息的并行度依赖于队列数量,存在队列热点问题,个别队列由于哈希不均导致消息过多,消费速度跟不上,产生消息堆积问题遇到消息失败的消息,无法跳过,当前队列消费暂停。

原理

produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一个线程去消费消息。queue),不是同一个topic,默认情况下一个topic包括4个queue

扩展

可以通过实现发送消息的队列选择器方法,实现部分顺序消息。binlog,将表名作为队列选择器的参数,这样就可以保证每个表的数据到同一个队列里面,从而保证表数据的顺序消费。

最佳实践

Producer

  • TopicTopic,消息子类型用tags来标识,tags可以由应用自由设置。只有发送消息设置了tags,消费方在订阅消息时,才可以利用tagsbroker做消息过滤。

  • keykeys 字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过 topic,key来查询这条消息内容,以及消息被谁消费。由于是哈希索引,请务必保证key 尽可能唯一,这样可以避免潜在的哈希冲突。

//订单Id
String orderId= "20034568923546";
message.setKeys(orderId);

  • 日志send resultkey 字段。

  • sendsend消息方法,只要不抛异常,就代表发送成功。但是发送成功会有多个状态,在sendResult里定义。SEND_OK:消息发送成功FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到Slave时超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失SLAVE_NOT_AVAILABLE:消息发送成功,但是此时slave不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失

Consumer

  • 幂等At Least Once,所以consumer可能多次收到同一个消息,此时务必做好幂等。

  • 日志

  • 批量消费

参考资料

分布式开放消息系统(RocketMQ)的原理与实践

往期推荐


长按二维码关注小明

              今晚可以不加班!

640?wx_fmt=jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值