gRPC常用的配置选项

奔小跑 2023年05月18日 1,873次浏览

gRPC是一种高性能、开源、通用的远程过程调用(RPC)框架,基于HTTP/2协议的,默认使用长连接,更有效地复用TCP连接,提高性能,减少了多次建立和关闭连接的开销。其中一些常用的配置选项(例如GRPC_ARG_KEEPALIVE_TIME_MS、GRPC_ARG_KEEPALIVE_TIMEOUT_MS、GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS、GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA等),需要根据自己的应用场景来设置适合的值,以达到预期的良好服务能力。下面就这些配置选项给出例子描述说明,以帮助更好地理解。


配置选项GRPC_ARG_KEEPALIVE_TIME_MS

  • 用于设置keepalive ping的频率,值是一个整数,单位是毫秒。
  • keepalive ping是一个轻量级的网络包,用于检查连接是否仍然活动。如果在指定的时间内没有数据交换,服务器就会发送一个keepalive ping。
  • 例子:如果设置 GRPC_ARG_KEEPALIVE_TIME_MS 为30000,那么当服务器30秒没有收到任何数据时,它就会发送一个keepalive ping。

代码示例:

grpc::ServerBuilder builder;

// 设置keepalive时间为30秒
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 30000);

// 其他设置...

配置选项GRPC_ARG_KEEPALIVE_TIMEOUT_MS

  • 用于设置服务器在发送keepalive ping后等待响应的时间,值是一个整数,单位是毫秒。
  • 例子:如果设置 GRPC_ARG_KEEPALIVE_TIMEOUT_MS 为10000,那么服务器在发送keepalive ping后,将等待10秒以接收客户端的响应。如果在这个时间内没有收到任何响应,服务器将认为连接已经断开,并关闭这个连接。

代码示例:

grpc::ServerBuilder builder;

// 设置keepalive超时时间为10秒
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);

// 其他设置...

配置选项GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS

  • 决定了在没有活跃的 RPC 调用时,是否允许发送 keepalive pings,值是一个布尔值。
  • 例子:如果设置为1(true),那么服务器将在没有活跃的 RPC 调用时仍然发送 keepalive pings。如果设置为0(false),则只有在有活跃的 RPC 调用时,服务器才会发送 keepalive pings。
  • 注意:这个设置可以让服务器更快地检测到无活跃 RPC 的空闲连接,并据此关闭它们。但是,如果你的应用场景中可能会有长时间没有活跃 RPC 的连接,那么这可能会导致不必要的连接关闭。

代码示例:

grpc::ServerBuilder builder;

// 允许在没有活跃的 RPC 调用时发送 keepalive pings
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);

// 其他设置...

配置选项GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA

  • 用于设置在没有数据传输的情况下,允许发送的最大的 ping 消息数量,此选项可以防止服务器过于频繁地发送 ping 消息,从而防止了所谓的 ping 洪水攻击,值是一个整数。
  • 例子:如果设置为2,那么在一个 ping 时间间隔内,只允许发送最多2个 ping 帧,除非同时也发送了其他数据帧。
  • 注意:这个设置可以帮助防止服务器过于频繁地发送 ping 消息,从而导致网络流量增加。但是,如果设置的值过小,可能会影响到 keepalive 机制的效果,因为 keepalive 机制依赖于 ping 消息来检查连接的活性。

代码示例:

grpc::ServerBuilder builder;

// 在没有数据传输的情况下,最多允许发送2个 ping 消息
builder.AddChannelArgument(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA, 2);

// 其他设置...

配置选项ServerBuilder::SyncServerOption::MAX_POLLERS

  • 是 gRPC C++ 服务器的一个配置选项,用于设置服务器中最多可以有多少个 "poller" 线程。这些 "poller" 线程负责在底层网络套接字上轮询(polling)新的事件,像新的连接请求或者新的数据包,值是一个整数。
  • 例子:如果你设置 ServerBuilder::SyncServerOption::MAX_POLLERS 为 5,那么 gRPC 服务器最多会有 5 个线程在后台轮询新的事件。
  • 注意:在选择适合的 MAX_POLLERS 值时,需要考虑到服务器的硬件配置(例如 CPU 核心数)和应用场景(例如并发连接数和请求频率)。如果 MAX_POLLERS 的值过大,可能会导致线程之间的竞争增加,从而降低性能。如果 MAX_POLLERS 的值过小,可能会导致新的事件处理不及时,从而影响到服务的响应时间。

代码示例:

grpc::ServerBuilder builder;

// 设置最大的 "poller" 线程数为 5
builder.SetSyncServerOption(grpc::ServerBuilder::SyncServerOption::MAX_POLLERS, 5);

// 其他设置...