一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情
消费模型
RocketMQ支持 广播消费和集群消费两种消费模式.
广播消费
在广播模型中, group下的每个消费者都会独立消费一次消息, 也就是说,一条投递的消息,最终会被每个消费者消费一次.
集群消费
集群模型中, group下的消费者需要参与rebalance, 对所有的queue进行分配, group每个consumer只消费分配到的queue.
- 集群模型+有序消息: 每次rebalance 会有加锁、解锁操作.
- 集群模型+无序消息: 消费失败需要重新投递
消费方式
PushConsumer 有两种 Orderly 和 Concurrently 两种消费方式。
并发消费
- 在并发消费方式下, 拉取到的消息会按照
batchSize划分成多个批次, 投递到线程池进行并发调用,提高并发度. - 除此之外, 并发消费还会将 消费超时的消息返回给
broker, 设置延迟级别3, 就是10s延迟. 消费超时的默认开始15分钟. - 在消费失败的场景下, 如果是集群消费,那么这条消费将会重新投递到
broker的延迟队列中, 延迟级别+3, 也就意味着至少延迟10s. - 延迟消息更多参考
RocketMQ延迟消息
有序消息
- 有序消费在每次
rebalance结束后, 都会对自己持有的queue进行lock操作, 避免两个consumer同时消费一个queue的问题; 对自己不再持有的queue进行unlock操作, 让其他业务方使用. - 在集群模式下, 有序消息会定期对 持有的
queue进行加锁操作, 默认20s. 在关闭consumer的时候,会执行unlockAll的操作, 进行解锁. - 集群模式下, 有序消息每次消费, 都需要检查是否持有锁, 以及锁过期情况,如果没有持有锁或者锁过期了, 就会触发一次加锁操作
- 有序消息只会进行本地的消费重试, 不会利用 broker的重试机制,超过最大重试次数之后, 就会投递到 dlq(死信队列)
总结
消费模型一共有两种,广播消费&集群消费,消费方式有并发消费&有顺序消费。