使用StreamClientInterceptor确定RPC会话何时结束的最佳方法是什么?

时间:2017-03-23 22:48:52

标签: go grpc opentracing

在编写StreamClientInterceptor函数时,确定调用者何时完成RPC的最佳方法是什么?这对于使用一元拦截器或在服务器端通过执行RPC的handler非常简单,但是不清楚如何最好地在客户端执行此操作然后返回调用者随后与之交互的ClientStream

一个用例就是检测OpenTracing,其目标是开始并完成一个标记RPC开始和结束的跨度。

我正在研究的策略是让流拦截器返回一个装饰的ClientStream。如果任何接口方法HeaderCloseSendSendMsgRecvMsg返回错误或ContextRecvMsg,则此新ClientStream会认为RPC已完成取消。此外,它将此逻辑添加到func (cs *DecoratedClientStream) RecvMsg(m interface{}) error { err := cs.ClientStream.RecvMsg(m) if err == io.EOF { // Consider the RPC as complete return err } else if err != nil { // Consider the RPC as complete return err } if !cs.isResponseStreaming { // Consider the RPC as complete } return err }

Recv

在大多数情况下它会起作用,但我的理解是,如果调用者知道结果为io.EOF,则调用String code = "request code with dialog" try { String url = "https://play.google.com/redeem?code=" + URLEncoder.encode(code, "UTF-8"); context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); } catch (android.content.ActivityNotFoundException e) { // Play Store app is not installed } 时不需要调用者(参见Are you required to call Recv until you get io.EOF when interacting with grpc.ClientStreams?) ,所以在所有情况下都不会起作用。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

我有一个非常类似的问题,我想跟踪流式gRPC调用。除了你自己提到的装饰流之外,我无法找到一种检测流结束的好方法。也就是说,直到我遇到grpc-go(https://godoc.org/google.golang.org/grpc/stats)提供的统计数据钩子。即使stats API用于收集有关RPC调用的统计信息,它提供的钩子也非常有助于跟踪。

如果您仍在寻找跟踪流式呼叫的方法,我已经使用stats挂钩为gRPC的OpenTracing工具编写了一个库:  https://github.com/charithe/otgrpc。但是,请记住,这种方法可能不适合创建长期流的系统。