首页 > 解决方案 > gRPC - 如果空闲时间过长,双向流将进入 TRANSIENT_FAILURE

问题描述

我正在尝试让一个相当简单的测试场景起作用 - 我想创建一个可以长期闲置的长期双向流 rpc(具有本地服务器的电子应用程序)。

Node gRPC 客户端在本地启动 C# gRPC 服务器并启动双向流。流服务接收每条消息,等待 50 毫秒,然后将其发回。

Node 客户端测试代码设置为发送 5 条消息,等待 30 秒,然后再发送 5 条消息。前 5 条消息成功往返。第二个 5 消息最终是往返的,但直到 5 分钟后。在此期间未命中服务器端代码。

我确定我在这里是一只狒狒,但我不明白为什么连接似乎如此迅速地消失。我也不确定这里有哪些选项可以提供帮助(如果有的话)。似乎keepalive是为了跟踪 TCP 连接是否仍然存在,但实际上并不能帮助它保持活跃。idleTimeout似乎也不相关,因为我们将TRANSIENT_FAILURE根据此处的枚举文档确定状态。

这个 2016 年的讨论与我想要做的很接近,但解决方案是 RYO 心跳。这个 grpc-dotnet 问题似乎依赖于特定于 ASP.NET 的心跳类型解决方案,该解决方案当前未使用。

gRPC 服务器日志:

发送前 5 条消息后:

传输 000001A7B5A63090 设置连接状态 = 4

启动 BDP ping err...“端点读取失败”(释义)

5 分钟后,就在第二组 5 条消息通过之前:

W:000001A7B5AC8A10 SERVER [ipv6:[::1]:57416] 状态 IDLE -> WRITING [RETRY_SEND_PING]

节点库是@grpc/grpc-js

tl;dr 如何在停机的情况下保持连接健康并正常工作?

标签: c#tcpgrpcgrpc-dotnet

解决方案


推荐阅读