一、总览
Rocketmq的客户端包括Producer和Consumer,这2个部分。虽然两个部分的细节不同,但在发送消息,维持broker/namesrv连接,等方面有着相同的处理方式,可以对二者统一进行管理。
让我们自己先思考下,一个client需要完成哪些内容:
- 获取namesrv的地址
- 与namesrv交互,获取broker的地址以及TopicRouteData
- 管理进程中所有的producer和consumer
- 与broker/namesrv如何交互,长链接or短链接
- pull消息
- send消息
- 负载均衡
这里来对应rocketmq分析一下他是如何实现上述功能的:
1. PullAPIWrapper:主要用于上述5,pull消息,以及接收到消息之后的tags过滤;
2. RebalanceImpl:用于上述的7,负载均衡;
3. MQClientInstance:
A. MQClientAPIImpl:真实的调用remotingserver进行消息的发送和接收,涉及到与broker,namesrv,的各类交互,通讯实现的包裹类;
B. PullMessageService:这个应该只有在consumer push模式使用,因为push其实是后台包装了一个不断pull的请求实现的,所以会把pullrequest放入pullRequestQueue中,不断的消费拉取执行;
C. RebalanceService:负载均衡策略,对所有的consumer调用doRebalance()进行mq与consumer的重分配;
D. DefaultMQProducerImpl:产生一个CLIENT_INNER_PRODUCER,在消息消费失败的时候重新放入mq中;
设计细节
- MQClientManager:单例类,用于管理MQClientInstance,详见