Hi, Are you thinking of the case where the client has died or otherwise has lost connectivity? Note that a broken TCP connection will be detected on the server side and will do the necessary clean up. If that's not your case please describe what your use-case is.
On Thursday, August 31, 2023 at 12:50:25 AM UTC-7 airas yaqub wrote: > Hey Sanjay, thanks for replying. So I have a follow-up question now, > > > - My client code is configured with a keepalive time of 30sec, so is > there a config on the server side that says "cancel connection if I do not > receive ping in given time"? Previously I thought maxConnectionIdle on the > server side would do the trick but it did not work due to the reason > mentioned above i.e. idle in maxConnectionIdle means there is no ongoing > RPC call, but in bidi, RPC call will always be there as a persistent > connection. > > > On Thursday, August 31, 2023 at 9:43:25 AM UTC+5 sanjay...@google.com > wrote: > >> Yes, your understanding is correct. If a connection has an active bi-di >> call and even if there is no activity in that call gRPC will keep the >> connection active using PING frames. It is alluded to in this spec >> <https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md#abstract> >> . >> Hope that answers your questions. >> >> On Wednesday, August 30, 2023 at 6:00:55 AM UTC-7 airas yaqub wrote: >> >>> 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/7f158458-e3ec-4123-9dd4-9de5988a859cn%40googlegroups.com.