有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消息。
Consumer消费拉取的消息的方式有两种
1. Push方式:rocketmq已经提供了很全面的实现,consumer通过长轮询拉取消息后回调MessageListener接口实现完成消费,应用系统只要MessageListener完成业务逻辑即可
2. Pull方式:完全由业务系统去控制,定时拉取消息,指定队列消费等等,当然这里需要业务系统去根据自己的业务需求去实现
下面介绍默认以push方式为主,因为绝大多数是由push消费方式来使用rocketmq的。
consumer启动流程
指定group
订阅topic
注册消息监听处理器,当消息到来时消费消息
消费端Start
复制订阅关系
初始化rebalance变量
构建offsetStore消费进度存储对象
启动消费消息服务
向mqClientFactory注册本消费者
启动client端远程通信
启动定时任务
定时获取nameserver地址
定时从nameserver获取topic路由信息
定时清理下线的borker
定时向所有broker发送心跳信息,(包括订阅关系)
定时持久化Consumer消费进度(广播存储到本地,集群存储到Broker)
统计信息打点
动态调整消费线程池
启动拉消息服务PullMessageService
启动消费端负载均衡服务RebalanceService
从namesrv更新topic路由信息
向所有broker发送心跳信息,(包括订阅关系)
唤醒Rebalance服务线程