RocketMQ客户端所有与NameServer和Broker的通讯都是通过MQClientAPIImpl完成的。
MQClientAPIImpl包含一个NettyRemotingClient,使用netty实现。
在启动MQClientAPIImpl时,会启动NettyRemotintClient,设置通讯时的线程池以及pipeline。
pipeline
- NettyEncoder
- NettyDecoder
NettyEncoder和NettyDecoder主要负责二进制数据与RemotingCommand的互相转换,客户端会将所有请求和响应组装成RemotingCommand,然后通过encoder和decoder来编解码。 - IdleStateHandler
- NettyConnectManageHandler
- NettyClientHandler
NettyClientHandler负责了主要的业务逻辑,对接收到消息进行业务处理。
invokeSync
当需要同步发送消息时,会调用NettyRemotinClient的invokeSync方法,主要看四个步骤。
-
this.getAndCreateChannel(addr)
此步会获取通讯使用的channel。
(1)如果是与nameServer通讯,此处不会指定addr,而是从原子引用namesrvAddrChoosed中获取,namesrvAddrChoosed初始为null,第一次使用时会随机选取一个,不可用之后,会选用nameServer列表中的下一个。