RocketMQ 顺序消息
RocketMQ 顺序消息
顺序消息的发送
发送顺序消息相比发送普通消息:
在配置文件中把默认异步发送改为同步发送
设置 Header 信息头,将消息固定发送给同一个消息队列
接收顺序消息相比接收普通消息:
把默认并发消费改为顺序消费
RockeMQ 顺序消息分为两种:
局部有序:发送同一队列的消息有序,可以在发送消息时指定队列,在消费消息时按顺序消费。例如同一订单 ID 的消费要保证有序,不同订单 ID 的消费互不影响,并行处理
全局有序:设置 Topic 只有一个队列实现全局有序,创建 Topic 时手动设置,这种性能差不推荐使用
RocketMQ 消息发送三种方式:同步、异步、单向。
同步:发送网络请求后会同步等待 Broker 服务器的返回结果,支持发送失败重试
异步:异步发送网络请求,不会阻塞当前线程,不支持失败重试
单向:原理与异步一致,不支持回调
顺序消息发送原理很简单,同一类消息发送到相同队列即可。为了保证先发送的消息先存储到消息队列,必须使用同步发送的方式
RocketMQTemplate 的 syncSend()方法:
MessageQueueSelector 的实现类 SelectMessageQueueByHash
根据 hashKey 计算 hash 值
然后用 hash 值和队列大小取模,得到一个索引值,结果小于队列值
根据索引值从队列列表中取出一个队列,hash 值相同则队列相同
普通消息的发送
普通消息有两种机制:轮询和故障规避机制
轮询原理就是路由信息 TopicPublishInfo 维护一个计数器 sendWhichQueue,每发送一次消息需要查询一次路由,计数器就进行+1,通过计数器的值 inde 与队列的数量取模计算出实现轮询算法。
轮询算法可能轮询选择的队列在宕机的 Broker 上,导致消息发送失败,于是就有了鼓掌规避机制
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/b9bad9ad0e134490211b773ea】。文章转载请联系作者。
评论