分析 rocketmq 如何通过长轮询的方式实现消息拉取
前言
rocketmq 消息消费采用 pull 方式实现, consumer 向 broker 发送请求以获取最新的消息。
如果 consumer 发送请求时 broker 并没有新消息, 那么消息拉取的请求可能大半是无用的, 浪费带宽和 CPU。
所以 rocketmq 的实现是使用长轮询的方式,当 borker 处理 PULL 请求时,如果没有新的消息, 它不返回数据给 consumer。 当有新的消息发到 broker 或过了轮询时间后,它才再查一次消息并返回结果给 consumer。
时序图如下
实现代码
consumer 端实现
consumer 端不需要特别处理
broker 端实现
拉取消息时,如果没消息就暂停处理
1 |
|
PullRequestHoldService 过一段时间后尝试拉消息
1 |
|
另外如果有新的消息, Message Store 会通过到 PullRequestHoldService,然后直接返回新消息给 consumer
1 |
|