
4.1 Orleans数据传输协议
4.1.1 Orleans消息对象
Orleans将节点间通信载体定义为消息(Message),每条消息由消息头(Header)及消息体(Body)两部分组成。与HTTP消息类似,Orleans消息头中包含消息的基本属性、源节点地址及目标Silo地址等信息,而消息体中则包含此次消息所承载的数据内容。
1. 消息头
每一条Orleans消息都包含有一个消息头容器对象(Headers Container),其中包含了该条消息的基本路由信息(如消息类别、消息源地址及目标地址等)及状态数据(消息转发次数、消息投递上下文及相应状态等),消息头对象内的各字段定义如下所示。


在消息发送的序列化阶段,Orleans运行时将会根据消息头中各字段的值计算生成相应的消息头掩码(Head Mask),与消息头一同传输给消息接收方,消息接收方则会根据消息头掩码信息对消息头字节流中的数据进行依次解码和反序列化。消息头掩码的生成及使用如下所示。


2. 消息体
Orleans消息体实际承载着消息本身需要传递的数据内容,在Orleans集群中,消息体将以二进制数据流的形式在节点间通过TCP进行传递,并由Silo节点负责对消息体数据进行序列化及反序列化操作。Orleans消息体主要用于承载RPC请求(InvokeMethodRequest)及响应(Response)数据,其中,方法调用请求消息的消息体中承载了RPC请求的上下文信息,而方法调用相应消息的消息体中则包含了RPC请求的返回值或异常数据:


3. 消息传输格式
Orleans消息主要以二进制流的形式通过Orleans连接对象(Connection)进行传输,Orleans消息的二进制数据流的传输格式如图4-1所示。

•图4-1 Orleans消息传输格式
Orleans运行时在传输每一条消息时,将首先计算该消息的消息头对象及消息体对象的数据流长度(两个4 Byte的整形数值),并写入二进制数据流中,之后再依次写入消息头对象及消息体对象的二进制字节流编码;接收端在处理连接对象的入站信息流时,将首先解码前8 Byte的消息长度信息,再依次对消息头和消息头字节流对象进行解码和反序列化操作,并在本地内存中重建Orleans消息对象后,交由上层组件进行后续处理。