【问题标题】:Client doesn't detect Server disconnection客户端未检测到服务器断开连接
【发布时间】:2018-11-16 15:37:05
【问题描述】:

在我的应用程序 (c++) 中,我有一个服务公开为:

grpc foo(stream Request) 返回 (Reply) { }

问题是当服务器关闭时(CTRL-C),客户端的流确实会继续运行

grpc::ClientWriter::Write

不返回假。我可以确认使用 netstat 我看不到客户端和服务器之间的任何连接(除了一个 TIME_WAIT 一段时间后消失的连接)并且客户端继续调用该 Write 而没有错误。

有没有办法查看底层连接是否仍在运行而不是依赖于写入返回值?我使用 grpc 版本 1.12

更新

我发现底层通道处于 IDLE 状态,但 ClientWriter::Write 仍然没有报告错误,我不知道这是不是有意的。在流式传输期间,我现在尝试在每次通道状态不是 GRPC_CHANNEL_READY 时重新建立与服务器的连接

【问题讨论】:

  • 您可以使用定期发送的某种“存在”消息覆盖协议吗?
  • 我可以,但那是“黑客”
  • 我发现底层通道进入了IDLE状态,但是ClientWriter::Write仍然没有报错,我不知道这是不是有意的。在流式传输期间,我现在正在尝试重新建立与服务器的连接。

标签: c++ grpc


【解决方案1】:

这可能在少数情况下发生,但最常见的元素是连接问题。我们在 gRPC 中有 KEEPALIVE 支持来解决这个问题。对于 C++,请参阅https://github.com/grpc/grpc/blob/master/doc/keepalive.md 了解如何设置。本质上,端点会以特定的时间间隔发送 ping,并期望在特定的时间范围内得到回复。

【讨论】:

  • Keepalive 不会阻止 grpc::ClientWriter::Write 返回 true,只要底层连接正常。所以代码可能会认为消息发送正确但没有正确发送,当grpc::ClientWriter::Write最终返回false时,它们就会丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多