文章目录
  1. 1. Message Transport
  2. 2. 握手过程
  3. 3. 消息帧格式
  4. 4. Call格式
  5. 5. 参考

Avro除了用于序列化外,还可以作为一种RPC框架来使用。客户端希望同服务器端交互时,就需要交换双方通信的协议,它类似于模式,需要双方来定义,在Avro中被称为消息(Message)。通信双方都必须保持这种协议,以便于解析从对方发送过来的数据,这也就是传说中的握手阶段。

Message Transport

消息从客户端发送到服务器端需要经过传输层(Transport Layer),它发送消息并接收服务器端的响应。到达传输层的数据就是二进制数据。通常以HTTP作为传输模型,数据以POST方式发送到对方去。在 Avro中,它的消息被封装成为一组缓冲区(Buffer),类似于下图的模型:

如上图,每个缓冲区以四个字节开头,中间是多个字节的缓冲数据,最后以一个空缓冲区结尾。这种机制的好处在于,发送端在发送数据时可以很方便地组装不同数据源的数据,接收方也可以将数据存入不同的存储区。还有,当往缓冲区中写数据时,大对象可以独占一个缓冲区,而不是与其它小对象混合存放,便于接收方方便地读取大对象。

对象容器文件是Avro的数据存储的具体实现,数据交换则由RPC服务提供,与对象容器文件类似,数据交换也完全依赖Schema,所以与Hadoop目前的RPC不同,Avro在数据交换之前需要通过握手过程先交换Schema。

握手过程

握手的过程是确保Server和Client获得对方的Schema定义,从而使Server能够正确反序列化请求信息,Client能够正确反序列化响应信息。一般的,Server/Client会缓存最近使用到的一些协议格式,所以,大多数情况下,握手过程不需要交换整个Schema文本。

所有的RPC请求和响应处理都建立在已经完成握手的基础上。对于无状态的连接,所有的请求响应之前都附有一次握手过程;对于有状态的连接,一次握手完成,整个连接的生命期内都有效。

消息帧格式

消息从客户端发送到服务器端需要经过传输层,它发送请求并接收服务器端的响应。到达传输层的数据就是二进制数据。通常以HTTP作为传输模型,数据以POST方式发送到对方去。在 Avro中消息首先分帧后被封装成为一组缓冲区(Buffer)。

数据帧的格式如下:

  1. 一系列Buffer:

    4字节的Buffer长度
    Buffer字节数据
    
  2. 长度为0的Buffer结束数据帧

Call格式

一个调用由请求消息、结果响应消息或者错误消息组成。请求和响应包含可扩展的元数据,两种消息都按照之前提出的方法分帧。

调用的请求格式为:

  1. 请求元数据,一个类型值的映射。
  2. 消息名,一个Avro字符串。
  3. 消息参数。参数根据消息的请求定义序列化。

调用的响应格式为:

  1. 响应的元数据,一个类型值的映射。
  2. 一字节的错误标志位。
  3. 如果错误标志为false,响应消息,根据响应的模式序列化。如果错误标志位true,错误消息,根据消息的错误联合模式序列化。

参考

  1. Apache Avro™ 1.7.7 Specification
文章目录
  1. 1. Message Transport
  2. 2. 握手过程
  3. 3. 消息帧格式
  4. 4. Call格式
  5. 5. 参考