发布网友 发布时间:2024-09-27 19:07
共1个回答
热心网友 时间:2024-09-30 20:32
远程过程调用(RPC)在技术选型上有很多选择,例如FastAPI、gRPC、XML-RPC、msgpack-RPC等。其中,序列化与反序列化是RPC中关键的部分,常用的序列化方法包括xml、json、protobuf和msgpack。本文将基于Python语言,对基于不同序列化方法的RPC实现进行对比分析。
以一个简单的“加和”服务为例:服务提供方接收一个列表参数,将列表中的数字相加后返回结果。首先,计算纯本地调用(无RPC)的耗时,执行10000次,并考虑“低数据量”和“高数据量”两个场景。
json-FastAPI
json作为一种广泛应用的序列化方式,具有良好的可读性,常用于前后端通信。本文选择性能较好的FastAPI进行测试。
server端
通过uvicorn启动服务
client端
执行10000次耗时情况
gRPC
protobuf是一种性能优于json的序列化方式,但其可读性较差,序列化后为二进制不可读。本文选择gRPC进行基于protobuf的RPC调用测试,这也是后端服务之间广泛采用的一种RPC方式。
首先,需要定义一个proto文件,然后编译生成pb2文件和pb2_grpc文件。
server端
client端
执行10000次耗时情况
msgpack-RPC
msgpack同样是一种二进制传输协议,比json更小、更快,整体性能比protobuf更高。它不需要预先定义proto文件,因此没有相应的数据校验,这也可能导致项目维护成本较高。本文选择官方的msgpack-rpc进行基于msgpack的RPC调用测试。
server端
client端
执行10000次耗时情况
整体对比
protobuf相比json快了1倍,msgpack相比protobuf快了10倍!尽管protobuf在可读性方面不如json,msgpack在数据校验方面也不如protobuf,但在前后端通信中,为了可读性,通常采用json;在后端不同服务的相互协作中,采用公共的protobuf(proto);对于完全自己维护的不同子服务的通信,可以尝试使用msgpack。