【问题标题】:How to detect (physical) disconnect when using a bidirectional stream in Grpc在 Grpc 中使用双向流时如何检测(物理)断开连接
【发布时间】:2018-08-22 21:32:08
【问题描述】:

我正在使用 Grpc 的同步 C++ API 通过需要无限期保持打开的双向流发送消息。

现在,如果我拉动服务器和客户端之间的电缆,则该流上的 WriteRead 调用将在双方阻塞大约 15 分钟,然后返回 false

如何将ReadWrite的超时设置为小于15分钟?


我正在启动服务器:

ServerBuilder srvBuilder;

srvBuilder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 2000);
srvBuilder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 1000);
srvBuilder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE, 1);
srvBuilder.AddChannelArgument(GRPC_ARG_MAX_CONNECTION_IDLE_MS , 1000);

srvBuilder.AddListeningPort("0.0.0.0:50505", grpc::InsecureServerCredentials());
srvBuilder.RegisterService(&testService);

在 Ubuntu 16.04 LTS 上使用 Grpc 1.10.0

【问题讨论】:

    标签: c++ timeout grpc


    【解决方案1】:

    您可以在调用之前通过调用 ClientContext 上的 set_deadline 来设置 RPC 的截止日期。

    更新 - 我对造成的误解深表歉意。 GRPC_ARG_KEEPALIVE_TIME_MS 正是您想要的。它无法按预期工作的原因可能与您进行读取和写入的方式有关。

    【讨论】:

    • 最后期限将总是在超过时终止流。由于流无限期/永远保持打开状态,ClientContext 的最后期限几乎总是会过早终止流。
    • GRPC_ARG_KEEPALIVE_TIME_MS 在建立一次连接后未检测网络是否断开。流保持打开状态,状态为 error_message。
    • github.com/grpc/grpc/blob/master/doc/keepalive.md 有助于解释如何设置保活。 args 帮助配置我们是否希望在没有活动流的情况下发送 keepalive ping,或者是否没有发送数据帧。
    • @YashTibrewal 这是一个很好的链接。但是我们应该把支票放在哪里呢?我将通道参数放在客户端上,并将相同的参数放在服务器构建器上,但这并没有改变它看起来的任何东西。如何检测到客户端实际上不再可用是否有任何代码示例用于该检查?
    猜你喜欢
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2021-03-29
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多