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

csm*_*csm 2 node.js grpc

据我所知,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
Run Code Online (Sandbox Code Playgroud)

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

Edm*_*ues 5

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

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

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

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

new ...client(host, credentials, {
  'grpc.min_reconnect_backoff_ms': 1000,
  'grpc.max_reconnect_backoff_ms': 10000,
})
Run Code Online (Sandbox Code Playgroud)