一、消息发送分类
- 同步消息:
- 异步消息:
- 单向发送消息:不等待Broker返回ACK,效率高,可靠性低。
代码示例:
- 同步生产者: https://gitee.com/anilnak/rocket-mq/tree/dev/1.0.0
- 异步生产者: https://gitee.com/anilnak/rocket-mq/tree/dev/2.0.0
- 单向发送消息: https://gitee.com/anilnak/rocket-mq/tree/dev%2F3.0.0/
- 消费者消费消息实例代码: https://gitee.com/anilnak/rocket-mq/tree/dev%2F4.0.0/
二、顺序消息
严格按照消息的发送顺序进行消费(FIFO)。
正常情况下生产者将消息发送到不同Queue,如果消息仅发送到同一个Queue,消费时也从这一个Queue中拉取消息,保证了消息的顺序性。
策略:将相同业务标识的消息放在同一个队列中,通过一定策略(例如一个线程独立处理一个queue)保证消费的顺序性。
有序性分类:全局有序、分区有序
1)全局有序:整个topic只有一个queue
设置queue数量:在可视化控制台中手动创建topic时指定、写代码时方法设置、使用mqadmin命令手动创建
2)分区有序:保证在该Queue分区队列上的顺序。
如何实现Queue的选择:在定义producer时可以指定消息队列选择器,选择器自己实现了MessageQueueSelector接口定义,定义选择器的选择算法时,需要使用选择key,选择key可以是消息key,也可以是其他key,只要唯一就可以。
一般性选择算法:选择key(或其hash值)与Topic所包含的Queue数量取模,结果为选择key的queueId。
取模算法问题:不同选择key与Queue数量取模结果可能会相同。解决:使用消息key。
代码示例: https://gitee.com/anilnak/rocket-mq/tree/dev%2F5.0.0/
三、延迟消息
消息写入到broker后,指定时长再消费,可以实现定时任务,无需使用定时器。例如订单支付超时取消订单。
延迟等级:不支持随意时长延迟,需要特定的延迟等级来指定。延迟等级在RocketMQ的MessageStoreConfig中 。
等级为3则延长10s。
如果需要自定义的延时等级,可以通过broker加载的配置中增加。
投递时间 = 消息存储时间 + 延迟时间
代码示例: https://gitee.com/anilnak/rocket-mq/tree/dev/6.0.0