RocketMQ 生产端发送完消息,为什么消费端注解监听:RocketMQMessageListener 延时特别长

前言

谁用谁知道

方案实现:

这是一个比较常见的问题。RocketMQ 消息消费端监听新消息的延迟,主要有以下几个原因:

  1. 消费线程模型选择:如果选择 Pull 消费模型,消费端需要主动向 Broker 拉取新消息,会产生一定的延迟。Push 模型消费的延迟会小一些。
  2. 消费策略选择:如果选择集群消费,需要等待其他消费实例获取消息后才会触发监听,产生一定延迟。广播模式的延迟会低一些。
  3. 心跳与重平衡:消费端需要定期发送心跳包到 Broker,以及在 Broker 发起重平衡时重新获取分配的队列与消息,这也会带来少量延迟。
  4. Broker刷盘间隔:Broker 接收到新消息后,需要刷盘存储后消费端才能获取到。不同的刷盘间隔也会带来不同程度的延迟。
  5. 网络延迟:消费端获取新消息需要通过网络 Request Broker 获取,网络延迟也是产生监听延迟的因素之一。
    除此之外,消费端实际业务处理消息的速度也会影响新消息监听的延迟。如果消费太慢,将导致消息堆积,进一步加大延迟。
    那么,如何减小消息监听延迟呢?主要有以下优化手段:
  6. 选择 Push 消费模式和广播消费策略,这可以减小等待时间产生的延迟。
  7. 监听线程与消费线程分离,单独线程循环监听新消息,然后丢给消费线程处理,避免消费慢而影响监听。
  8. 合理控制消费速度,避免消费堆积导致Connector长时间无法监听新消息。
  9. 优化心跳和重平衡机制,减小完成心跳重平衡造成的延迟。
  10. 选择Broker刷盘间隔更短的配置,加快消息刷盘速度。
  11. 本地缓存元数据信息,避免每次都Request Broker获取元数据而增加延迟。
  12. 使用长连接并设置更短的网络超时时间,减小网络延迟的影响。

选择 Push 模式和广播消费策略的 Java 消费端代码实现如下:

 

猜你喜欢

转载自blog.csdn.net/qq_32370913/article/details/130485869