RocketMO未真正实现消息推模式,而是消费者主动向消息服务器拉取消息,RocketMQ推模式是循环向消息服务端发起消息拉取请求,如果消息消费者向RocketMQ拉取消息时,消息未到达消费队列时,如果不启用长轮询机制,则会在服务端等待shortPolingTimeMils时间后(挂起)再去判断消息是否已经到达指定消息队列,如果消息仍未到达则提示拉取消息客户端PULL-NOT-FOUND(消息不存在); 如果开启长轮询模式,RocketMQ一方面会每隔5s轮询检查一次消息是否可达,同时一有消息达到后立马通知挂起线程再次验证消息是否是自己感兴趣的消息,如果是则从Commitlog文件中提取消息返回给消息拉取客户端,否则直到挂起超时,超时时间由消息拉取方在消息拉取是封装在请求参数中,PUSH模式为15S,PULL模式通过DefaultMQPulConsumer#setBrokersuspendMaxTimeMilis设置。RocketMQ通过在Broker客户端配置longPolingEnable为true来开启长轮询模式。
一、消息长轮询机制
org.apache.rocketmq.broker.processor.PullMessageProcessor:processRequest
case ResponseCode.PULL_NOT_FOUND:
if (brok