4

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

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

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

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

谢谢。

4

1 回答 1

4

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

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

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

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

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

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

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

于 2013-03-15T22:38:13.377 回答