On Thu, Aug 15, 2019 at 11:55 AM Rama Rao <ramaraochav...@gmail.com> wrote:

> We are proxying the requests with 2mb via a proxy and seeing that proxy is
> seeing partial request so interested in understanding the behaviour bit
> more.
>

Hmmm... Depending on what you are seeing there can be a lot of explanations.

1. HTTP/2 flow control prevents gRPC from sending. Note there is
stream-level and connection-level flow control. By default grpc-java uses 1
MB as the window here, although your proxy is what is providing the window
to the client. I only mention the 1 MB because the proxy will need to send
data to a gRPC server and will be limited to 1 MB initially. Other
implementations use 64 KB and auto-size the window.

   - On the server-side there is a delay before we let more than 1 MB be
   sent. We wake up the application and route the request, run interceptors,
   and eventually the application stub will request the request message. At
   that point the server allows more to be sent. If you *suspect* this may
   be related to what you see, you can change the default window
   
<https://grpc.github.io/grpc-java/javadoc/io/grpc/netty/NettyServerBuilder.html#flowControlWindow-int->
and
   see if you see different behavior. Be aware that the proxy will have its
   own buffering/flow control.

2. More than one request is being sent, so their are interleaved. We are
currently interleave in 1 KB chunks
3. The client is slow doing protobuf encoding. We stream out data while
doing protobuf encoding, so (with some other conditions I won't get into)
it is possible to see the first part of a message before the end of the
message has been serialized on the client-side. This is purely CPU-limited,
but could be noticed during a long GC, for example
4. Laundry list of other things, like dropped packets

Can you explain more on “fully buffered on unbuffered depending on what
> user is truly asking”? Are you saying there a way to control this behaviour
> while making the request? If yes, can you point me to that?
>

I wasn't referring to something controllable. Basically the client provides
an entire request, all at once. gRPC is not "buffering" that message
waiting for it to be sent; it sends it now. But it *can't* necessarily send
it *right now*. It takes time to be sent and the message must sit in a
buffer while we wait on TCP and TCP has buffers and there are buffers in
the network, blah blah blah. We also have a "network thread" for doing the
I/O. There is a buffer to enqueue work to that other thread. So lots and
lots of buffers, but it all depends on your perspective and your definition
of "buffer."

-- 
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/CA%2B4M1oMtd57bDGAB-5OS71v9GJPv%2BAF3o8Z3mjGhKzQ%2BYZG31g%40mail.gmail.com.

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to