我正在通过AWS NLB负载平衡将gRPC Java客户端测试到其服务器,但是所有流量都到达了同一节点。我试图了解它如何在NLB上工作。
由于gRPC使用持久TCP连接,我假设其客户端将通过NLB与服务器建立多个tcp连接,并随机地向这些连接提供请求?
我正在使用grpc.java示例中的代码
ManagedChannel channel = ManagedChannelBuilder.forAddress(endPoint, port).usePlaintext().build();
GreeterGrpc.GreeterBlockingStub blockingStub = GreeterGrpc.newBlockingStub(channel);
response = blockingStub.sayHello(request);
我看到一些文档说ManagedChannel封装了连接池的复杂性,我想它将维护连接并决定使用哪个连接?
既然存根是线程安全的,我想我可以对所有请求重用同一个存根吗?
所以问题是我如何使请求跨每个服务器节点实现负载均衡。我在NLB上运行了该示例,但是所有请求都碰到了同一个节点而没有运气。
答案 0 :(得分:0)
NLB无法正确平衡GRPC的负载。这是一种效率低下的技巧。
grpc为受信任的客户端提供了胖客户端负载平衡解决方案。 https://github.com/grpc/grpc/blob/master/doc/load-balancing.md