Sending headers on every message with bidirectional streaming?

1,720 views
Skip to first unread message

thas....@gmail.com

unread,
Sep 22, 2017, 2:36:51 PM9/22/17
to grpc.io

So to send header metadata with on each call we can use interceptors. Ex:https://github.com/grpc/grpc-java/blob/166108a9438c22d06eb3b371b5ad34a75e14787c/examples/src/main/java/io/grpc/examples/header/HeaderClientInterceptor.java

However, for bidirectional streaming case for a given stub/channel, the headers will only be sent once (via start() call). Is there a way to have every message after to also have the headers sent? 

I see that there is a sendMessage https://github.com/grpc/grpc-java/blob/166108a9438c22d06eb3b371b5ad34a75e14787c/core/src/main/java/io/grpc/ServerCall.java#L128 call, but it only takes in the request message as a parameter. So i'm wondering if there's a way to send other parameters in the header on each subsequent message call in the stream. 

Of course, I could add the parameters to the message body, but that could lead to a pretty large .proto definition. 

Thanks!

Josh Humphries

unread,
Sep 22, 2017, 2:43:50 PM9/22/17
to thas....@gmail.com, grpc.io
Headers are per stream, not per message. The whole stream is a single HTTP round-trip. So the first thing the server sends back are response headers. Then the response payload (which consists of zero or more messages). Finally, you get trailers.

To include metadata for each response message, you'll have to encode that into your RPC schema -- e.g. add a map<string,string> field to your response message (or whatever suits your need, the less stringly-typed likely the better). Then your server can stuff that metadata into each response message.


----
Josh Humphries
jh...@bluegosling.com

--
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+unsubscribe@googlegroups.com.
To post to this group, send email to grp...@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/32099406-cbbb-4e43-9821-9128faa34205%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

thas....@gmail.com

unread,
Sep 22, 2017, 2:56:16 PM9/22/17
to grpc.io
Ahh I see! Thank you very much


On Friday, September 22, 2017 at 11:43:50 AM UTC-7, Josh Humphries wrote:
Headers are per stream, not per message. The whole stream is a single HTTP round-trip. So the first thing the server sends back are response headers. Then the response payload (which consists of zero or more messages). Finally, you get trailers.

To include metadata for each response message, you'll have to encode that into your RPC schema -- e.g. add a map<string,string> field to your response message (or whatever suits your need, the less stringly-typed likely the better). Then your server can stuff that metadata into each response message.


----
Josh Humphries
jh...@bluegosling.com

On Fri, Sep 22, 2017 at 2:36 PM, <thas....@gmail.com> wrote:

So to send header metadata with on each call we can use interceptors. Ex:https://github.com/grpc/grpc-java/blob/166108a9438c22d06eb3b371b5ad34a75e14787c/examples/src/main/java/io/grpc/examples/header/HeaderClientInterceptor.java

However, for bidirectional streaming case for a given stub/channel, the headers will only be sent once (via start() call). Is there a way to have every message after to also have the headers sent? 

I see that there is a sendMessage https://github.com/grpc/grpc-java/blob/166108a9438c22d06eb3b371b5ad34a75e14787c/core/src/main/java/io/grpc/ServerCall.java#L128 call, but it only takes in the request message as a parameter. So i'm wondering if there's a way to send other parameters in the header on each subsequent message call in the stream. 

Of course, I could add the parameters to the message body, but that could lead to a pretty large .proto definition. 

Thanks!

--
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+u...@googlegroups.com.

thas....@gmail.com

unread,
Sep 25, 2017, 6:30:59 PM9/25/17
to grpc.io
Follow up question:

In the same given scenario above, is it possible to have different Contexts per message? The use case is that I'd like to have a metrics and logging utility class on my server that is used to generate graphs and data distributions using each call as a data point. So I'd like to pass around this Metrics object across each call to do some unit of work on using its member functions. 

Kun Zhang

unread,
Sep 28, 2017, 7:30:31 PM9/28/17
to grpc.io
Sounds like you can just write a ServerInterceptor (which holds the Metrics object) to intercept ServerCall.Listener.onMessage() and ServerCall.Listener.onComplete()/onCancel() and do the stuff. I doesn't seem to involve Context (assuming you meant io.grpc.Context).
Reply all
Reply to author
Forward
0 new messages