Hi Carl,
I meant to get back to you sooner, but while building up an example I figured out what the problem was. All of the gRPC onNext threads were performing the application work, and blocking until done. Some of this work involves reading from file systems, network calls etc..
During that work, the gRPC thread is then blocked, and if the blocking lasts for more than just a second or so, all other gRPC/onNext threads halt as well.
I do have other questions on the best way for application threads to "claim" a StreamObserver though (there is a "pool" of them). Most examples I've seen use synchronized, and maybe that'll be fine, but I could see something like a ring buffer / circular queue working well for this too?
- Matt