RocketMQ 消费者(三) - Consumer端拉消息 (图解)
RocketMQ 消费者(三) - Consumer端拉消息 (图解)
1. 拉消息服务
与负载均衡服务一样, 消费者端拉消息的入口在 客户端实例中,为 PullMessageService 。
内部有几个关键点:
-
其内部维护了一个 阻塞任务队列
private final LinkedBlockingQueue<PullRequest> pullRequestQueue = new LinkedBlockingQueue<PullRequest>();
负载均衡服务 最终 构建的 PullReqeuset,都会放入该队列中。
-
启动入口
public void run() {
log.info(this.getServiceName() + " service started");
while (!this.isStopped()) {
try {
PullRequest pullRequest = this.pullRequestQueue.take();
this.pullMessage(pullRequest);
} catch (InterruptedException ignored) {
} catch (Exception e) {
log.error("Pull Message Service Run Method exception", e);
}
}
log.info(this.getServiceName() + " service end");
}
while 循环判读 拉消息服务的状态, 内部从阻塞队列中获取 拉消息请求任务PullReqeust,获取到后并执行。
2. 拉消息流程
上图为 消费者端 拉消息的 整个流程,其中关键步骤可以简单概括为以下几点:
- 校验 消费者端 和 该ProcessQueue队列信息的 状态。
- 对ProcessQueue 进行流控限制校验
- 创建 PullCallBack 拉消息回调, 接收处理Broker端返回的队列消息信息。
- 构建RemotingCommand 远程调用对象,并根据 推荐的 BrokerAddr 地址,向目标Broker发送远程过程调用请求。
万般皆下品,唯有读书高!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)