如何在 Node.js 实现中更改 gRPC 的重新连接行为?

How can I change gRPC's reconnection behaviour in the Node.js implementation?

据我所知,gRPC 客户端会自动尝试使用退避算法重新建立丢失的连接。我的目标是让 gRPC 至少每秒尝试重新连接。

使用 Go 实现,这可以通过在首次建立与服务的连接时传递 WithBackoffMaxDelay 拨号选项来实现。我怎样才能在 Node.js 实施中做同样的事情?


按照建议,我尝试将 grpc.max_reconnect_backoff_ms 选项传递给客户端构造函数。如果我故意传递一个无效值,如 -1,gRPC 会记录一条错误消息,所以我相信我使用正确。

但是,该选项似乎不会影响 gRPC 的重新连接行为。相反,它似乎大约每 20 秒尝试重新连接一次:

I0215 21:21:07.246695000 140736304567232 subchannel.c:694] Connect failed: {"created":"@1487190067.246665000","description":"Failed to connect to remote host","errno":61,"file":"../src/core/lib/iomgr/tcp_client_uv.c","file_line":104,"os_error":"connection refused"}
I0215 21:21:07.246910000 140736304567232 subchannel.c:491] Retry in 19.999536519 seconds

更令人困惑的是,gRPC 似乎根本没有使用退避算法,即它始终使用 ~20s 值。

Node gRPC Client 构造函数采用可选的第三个参数,其中包含用于基础实现的选项。其中一个选项是 "grpc.max_reconnect_backoff_ms"。顾名思义,该值以毫秒为单位,因此您应该将 1000 作为值传递。

我遇到了同样的问题,在调查了 gRPC 核心源代码(C 语言)后,我明白了这个问题:

  • 可以配置最大时间,正如@murgatroid99 所指出的,但是,不能配置最小时间,它被强制为 20 秒。

我在 gRPC 存储库中提出了一个合并请求,以使其可配置: https://github.com/grpc/grpc/pull/10237

如果您使用我的分支中的分支,您将能够在您的客户端构造函数中执行此操作:

new ...client(host, credentials, {
  'grpc.min_reconnect_backoff_ms': 1000,
  'grpc.max_reconnect_backoff_ms': 10000,
})