I think current options are only for unary RPC done on a channel, but in the case of bidirectional streaming, we have a channel where a long-lived bidirectional RPC is made & within that RPC connection, we send messages. But these server options do not take account of the stream messages, they only consider RPC calls. correct me guys if I am wrong in my understanding.
On Wednesday, August 30, 2023 at 5:45:11 PM UTC+5 airas yaqub wrote: > Hi, we have a bidirectional java gRPC server & we are using > NettyServerBuilder to configure the server. I have read all the docs in > order to implement the ping/pong mechanism for the gRPC connection. Below > is our server config > > server code: > > ((NettyServerBuilder) serverBuilder) > .executor(executor) > //Allow client pings even if no ongoing calls are happening > (default is false) > .permitKeepAliveWithoutCalls(true) > //Least keep alive time allowed for clients to configure > .permitKeepAliveTime(10,TimeUnit.SECONDS) > //How long a channel can stay idle (idle means no pings & messages > received) > .maxConnectionIdle(5,TimeUnit.SECONDS) > //How long a channel can stay at all (even if not idle) > .maxConnectionAge(1,TimeUnit.MINUTES) > //Grace period after the channel ends > .maxConnectionAgeGrace(10,TimeUnit.SECONDS) > //Max payload size > .maxInboundMessageSize(Integer.MAX_VALUE) > //Max headers size > .maxInboundMetadataSize(Integer.MAX_VALUE); > } > > > client code: > > ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", > 50004) > .usePlaintext() > .keepAliveTime(30, TimeUnit.SECONDS) > .keepAliveTimeout(5, TimeUnit.SECONDS) > .keepAliveWithoutCalls(true) > .build(); > > FabricGrpc.FabricStub stub = FabricGrpc.newStub(channel); > > Metadata headers = new Metadata(); > headers.put(Metadata.Key.of("userId", Metadata.ASCII_STRING_MARSHALLER), > identificationInputs[0]); > FabricGrpc.FabricStub stubWithHeaders = MetadataUtils.attachHeaders(stub, > headers); > > StreamObserver<Envelope> observer = > stubWithHeaders.biDiEnvelopeChannel(new StreamObserver<Envelope>() { > @Override > public void onNext(Envelope value) { > System.out.println("Received message =====> " + value + " ******* > "); > } > > @Override > public void onError(Throwable t) { > System.out.println("error on grpc client: " + t.getMessage()); > } > > @Override > public void onCompleted() { > > } > }); > > > what we need is if the connection is idle for a given time, the server > should kill the connection. But I think I am not getting how > *maxConnectionIdle > *actually works. My previous thought was a connection is idle from the > server's perspective if it does not get any message or ping, but then I > read this line in the doc " Idleness duration is defined since the most > recent time the number of outstanding RPCs became zero or the connection > establishment" which I guess means that not any ongoing RPC calls should > be there in order to consider a connection as idle. But since it's a > bidirectional RPC call, it will be long-lived obviously. > > Right now maxConnectionAge is working fine, but how can we configure idle > connection on a server with bidirectional RPC. Meaning if the server does > not get a ping or any message in a given time frame, it will consider that > connection as idle & will terminate it. > > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/15bd1350-9065-4fd5-9b60-87f228132dacn%40googlegroups.com.