我需要传输大量数据,而性能是重中之重。 gRPC 似乎所做的不仅仅是序列化 protobuf,老实说,对于我的需要来说,它感觉有点臃肿。手动序列化/反序列化 protobuf 并通过 TCP 发送字节是否是反模式?这样做可以带来多大的性能提升?
通过 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