Winston Moxley Asked: 2024-12-16 00:07:11 +0800 CST2024-12-16 00:07:11 +0800 CST 2024-12-16 00:07:11 +0800 CST TCP 上的 protobuf 与 grpc 772 我需要传输大量数据,性能是重中之重。gRPC 似乎能做的远不止序列化 protobuf,老实说,它对我来说有点臃肿。手动序列化/反序列化 protobuf 并通过 TCP 发送字节是否违反了反模式?这样做能带来多少性能提升? protocol-buffers 1 个回答 Voted Best Answer 0x8D 2024-12-16T00:21:15+08:002024-12-16T00:21:15+08:00 通过 TCP 手动进行 protobuf 序列化?完全没问题。人们把这个东西搞得太复杂了。 基本上,gRPC 就像带着坦克参加卡丁车比赛。如果您只需要快速移动一些字节,那就这样做吧。序列化您的 protobuf,发送字节,就完成了。 # Dead simple sock.send(your_message.SerializeToString()) 就是这样。没什么深奥的。通过跳过所有 gRPC 开销,您可能会获得 30% 更好的性能。HTTP/2、服务发现、所有这些爵士乐 - 非常适合大型分布式系统,如果您只是在两点之间移动数据,那就完全是大材小用了。只需确保您处理好套接字连接,并可能添加一点长度前缀,这样您就知道要读取多少字节。但说真的,这并不复杂。想让我向您展示一个如何正确执行的快速示例吗? 快速代码示例 import socket from google.protobuf import your_message_pb2 def send_protobuf(sock, message): data = message.SerializeToString() sock.sendall(len(data).to_bytes(4, 'big') + data) def receive_protobuf(sock, message_class): length = int.from_bytes(sock.recv(4), 'big') data = sock.recv(length) message = message_class() message.ParseFromString(data) return message
通过 TCP 手动进行 protobuf 序列化?完全没问题。人们把这个东西搞得太复杂了。
基本上,gRPC 就像带着坦克参加卡丁车比赛。如果您只需要快速移动一些字节,那就这样做吧。序列化您的 protobuf,发送字节,就完成了。
就是这样。没什么深奥的。通过跳过所有 gRPC 开销,您可能会获得 30% 更好的性能。HTTP/2、服务发现、所有这些爵士乐 - 非常适合大型分布式系统,如果您只是在两点之间移动数据,那就完全是大材小用了。只需确保您处理好套接字连接,并可能添加一点长度前缀,这样您就知道要读取多少字节。但说真的,这并不复杂。想让我向您展示一个如何正确执行的快速示例吗?
快速代码示例