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

时间:2017-02-15 17:58:29

标签: 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

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

2 个答案:

答案 0 :(得分:1)

我有同样的问题,在调查了gRPC核心源(在C中)后,我理解了这个问题:

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

我在gRPC存储库中创建了一个Pull Request,以使其可配置: https://github.com/grpc/grpc/pull/10237

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

- name: Render Cloud Formation Template
  template: src=cloudformation.yml.j2 dest=rendered_templates/cloudformation.yml

- name: Launch Ansible CloudFormation Stack
         cloudformation:
           template: "rendered_templates/cloudformation.yml"

答案 1 :(得分:0)

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