【问题标题】:Thrift for Bidirectional Messaging双向消息传递的 Thrift
【发布时间】:2013-03-04 13:48:45
【问题描述】:

我很好奇 Thrift 是否适合我的用例?我正在制作另一个消息传递系统,其中有客户端和服务器,但客户端和服务器都向对方发起请求消息,并非所有消息都是请求,只是通知。

回到 10 年前,我使用基于二进制的手动编解码器进行了此操作。回到 5 年前,我使用 Google 协议缓冲区再次做到了这一点。但我现在听到更多关于 Thrift 的消息。

Thrift 可以简单地用作编解码器,还是真的围绕请求/回复模式构建?我需要保持与传输无关,因为我将使用自定义消息总线、websockets 和可能的 zeromq。

我也在考虑消息包和协议缓冲区,因为我知道它们确实很适合非请求/回复消息传递模式。

谢谢。

【问题讨论】:

    标签: thrift


    【解决方案1】:

    我只与 C++ 版本的 Thrift 密切合作,所以这个答案是基于此 - 其他语言可能也是如此,它可能不是。

    不过,根据我的经验,Thrift 是相当模块化的 - 为您提供了一个完整的堆栈,可以处理 RPC、套接字通信、数据序列化以及基本上介于两者之间的任何事情。

    您首先在 Thrift IDL 文件中指定数据结构和服务,其方式类似于在类中指定成员变量(对于数据结构)和成员函数(对于服务)(在 C++/ Java/等)。您使用 Thrift 编译器编译这些以生成特定于语言的源文件,然后您可以在您的应用程序中实现这些源文件。

    如果您使用完整的堆栈,那么只需创建必要的对象(服务器、协议、传输等)并打开客户端和服务器之间的连接(服务器实现 IDL 指定的功能) )。然后客户端可以调用服务器上的函数,就像服务器是一个本地对象一样,使用自定义的数据结构(或只是一些标准的 Thrift 数据类型)作为参数和返回值。

    这些函数默认是阻塞的,也就是说,它们在返回之前需要服务器的回答。但是,您也可以将函数指定为 oneway(只要它们返回 void),在这种情况下,您只需发送函数调用,然后立即继续。

    但是,所有这一切都只有在您使用完整的 Thrift 堆栈时才会出现。您通过实例化各种对象(协议、传输、处理程序、服务器等)来创建您的客户端和服务器,虽然我自己从未尝试过,但我不明白为什么您不能创建一个例如传输的派生实现,然后使用它而不是 Thrifts 自己的传输。

    如果您只想使用 Thrift 以跨平台的方式定义数据结构,您也可以这样做,然后使用 Thrift 序列化这些(忽略堆栈的其余部分和 RPC-stuff),然后通过您自己的传输将这些作为二进制数据发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多