为什么 Pulsar 服务端突然不给客户端推送消息,部分/全部分区消费速度为0?
Pulsar 为了均衡不同 Topic 和不同客户端性能,会设置默认的 Topic 每个分区订阅的最大已接收未确认消息数量(unack 数量),默认 5000 可参考使用限制。观察订阅是否达到 unack 消息上限可观察订阅的 unack 消息指标是否达到配额上限。 当推送给某个分区的订阅下的所有 unack 消息( unack 消息指的是消息推送后,客户端没有进行 ack()/negativeAcknowledge()/reconsumeLater() 等操作确认消息)超过 5000 条时,服务端就不会继续推送给这个分区的订阅消费者继续推送消息。解决办法通常如下:
1. 需要先排查消息未确认是由于本身业务属于长耗时的业务,本身处理时间长造成较多消息未确认;还是由于业务代码存在某些逻辑异常时,在异常处理时没有将消息及时 ack,造成消息空洞。排查方式可以从 Topic 分区订阅中获取空洞消息的 msgId,之后在消息轨迹中查询消息内容和推送记录,具体介绍请参考空洞消息。 2. 如果消息属于长耗时业务,空洞消息属于正常情况时,由于消息已经达到最大已接收未确认消息数量(unack)上限,这时候需要业务进行消费者的水平扩容,来提高业务的消费能力。这个时候建议调小单个客户端的 ReceiverQueueSize 配置,建议值为 2500/消费者数量。
3. 如果分析空洞消息后,发现属于消费者业务代码某些场景漏 ack,需要在修复消费者 ack 相关逻辑代码发布新版本后,重启 unack 消息对应的消费者客户端,重启后服务端会自动重新推送 unack 的消息。