节俭双向消息传递

时间:2013-03-15 18:07:45

标签: thrift

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

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

根据我的经验,Thrift相当模块化 - 为您提供一个完整的堆栈,可以处理RPC,套接字通信,数据序列化以及基本上任何内容。

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

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

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

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

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