RocketMQ底层通信机制

程序员突破成长的好伙伴

连接技术 接力价值

本文为杨开元先生投稿至中生代技术(ID:freshmanTechnology),未经原作者允许,不得转载。

责编| 姜新城

第 714篇技术好文:4350字 |11分钟阅读

分布式系统各个角色间的通信效率很关键,通信效率的高低直接影响系统性能,基于Socket实现一个高效的Tcp通信协议是个很有挑战的事情,本节说明RocketMQ是如何解决这个问题的

01

Remoting模块

_____

RocketMQ的通信相关代码在Remoting模块里,先来看看主要类结构。

图1-1Remoting模块的类继承关系

RemotingService为最上层接口,定义了三个方法:

void start();

void shutdown();

void registerRPCHook(RPCHookrpcHook);

RemotingClient,RemotingServer继承RemotingService接口,并增加了自己特有的方法。

代码清单1-1RemotingClient主要函数定义

然后看看具体的实现类,NettyRemotingClient和NettyRemotingServer分别实现了RemotingClient和RemotingServer,而且都继承了NettyRemotingAbstract类.

通过上面的封装,RocketMQ各个模块间的通信,可以通过发送统一格式的自定义消息(RemotingCommand)来完成的,各个模块间的通信实现简洁明了。

比如NameServer模块中,NameServerController有个remotingServer变量,NameServer在启动时初始化好各个变量,然后启动remotingServer即可,剩下NameServer要做的是专心实现好处理RemotingCommand的逻辑。

代码清单1-2NameServer处理主流程代码

在Consumer的源码中,获取消息的底层的通信部分也是发送一个RemotingComand请求,返回的response也是个RemotingCommand类型。

代码清单1-3Consumer请求消息底层实现代码

从源码中可以看出,RocketMQ中复杂的通信过程,被RemotingCommand统一起来,大部分的逻辑都是通过发送Command,接受并处理Command完成。

02

协议设计和编解码

_____

RocketMQ自己定义了一个通信协议,使得模块间传输的二进制消息和有意义的内容之间互相转换。协议格式如图1-2所示。

图1-2RocketMQ的通信协议

(1)第一部分是大端4个字节整数,值等于第二,三,四部分长度总和

(2)第二部分是大端4个字节整数,值等于第三部分的长度

(3)第三部分是通过json序列化的数据

(4)第四部分是通过应用自定义二进制序列化的数据

消息的解码过程在RomotingCommand的decode函数里。

代码清单1-4消息解码函数

对应的消息编码过程在RemotingCommand的encode函数中。

代码清单1-5消息编码函数

03

Netty库

_____

RocketMQ是基于Netty库来完成RemotingServer和RemotingClient具体的通信实现的,Netty是个事件驱动的网络编程框架,它屏蔽了Java Socket,Nio等复杂细节,用户只需用好Netty,就可以实现一个网络编程专家+并发编程专家水平的Server、Client网络程序。应用Netty有一定的门槛,需要了解它的EventLoopGroup,Channel,Handler模型以及各种具体的配置。RocketMQ利用Netty实现的通信类是NettyRemotingServer和NettyRemotingClient,用户也可以参考这两个类的实现来学习使用Netty。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180622G08MIW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券