发布订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都将得到通知。
RocketMQ的消息订阅分为两种模式:
- Push模式(MQPullConsumer): Broker 主动向消费者推送。
- Pull模式(MQPushConsumer): 消费者在需要消息时,主动到Broker拉取。
但是,在RocketMQ中,具体实现时,Push和Pull模式都是采用消费端主动从Broker拉取消息。
RocketMQ订阅模式实现原理
- Push(推模式)
- Pull(拉模式)
Pull方式里,取消息的过程需要用户自己写。
首先通过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合。
然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要去的开始offset(__consumer_offset),直到取完了,再换另一个MessageQueue。
定时消息
定时消息是指消息发送到Broker后,不能立刻被Consumer消费,要到特定的时间或者等待特定的时间后才能被消费。
如果要支持任意的时间精度,在Broker层面,必须要做消息排序,如果再涉及到持久化,那么消息排序要不可避免的产生巨大性能开销。
RocketMQ支持定时消息,但是不支持任意时间精度,支持特定的Level,例如定时5s,10s,1m等。
Broker定时消息发送逻辑