你是否想知道一个分布式系统的网络传输解决方案,那你可以学习下RocketMQ的网络传输原理,从RocketMQ的Remoting网络处理部分,可以学习到如何进行高效的网络传输,这些思想可以应用到不同的业务中。
一、要解决的问题
其实大部分应用的网络处理都要解决如下图所示的问题:
那么就以RocketMQ的源码入手,看看它是如何架构如上的结构的。
二、RocketMQ-remoting详解
2.1首先给出其整体的结构图
2.2 编码解码
在RocketMQ中,所有的通讯都是使用RemotingCommand这个结构,这个结构的内容如下:private static final int RPC_TYPE = 0; // 0, REQUEST_COMMAND
// 1, RESPONSE_COMMAND
private static final int RPC_ONEWAY = 1; // 0, RPC
// 1, Oneway
/**
* Header 部分
*/
private int code; // 用于标示请求类型,参见RequestCode,ResponseCode
private LanguageCode language = LanguageCode.JAVA;
private int version = 0;
private int opaque = RequestId.getAndIncrement(); // 每个消息的唯一标志,request和response通过该字段匹配
private int flag = 0;
private String remark;
private HashMap<String, String> extFields; // 传输时使用,CommandCustomHeader转为该结构<key,value>后,再统一转为json传输。因此
CommandCustomHeader只能是String,Int,Long等基础数据结构,不能是复合数据结构
private transient CommandCustomHeader customHeader; // 业务逻辑中使用该结构,传输时,使用 extFields
/** * Body 部分 */private transient byte[] body;
2.2.1 RemotingCommand转为网络传输数据
在MQ中,所有数据传输都使用该数据结构进行数据传输,当把数据转为网络传输时,会将customHeader转为HashMap的extFields,再转为json串
2.2.2 传输格式: