【RocketMQ每日一问】RocketMQ5.0POP消费模式如何实现的?

1 什么是 Pop 消费

RocketMQ 5.0 中引入了一种新的消费模式:Pop 消费模式。

我们知道 RocketMQ 原来有两种消费模式:Pull 模式消费和 Push 模式消费,其中 Push 模式指的是 Broker 将消息主动“推送”给消费者,它的背后其实是消费者在不断地 Pull 消息来实现类似于 Broker “推”消息给消费者的效果。

新引入的 Pop 消费模式主要是用于 Push 消费时将拉消息的动作替换成 Pop 。Pop 消费的行为和 Pull 消费很像,区别在于 Pop 消费的重平衡是在 Broker 端做的,而之前的 Pull 和 Push 消费都是由客户端完成重平衡。

2 POP消费流程

  1. 向 Broker 端发送请求,切换消息拉取模式为 Pop 模式
  2. 重平衡服务执行重平衡,此时已经切换为 Pop 模式,所以是向 Broker 端发起请求,请求中带有重平衡策略,Broker 会返回重平衡的结果。
  3. 重平衡完毕之后开始拉取消息,拉取消息服务发送 POP_MESSAGE 请求给 Broker,获取一批消息
  4. 消费这批消息

【RocketMQ每日一问】RocketMQ5.0POP消费模式如何实现的?_第1张图片

  1. 对成功消费的消息,发送 ACK 请求给 Broker
  2. 服务端收到 Pop 请求后,会先在 Queue 维度上加锁,保证同一时间只有一个消费者可以拉取该队列的消息。
  3. 随后服务端会在存储中查询一批消息,将这批消息的构建的 CheckPoint 保存在 Broker 中,以便与 ACK 的消息匹配。
  4. CheckPoint会先被保存在内存中,一般来说消息消费很快,所以在内存中就能够与 ACK 消息匹配成功后删除。如果在一段时间(默认 3s)内没有匹配成功,它将会从内存中被删除,转入磁盘等待匹配。
  5. 对于 ACK 消息也一样,它先被放入内存中匹配,如果在内存中找不到对应的 CheckPoint,也会放入磁盘。

【RocketMQ每日一问】RocketMQ5.0POP消费模式如何实现的?_第2张图片

CheckPoint 的存在目的是与 ACK 的消息匹配,并将没有匹配的消息重试。

CheckPoint 的 ReviveTime 就是它这批消息需要被尝试重试(唤醒)的时间。

3.POP消费解决什么问题

1.消费端不对等问题,

2.重平衡造成堆积问题

3.消费端数量大于队列数问题

你可能感兴趣的:(RocketMQ每日一问,java-rocketmq,rocketmq,java)