在 C++ gRPC 异步服务器中为丢失的连接提供什么通知

What notification is provided for a lost connection in a C++ gRPC async server

我有一个用 C++ 编写的用于 Windows 的异步 gRPC 服务器。我想检测与客户端的连接丢失 - 网络连接是否丢失,或者客户端崩溃等。我看到对 keepalive 通道参数的引用,并且我尝试了这些设置的各种组合,例如:

builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.AddChannelArgument(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS, 9000);
builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE, 1);

我用流式 RPC 方法做了一些测试。如果我终止客户端进程然后尝试向客户端发送数据,则会检测到连接丢失。我实际上什至不必发送数据。我可以将 Alarm 对象设置为立即触发,这会导致调用处理程序被取消。但是,如果我在终止客户端进程后不尝试发送数据(或设置警报),那么就没有我能够 find/enable 的通知或回调。我一定没有完全理解。所以:

  1. 检测到丢失的连接如何为服务器表现出来?是否有回调方法或某种类型的通知?我的服务器没有收到任何错误;完成队列的“Next()”方法从不 returns,等等
  2. 此检测是否对一元 (call/response) 和流式方法都有效?
  3. 无论客户端是否已实现丢失连接/保活逻辑,服务器检测丢失连接是否起作用?
  4. 除了 keepalive 通道参数之外,还有其他首选方法吗?

谢谢 - 任何帮助都将不胜感激。

您可以使用 ServerContext::AsyncNotifyWhenDone() 在请求被取消时收到通知。

https://grpc.github.io/grpc/cpp/classgrpc__impl_1_1_server_context_base.html#a0f1289f31257e6dbef57bc901bd7b5f2