RocketMQ之消费者获取消息的两种模式

 

Push&Pull

 

push:客户端与服务器建立连接后,当服务器有消息时,服务器将消息推送到客户端

pull:客户端不断轮询请求服务端,来获取新的消息

 

 

RocketMQ中的Push&Pull

 

RocketMQ中都是采取消费端主动拉取的方式,即consumer轮询从broker中拉取消息。原因是服务器如果主动给客户端推送消息的话,当客户端足够多,服务器端的压力会无限制的增大,因此RocketMQ在实现时摒弃了这种办法。

RocketMQ中Push和Pull的含义:

  •  Push

consumer把轮询过程封装了,并注册到MessageListener监听器中,对于offset进行自动保存。取到消息后,唤醒MessageListener的consumeMessage()来消费,这种触发方法才会被调用的方式对用户而言感觉就像是被推送过来。

  • Pull

这种方法非常少用,它在取消息的过程中需要用户自己手动操作。首先在要消费的Topic中拿到MessageQueue的集合,遍历MessageQueue集合,然后针对每一个MessageQueue批量取消息,每取完一次,记录该队列下一次要取的开始offset,直到取完一整个MessageQueue,再换另一个MessageQueue。

 

 

长轮询

 

既然RocketMQ本质上是Pull方式拉取消息,那它是如何保证消息实时性的呢? 长轮询

长轮询是指请求的过程中,若是服务器端数据并没有更新,那么则将这个连接挂起,直到服务器端推送新的数据再返回,然后进入循环周期。

客户端像传统轮询一样从服务端请求数据,服务端会阻塞请求,而不会立刻返回,直到有数据或超时才返回给客户端,然后关闭连接,客户端处理完响应信息后再向服务器发起新的请求。

RocketMQ之消费者获取消息的两种模式_第1张图片

 

 

你可能感兴趣的:([RocketMQ])