RPC 系列(三十三):brpc 的连接管理

/connections 服务可以查看所有的连接。一个典型的页面如下。

server 端的连接(server_socket_count: 5):

CreatedTime RemoteSide SSL Protocol fd BytesIn/s In/s BytesOut/s Out/s BytesIn/m In/m BytesOut/m Out/m SocketId
2015/09/21-21:32:09.630840 172.22.38.217:51379 No http 19 1300 1 269 1 68844 53 115860 53 257
2015/09/21-21:32:09.630857 172.22.38.217:51380 No http 20 1308 1 5766 1 68884 53 129978 53 258
2015/09/21-21:32:09.630880 172.22.38.217:51381 No http 21 1292 1 1447 1 67672 52 143414 52 259
2015/09/21-21:32:01.324587 127.0.0.1:55385 No baidu_std 15 1480 20 880 20 88020 1192 52260 1192 512
2015/09/21-21:32:01.325969 127.0.0.1:55387 No baidu_std 17 4016 40 1554 40 238879 2384 92660 2384 1024

channel 端的连接(channel_socket_count: 1):

CreatedTime RemoteSide SSL Protocol fd BytesIn/s In/s BytesOut/s Out/s BytesIn/m In/m BytesOut/m Out/m SocketId
2015/09/21-21:32:01.325870 127.0.0.1:8765 No baidu_std 16 1554 40 4016 40 92660 2384 238879 2384 0

channel 端的短连接数量(channel_short_socket_count: 0)。

信息分为三段

上述页面信息分为三段:

  • server_socket_count:server 端的连接数量。
  • channel_socket_count:channel 端的连接数量。
  • channel_short_socket_count:channel 端的短连接数量。

表格列的含义

列名 含义
CreatedTime 连接建立时间
RemoteSide 连接的对端地址
Local 本地地址。单连接模式下是具体端口,连接池模式下是 *,短连接模式下是 -
SSL 是否为 SSL 连接
Protocol 协议
fd 连接对应的文件描述符
BytesIn/s 每秒读入的字节数
In/s 每秒读入的消息个数
BytesOut/s 每秒写出的字节数
Out/s 每秒写出的消息个数
BytesIn/m 每分钟读入的字节数
In/m 每分钟读入的消息个数
BytesOut/m 每分钟写出的字节数
Out/m 每分钟写出的消息个数
Rtt/Var(ms) 往返延时及其方差(新版页面提供)
SocketId 连接对应的 SocketId

三种连接方式的截图

典型截图分别如下所示。

单连接:

单连接模式下的 connections 页面:Local 列显示具体端口 27872,一条连接对应一个 SocketId

连接池:

连接池模式下的 connections 页面:Local 列显示为 *,代表一组连接

短连接:

短连接模式下的 connections 页面:Local 列显示为 -,读写流量列基本为空

延伸:客户端视角的断线重连 —— 以 gRPC 为例

连接管理不只是”看着”连接有多少。连接一旦断开,客户端侧如何自动恢复,同样是连接管理的重要部分。brpc 的 channel 内置了连接级别的重试与恢复逻辑;作为对照,下面以另一主流 RPC 框架 gRPC 为例,看它的重连机制是如何设计的。

gRPC 的重连机制是确保客户端在连接断开后能够自动重新连接到服务器的一种机制,对于分布式系统和微服务架构中的高可用性和容错性至关重要。

什么是 gRPC 重连机制

gRPC 重连机制是指在客户端与服务器之间的连接断开后,客户端自动尝试重新建立连接的过程。gRPC 的重连机制依赖于底层的传输层实现(如 HTTP/2)和客户端库的配置。

gRPC 重连策略

gRPC 客户端提供了多种重连策略,主要包括:

指数退避(Exponential Backoff):当连接失败后,gRPC 客户端不会立即尝试重连,而是等待一段时间后再试。初始等待时间较短,每次失败后等待时间呈指数级增长,直到达到最大等待时间。这种策略有助于避免在网络故障期间产生过多的重连请求,减轻网络负担,同时也给服务器恢复的时间。

随机化:在指数退避的基础上,gRPC 可能会在等待时间上增加一些随机性,以防止大量客户端在同一时间尝试重连,从而避免对服务器造成瞬时压力。

心跳检测:为了检测连接是否仍然活跃,gRPC 可以定期发送心跳包。如果在一定时间内没有收到响应,客户端将认为连接已断开,并启动重连过程。

gRPC 重连参数

在 gRPC 客户端中,可以通过配置来控制重连行为。以下是一些常用的配置参数:

  • initialBackoff:初始重连间隔时间
  • maxBackoff:最大重连间隔时间
  • backoffMultiplier:每次重连间隔时间的增长倍数
  • maxAttempts:最大重连次数

Golang 示例

package main

import (
    "google.golang.org/grpc"
    "google.golang.org/grpc/backoff"
    "google.golang.org/grpc/credentials/insecure"
    "log"
    "time"
)

func main() {
    backoffConfig := backoff.Config{
        BaseDelay:  1 * time.Second,
        Multiplier: 1.6,
        Jitter:     0.2,
        MaxDelay:   120 * time.Second,
    }

    conn, err := grpc.Dial(
        "localhost:50051",
        grpc.WithTransportCredentials(insecure.NewCredentials()),
        grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoffConfig}),
    )
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }

    defer conn.Close()
    // ...
}

gRPC 重连机制原理

gRPC 客户端在检测到连接断开后,会按照配置的重连策略进行重连尝试。以下是重连机制的工作流程:

  1. 检测断开:客户端检测到与服务器的连接断开
  2. 初始重连:按照配置的初始重连间隔时间进行第一次重连尝试
  3. 指数退避:如果第一次重连失败,按照指数退避策略增加重连间隔时间,并进行下一次重连尝试
  4. 最大重连次数:如果重连次数达到配置的最大重连次数,停止重连
  5. 成功重连:如果在重连过程中成功建立连接,重连机制结束,客户端恢复正常通信

重连机制的注意事项

  • 合理配置重连间隔时间和指数退避策略,以避免在服务器负载过高时频繁重连,导致服务器压力进一步增加
  • 配置适当的最大重连次数,以避免客户端在长时间无法连接服务器时陷入无限重连循环
  • 在不稳定的网络环境下,重连机制可以提高系统的容错性和可用性,但也需要注意可能的网络抖动和延迟对重连的影响
  • 在实现重连机制时,建议添加详细的日志和监控,以便在重连失败或重连次数过多时能够及时发现问题并采取措施

小结

gRPC 的重连机制是确保客户端在连接断开后能够自动重新连接到服务器的一种重要机制。通过合理配置重连参数和策略,可以提高系统的高可用性和容错性。在实际应用中,需要根据具体场景和需求,合理配置重连机制,以确保系统的稳定性和可靠性。

系列导航


   转载规则


《RPC 系列(三十三):brpc 的连接管理》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
RPC 系列(三十四):brpc Server 的调试方法 RPC 系列(三十四):brpc Server 的调试方法
工作线程是否够用查看 /vars/bthread_worker_count 和 /vars/bthread_worker_usage,分别是工作线程的个数和正在被使用的工作线程个数。如果 usage 和 count 接近,说明线程不够用了。
2024-04-23
下一篇 
RPC 系列(三十二):brpc 的 vars 变量 RPC 系列(三十二):brpc 的 vars 变量
bvar 是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了 thread local 存储减少了 cache bouncing,相比 UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁
2024-04-09
  目录