使用 Thrift 发送二进制数据的最佳方式

Posted

技术标签:

【中文标题】使用 Thrift 发送二进制数据的最佳方式【英文标题】:Best way to send binary data with Thrift 【发布时间】:2012-12-14 09:50:49 【问题描述】:

我在 c++ 中有一个结构,它存储这样的字节:

struct RemoteData 

    /// some other fields here

    unsigned char* buf;
    int bufLen;     
;

我需要通过 Thrift 将这些数据发送到用 C++ 编写的远程服务。我找到了三种将这个结构映射到 thrift idl 的方法:

    像这样使用容器类型:

    struct RemoteData 
    
        1: list<BYTE> buf,
        ...
    
    

    使用binary 输入:

    struct RemoteData 
    
        1: binary buf,
        ...
    
    

    string类型中存储数据:

    struct RemoteData 
    
        1: string buf,
        ...
    
    

最好的方法是什么?

【问题讨论】:

【参考方案1】:

thrift string 类型中包含的值必须是 UTF8 编码的,否则某些客户端将无法读取它(例如 Java thrift 客户端)。

Thrift list&lt;byte&gt; 类型在 c++ 中会被转换成 std::vector&lt;int8_t&gt;,但在其他语言中就不是那么好了(例如在 java 中它会被编译成次优的 List&lt;Byte&gt;

binary 类型在与其他语言客户端的互操作性和协议定义的正确性方面是最佳选择。

由于所有 3 种定义产生的消息大小大致相同,我会选择 binary:即使您现在不需要与其他语言的互操作性,将来也可能需要它。

【讨论】:

但是在 thrift 文档thrift.apache.org/docs/types 中写了关于二进制类型“注:这是目前上述字符串类型的一种特殊形式,添加以提供与 Java 更好的互操作性。当前的记录计划是在某个时候将其提升为基本类型。” @DanilaNV 这个文档可能已经过时了:Thrift 二进制类型和其他类型一样稳定、方便和广泛使用,所以我不明白它为什么不在基本类型列表中。

以上是关于使用 Thrift 发送二进制数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

将 Blob 数据类型存储在 Hive 表中的最佳方式是字符串还是二进制?

thrift的TCompactProtocol紧凑型二进制协议分析

通过 IPC 从 C 向 Python 发送二进制数据

Thrift的TCompactProtocol紧凑型二进制协议分析

使用bender对thrift接口进行压测

存储二进制或图像文件的最佳方式