找回密码
 立即注册
查看: 651|回复: 17

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

[复制链接]
发表于 2021-10-9 18:21 | 显示全部楼层 |阅读模式
我现在在做一个全 Python 的集群项目,用的 xmlrpc 去做各服务通信。但是xmlrpc的使用太恶心,而且异常全部转换成了xmlrpc的Fault类型。很不好转换,所以想吧我们的通信库换一下。但是其他人说,又不是跨语言,没必要用到这些东西,简单就行。
各位怎么看呢?
发表于 2021-10-9 18:28 | 显示全部楼层
protobuf只是一种serialization的协议,thrift才是一个完整的服务级别的rpc协议(最近grpc也开源了,基本等于Google的thrift,最近准备在go里面玩玩儿)

其实用Thrift省事儿多了,thrift文件作为一个service model是语言无关的,而且可以同时生成server和client,还自带type check。定义好接口,就可以专心去实现业务逻辑了。
发表于 2021-10-9 18:36 | 显示全部楼层
现在 RPC 通信框架里比较成熟的就是 Thrift 了,是用C++实现的,我呆了两家互联网公司,都用这个。最早是 Facebook 写的,国内的话规模比较大的据我所知百度也在用。有个传言的八卦是 protobuffer 是早期在 Google 内部流行的,后来有员工跳槽到了 Facebook 才有了 Thrift。

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

况且,Thrift 一点也不复杂,定义一个传输接口的配置文件就完事了,后面的事情 Thrift 一条龙服务。
发表于 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,也许你的应用终生都不会有大的性能压力。
发表于 2021-10-9 18:45 | 显示全部楼层
你知道Thrift发布多少年了,至今版本号仍然只是 0.9.2 吗?

老夫作为国内第一批吃螃蟹的,有半年基本上天天在帮别人解决thrift bug问题...后来果断弃坑,加入微软WCF大军。
发表于 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
发表于 2021-10-9 19:00 | 显示全部楼层
我们用c++写thrift服务端,python写thrift接口客户端,在一个核心平台上使用,效果挺好。
发表于 2021-10-9 19:06 | 显示全部楼层
有人用zeroc ice吗?
发表于 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。
发表于 2021-10-9 19:18 | 显示全部楼层
最近被GRPC搞到瘋,我是不會告訴你GRPC不支持Python 3的,啊哈哈哈哈
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-2-26 03:02 , Processed in 0.099215 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表