It should - you just need a time lower than proxy timeout. Which is better depends a lot on how many simultaneous connections you expect to the server (i.e. how many client processes/machines). If small it would be much more efficient and provide better latency to use the keep alives rather than rebuilding the connection. If a lot of requests are coming in it won’t even matter.
> On Jan 17, 2019, at 2:41 PM, Bryant Davis <davis.bry...@gmail.com> wrote: > > Thanks for your response, Robert! I wasn't clear on how the keepalives work, > and saw some warning in the docs about increasing load on servers, but > perhaps thats better than redoing the tls handshake each time? There seem to > be 3 options: keepAliveTime, keepAliveTimeout, and keepAliveWithoutCalls. I > suppose I would use keepAliveTime, and that would prevent the connection from > closing? > > On Thu, Jan 17, 2019 at 2:32 PM robert engels <reng...@earthlink.net > <mailto:reng...@earthlink.net>> wrote: > Yes, it is might be more efficient to use keep-alives rather than destroying > and rebuilding the connections - but that will depend on your setup/usage. > >> On Jan 17, 2019, at 2:31 PM, davis.bry...@gmail.com >> <mailto:davis.bry...@gmail.com> wrote: >> >> After researching a bit, I believe the issue was that the proxy on the >> server was closing the connection after a few minutes of idle time, and the >> client ManagedChannel didn't automatically detect that and connect again >> when that happened. When constructing the ManagedChannel, I added an >> idleTimeout to it, which will proactively kill the connection when it's >> idle, and reestablish it when it's needed again, and this seems to solve the >> problem. So the new channel construction looks like this: >> >> @Singleton >> @Provides >> fun providesMyClient(app: Application): MyClient { >> val channel = AndroidChannelBuilder >> .forAddress("example.com <http://example.com/>", 443) >> .overrideAuthority("example.com <http://example.com/>") >> .context(app.applicationContext) >> .idleTimeout(60, TimeUnit.SECONDS) >> .build() >> return MyClient(channel) >> } >> To anyone who might see this, does that seem like a plausible explanation? >> >> >> On Wednesday, January 16, 2019 at 7:30:42 PM UTC-6, davis....@gmail.com >> <http://gmail.com/> wrote: >> I believe I may not understand something about how gRPC Channels, Stubs, And >> Transports work. I have an Android app that creates a channel and a single >> blocking stub and injects it with dagger when the application is >> initialized. When I need to make a grpc call, I have a method in my client, >> that calls a method with that stub. After the app is idle a while, all of my >> calls return DEADLINE_EXCEEDED errors, though there are no calls showing up >> in the server logs. >> >> @Singleton >> @Provides >> fun providesMyClient(app: Application): MyClient { >> val channel = AndroidChannelBuilder >> .forAddress("example.com <http://example.com/>", 443) >> .overrideAuthority("example.com <http://example.com/>") >> .context(app.applicationContext) >> .build() >> return MyClient(channel) >> } >> Where my client class has a function to return a request with a deadline: >> >> class MyClient(channel: ManagedChannel) { >> private val blockingStub: MyServiceGrpc.MyServiceBlockingStub = >> MyServiceGrpc.newBlockingStub(channel) >> >> fun getStuff(): StuffResponse = >> blockingStub >> .withDeadlineAfter(7, TimeUnit.SECONDS) >> .getStuff(stuffRequest()) >> } >> fun getOtherStuff(): StuffResponse = >> blockingStub >> .withDeadlineAfter(7, TimeUnit.SECONDS) >> .getOtherStuff(stuffRequest()) >> } >> I make the calls to the server inside a LiveData class in My Repository, >> where the call looks like this: myClient.getStuff() >> >> I am guessing that the channel looses its connection at some point, and then >> all of the subsequent stubs simply can't connect, but I don't see anywhere >> in the AndroidChannelBuilder documentation that talks about how to handle >> this (I believed it reconnected automatically). Is it possible that the >> channel I use to create my blocking stub gets stale, and I should be >> creating a new blocking stub each time I call getStuff()? Any help in >> understanding this would be greatly appreciated. >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "grpc.io <http://grpc.io/>" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to grpc-io+unsubscr...@googlegroups.com >> <mailto:grpc-io+unsubscr...@googlegroups.com>. >> To post to this group, send email to grpc-io@googlegroups.com >> <mailto:grpc-io@googlegroups.com>. >> Visit this group at https://groups.google.com/group/grpc-io >> <https://groups.google.com/group/grpc-io>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/grpc-io/1202aad5-4897-4bbb-a238-34edae74e368%40googlegroups.com >> >> <https://groups.google.com/d/msgid/grpc-io/1202aad5-4897-4bbb-a238-34edae74e368%40googlegroups.com?utm_medium=email&utm_source=footer>. >> For more options, visit https://groups.google.com/d/optout >> <https://groups.google.com/d/optout>. > -- 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 post to this group, send email to grpc-io@googlegroups.com. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/4E4E6C45-EDB3-4BE3-A61A-869E898C3591%40earthlink.net. For more options, visit https://groups.google.com/d/optout.