RocketMQ 消费模型&消费方式

612 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

消费模型

RocketMQ支持 广播消费和集群消费两种消费模式.

广播消费

在广播模型中, group下的每个消费者都会独立消费一次消息, 也就是说,一条投递的消息,最终会被每个消费者消费一次.

集群消费

集群模型中, group下的消费者需要参与rebalance, 对所有的queue进行分配, group每个consumer只消费分配到的queue.

  • 集群模型+有序消息: 每次rebalance 会有加锁、解锁操作.
  • 集群模型+无序消息: 消费失败需要重新投递

消费方式

PushConsumer 有两种 OrderlyConcurrently 两种消费方式。

并发消费

  1. 在并发消费方式下, 拉取到的消息会按照 batchSize 划分成多个批次, 投递到线程池进行并发调用,提高并发度.
  2. 除此之外, 并发消费还会将 消费超时的消息返回给broker, 设置延迟级别3, 就是10s延迟. 消费超时的默认开始15分钟.
  3. 在消费失败的场景下, 如果是集群消费,那么这条消费将会重新投递到broker的延迟队列中, 延迟级别+3, 也就意味着至少延迟10s.
  4. 延迟消息更多参考 RocketMQ延迟消息

有序消息

  1. 有序消费在每次 rebalance 结束后, 都会对自己持有的queue进行lock操作, 避免两个consumer同时消费一个queue的问题; 对自己不再持有的queue进行unlock操作, 让其他业务方使用.
  2. 在集群模式下, 有序消息会定期对 持有的queue进行加锁操作, 默认20s. 在关闭consumer的时候,会执行unlockAll的操作, 进行解锁.
  3. 集群模式下, 有序消息每次消费, 都需要检查是否持有锁, 以及锁过期情况,如果没有持有锁或者锁过期了, 就会触发一次加锁操作
  4. 有序消息只会进行本地的消费重试, 不会利用 broker的重试机制,超过最大重试次数之后, 就会投递到 dlq(死信队列)

总结

消费模型一共有两种,广播消费&集群消费,消费方式有并发消费&有顺序消费。