首页 > 解决方案 > 如何告诉 gRPC 客户端告诉 gRPC 服务器是否已取消?

问题描述

我正在使用同步双向流式传输 grpc 服务,并且我让服务器端在检测到超时时关闭连接。

// server-side code
if (timeout-detected) {
  server_context_->TryCancel();
}

我的问题是:如何检测连接在客户端是否仍然有效?如果是这样,我可以重新建立连接。我试过了

// client-side code
if (client_reader_writer_->Write(&request)) {
  // I consider it connection is still valid
} else {
  // connection decided cancelled. Re-establish connection and do something.
}

client_reader_writer_->Write(&request)返回 true,即使服务器的日志显示已取消。

如果有人能给我一些提示,我将不胜感激!

标签: c++grpc

解决方案


如果您担心链接,可以使用Keepalive机制通过定期发送 HTTP2 ping 来检查通道是否正常,如果没有响应,则认为它已损坏。

其他方法是您还可以提出自己的“心跳”机制,您可以在尝试写入套接字时定期发送心跳以检查服务器/网络故障。

对于典型场景中的服务器超时,可以使用 context.abort(grpc.StatusCode.DEADLINE_EXCEEDED, 'RPC Time Out!') 向客户端指示

这是相同的参考


推荐阅读