我很好奇 Thrift 是否适合我的用例?我正在制作另一个消息系统,其中有客户端和服务器,但客户端和服务器都向对方发起请求消息,并且并非所有消息都可能是请求,而只是通知。
回到 10 年前,我使用手动二进制编解码器完成了这项工作。回到 5 年前,我使用 Google Protocol buffers 再次做到了这一点。但我现在听到更多关于 Thrift 的消息。
Thrift 可以简单地用作编解码器,还是真的围绕请求/回复模式构建?我需要保持与传输无关,因为我将使用自定义消息传递总线、Websockets 和可能的 ZeroMQ。
我还在考虑消息包和协议缓冲区,因为我知道它们确实非常适合非请求/回复消息传递模式。
Thanks.
我只与 Thrift 的 C++ 版本密切合作,所以这个答案是基于此 - 对于其他语言来说可能也是如此,也可能不是。
但根据我的经验,Thrift 相当模块化 - 为您提供了一个完整的堆栈,可以处理 RPC、套接字通信、数据序列化以及基本上介于两者之间的任何内容。
首先在 Thrift IDL 文件中指定数据结构和服务,其方式类似于在类(C++/Java/等中)中指定成员变量(对于数据结构)和成员函数(对于服务) .)。您可以使用 Thrift 编译器编译这些文件以生成特定于语言的源文件,然后可以在应用程序中实现这些文件。
如果您使用完整的堆栈,那么只需创建必要的对象(服务器、协议、传输等)并打开客户端和服务器之间的连接(其中服务器实现 IDL 指定的功能)即可。然后,客户端可以使用自定义数据结构(或只是一些标准 Thrift 数据类型)作为参数和返回值来调用服务器上的函数,就像服务器是本地对象一样。
默认情况下,这些函数是阻塞的,也就是说,它们在返回之前需要服务器的答复。但是,您也可以将函数指定为oneway
(只要他们回来void
),在这种情况下,您只需发送函数调用,然后立即继续。
然而,这一切仅适用于使用完整 Thrift 堆栈的情况。您通过实例化各种对象(协议、传输、处理程序、服务器等)来创建客户端和服务器,尽管我自己从未尝试过,但我不明白为什么您不应该能够创建一个例如传输的派生实现,然后使用它代替 Thrifts 自己的传输。
如果您只想使用 Thrift 以跨平台方式定义数据结构,您也可以这样做,然后使用 Thrift 序列化这些数据结构(忽略堆栈的其余部分和 RPC 内容),然后将它们发送为通过您自己的传输的二进制数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)