1 什么是 Pop 消费
RocketMQ 5.0 中引入了一种新的消费模式:Pop 消费模式。
我们知道 RocketMQ 原来有两种消费模式:Pull 模式消费和 Push 模式消费,其中 Push 模式指的是 Broker 将消息主动“推送”给消费者,它的背后其实是消费者在不断地 Pull 消息来实现类似于 Broker “推”消息给消费者的效果。
新引入的 Pop 消费模式主要是用于 Push 消费时将拉消息的动作替换成 Pop 。Pop 消费的行为和 Pull 消费很像,区别在于 Pop 消费的重平衡是在 Broker 端做的,而之前的 Pull 和 Push 消费都是由客户端完成重平衡。
2 POP消费流程
- 向 Broker 端发送请求,切换消息拉取模式为 Pop 模式
- 重平衡服务执行重平衡,此时已经切换为 Pop 模式,所以是向 Broker 端发起请求,请求中带有重平衡策略,Broker 会返回重平衡的结果。
- 重平衡完毕之后开始拉取消息,拉取消息服务发送
POP_MESSAGE
请求给 Broker,获取一批消息 - 消费这批消息
- 对成功消费的消息,发送 ACK 请求给 Broker
- 服务端收到 Pop 请求后,会先在 Queue 维度上加锁,保证同一时间只有一个消费者可以拉取该队列的消息。
- 随后服务端会在存储中查询一批消息,将这批消息的构建的
CheckPoint
保存在 Broker 中,以便与 ACK 的消息匹配。 CheckPoint
会先被保存在内存中,一般来说消息消费很快,所以在内存中就能够与 ACK 消息匹配成功后删除。如果在一段时间(默认 3s)内没有匹配成功,它将会从内存中被删除,转入磁盘等待匹配。- 对于 ACK 消息也一样,它先被放入内存中匹配,如果在内存中找不到对应的
CheckPoint
,也会放入磁盘。
CheckPoint
的存在目的是与 ACK 的消息匹配,并将没有匹配的消息重试。
CheckPoint
的 ReviveTime
就是它这批消息需要被尝试重试(唤醒)的时间。
3.POP消费解决什么问题
1.消费端不对等问题,
2.重平衡造成堆积问题
3.消费端数量大于队列数问题