使用 GRPC 流请求进行代理负载平衡

Proxy load-balancing with GRPC streaming requests

我们使用流式 RPC 将大文件发送到 GRPC 服务器。像这样:

service FileReceiver
{
    rpc addData(stream DataChunk) returns (Empty)
}

在这种情况下是否可以使用代理负载平衡器,这样负载平衡器就不会在流媒体请求中切换服务器?随着客户数量的增加,它会很好地扩展吗?

HTTP 负载平衡器通常平衡每个 HTTP 请求。 gRPC 流是单个 HTTP 请求,与流中有多少消息无关。每个客户端都可以被定向到不同的后端,因此它可以扩展。所以 gRPC 的行为是开箱即用的。

流式 RPC 是有状态的,因此所有消息都必须发送到同一后端。这对于结果一致性(如 reflection)至关重要,并且有助于某些工作负载(如您的情况)的性能。

关于可伸缩性的一个注意事项:如果流是长期存在的,您可以 "hot spots" 某些后端具有高比例的流。您的服务可以定期(几分钟或几小时,具体取决于您的需要)关闭流并让客户端重新创建流以重新平衡。