RecursiveFrog 发表于 2021-10-9 18:21

全 Python 项目,使用 Protobuf / Thrift适合吗?

我现在在做一个全 Python 的集群项目,用的 xmlrpc 去做各服务通信。但是xmlrpc的使用太恶心,而且异常全部转换成了xmlrpc的Fault类型。很不好转换,所以想吧我们的通信库换一下。但是其他人说,又不是跨语言,没必要用到这些东西,简单就行。
各位怎么看呢?

kyuskoj 发表于 2021-10-9 18:28

protobuf只是一种serialization的协议,thrift才是一个完整的服务级别的rpc协议(最近grpc也开源了,基本等于Google的thrift,最近准备在go里面玩玩儿)

其实用Thrift省事儿多了,thrift文件作为一个service model是语言无关的,而且可以同时生成server和client,还自带type check。定义好接口,就可以专心去实现业务逻辑了。

RedZero9 发表于 2021-10-9 18:36

现在 RPC 通信框架里比较成熟的就是 Thrift 了,是用C++实现的,我呆了两家互联网公司,都用这个。最早是 Facebook 写的,国内的话规模比较大的据我所知百度也在用。有个传言的八卦是 protobuffer 是早期在 Google 内部流行的,后来有员工跳槽到了 Facebook 才有了 Thrift。

Thrift 的 RPC 框架中像 block, nonblock 的功能都有了,protobuf 好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。 所以你说要我来做抉择,肯定是上 Thrift。

况且,Thrift 一点也不复杂,定义一个传输接口的配置文件就完事了,后面的事情 Thrift 一条龙服务。

APSchmidt 发表于 2021-10-9 18:36

早些年仔细研究过protobuf和thrift,并分别分享过。

ProtoBuf开发者指南:
http://gashero.yeax.com/?p=108
在较长时期都是国内最全的一份翻译。

thrift也做过一份1万来字的文档,但并没有公布。

这两种序列化技术我都在实际项目中用过,2010年前后。在这之后就没有再用。

从序列化的角度,两者相似程度很高,效率方面也都是顶级的水平,无论是存储效率还是压缩/解包效率。

至于RPC方面,截至到2010年,protobuf没有官方的方案,thrift的则是线程池实现,经常卡死,很烂。所以至少那个时代,两者用做RPC都不靠谱。

最关键的问题来自如下几点:

1、难于调试:都是二进制协议,序列化后的内容不可读
2、安装繁琐恶心:都要安装很久,编译一堆东西
3、对多语言支持有限:最近几年新语言出的太快了
4、对WEB不友好:js没有原生支持

所以,逐渐就不用了。现在遇到类似的需求都是用HTTP里面封装JSON的。所以调用的请求用form提交,这样用网页上的表单就能模拟。返回的是一个dict,其中errnum表示错误码,0为成功。errmsg为错误信息,方便客户端调试。result为实际返回的数据。

这样的方式调试方便,兼容性好。虽然慢了不少,但其实人的效率更重要。

另外,年轻人要小心overdesign,也许你的应用终生都不会有大的性能压力。

Doris232 发表于 2021-10-9 18:45

你知道Thrift发布多少年了,至今版本号仍然只是 0.9.2 吗?

老夫作为国内第一批吃螃蟹的,有半年基本上天天在帮别人解决thrift bug问题...后来果断弃坑,加入微软WCF大军。

量子计算9 发表于 2021-10-9 18:54

Thrift是我来现在的这家互联网公司,开始接触的,2007年Facebook发起的项目。
主要是用在后端 internal services,所在互联网公司,thrift是后端服务RPC通信的基础。对题主所在的项目应该是足够的。

同样也是基于python构建的主要后端服务,框架组开源了下面的对thrift封装的库,比较方便的构建服务和客户端的接入。
eleme/thriftpy · GitHub

定义如下pingpong.thrift
service PingPong {
    string ping(),
}
1.构建server
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")

from thriftpy.rpc import make_server

class Dispatcher(object):
    def ping(self):
      return "pong"

server = make_server(pingpong_thrift.PingPong, Dispatcher(), '127.0.0.1', 6000)
server.serve()

2. client接入
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")

from thriftpy.rpc import make_client

client = make_client(pingpong_thrift.PingPong, '127.0.0.1', 6000)
client.ping()


PS:
微服务
主流互联网公司的后端,现在都转微服务的架构,量级各有不同。

现成的轮子
mfornos/awesome-microservices · GitHub

JamesB 发表于 2021-10-9 19:00

我们用c++写thrift服务端,python写thrift接口客户端,在一个核心平台上使用,效果挺好。

DomDomm 发表于 2021-10-9 19:06

有人用zeroc ice吗?

Baste 发表于 2021-10-9 19:14

首先指正下protocolbuffer仅仅是一个序列化和反序列化的协议,我觉得你可能想用grpc或者thrift来替换你们当前使用的xmlrpc。
grpc是出自大厂谷歌,持续维护和开发中,基于protocolbuffer进行序列化和反序列化,性能高有各路人士进行过对比,目前已经有1.0版本,基于http2进行数据传输,支持同步和异步两种模式,性能在各种优化中,有使用C++重写部分逻辑,不过grpc应该只支持python2,另外就是protocolbuffer目前支持的数据类型可能不如thrift完善,不过开发普通场景的应用绝对没有啥问题。
另thrift是出自Facebook,已经有好多年了积累了,由于这货出生早所以很多早期的应用都有使用thrift,据说早年也是Google的员工离职到Facebook后才基于谷歌的rpc重新设计了thrift。

好了,背景扯完,个人两种框架都有用过,你要是用这两种来替换xmlrpc的话绝对没有问题,在跨语言开发上两个都有很丰富的积累,建议替换,要说这两个中选择其一的话建议使用grpc+protocolbuffer。

maltadirk 发表于 2021-10-9 19:18

最近被GRPC搞到瘋,我是不會告訴你GRPC不支持Python 3的,啊哈哈哈哈
页: [1] 2
查看完整版本: 全 Python 项目,使用 Protobuf / Thrift适合吗?