brpc icon indicating copy to clipboard operation
brpc copied to clipboard

Support TCP heartbeat to support the case that brpc client unaware of servers' down

Open zyearn opened this issue 2 years ago • 2 comments

Brpc already have the feature to close fd when it's idle, but it lacks the same feature for clients.

This new feature can make clients close fd when servers are turned down unexpectedly(no FIN sent).

The simplest way is to use TCP heartbeat for client socket.

zyearn avatar Aug 17 '22 19:08 zyearn

可以通过给客户端socket设置SO_KEEPALIVE参数来实现。开启keepalive操作系统会来探活然后关闭已经断开的socket。

    if (setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) < 0) {
       ...
    }

对代码侵入性比较小。另外可以把把TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT三个socket选项的值提供给Channel设置。 让用户自定义探活动时间

    if (setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &val1, sizeof(val1)) < 0) {
        ... 
    }
    if (setsockopt(cliend_fd, IPPROTO_TCP, TCP_KEEPINTVL, &val2, sizeof(val2)) < 0) {
        ...
    }
    if (setsockopt(, IPPROTO_TCP, TCP_KEEPCNT, &val3, sizeof(val3)) < 0) {
        ...
    }

不设置的时候会走系统中对应的配置:

cat /proc/sys/net/ipv4/tcp_keepalive_time
7200

cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

2个小时以后会被操作系统关闭。

guodongxiaren avatar Aug 20 '22 03:08 guodongxiaren

可以通过给客户端socket设置SO_KEEPALIVE参数来实现。开启keepalive操作系统会来探活然后关闭已经断开的socket。

    if (setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) < 0) {
       ...
    }

对代码侵入性比较小。另外可以把把TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT三个socket选项的值提供给Channel设置。 让用户自定义探活动时间

    if (setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &val1, sizeof(val1)) < 0) {
        ... 
    }
    if (setsockopt(cliend_fd, IPPROTO_TCP, TCP_KEEPINTVL, &val2, sizeof(val2)) < 0) {
        ...
    }
    if (setsockopt(, IPPROTO_TCP, TCP_KEEPCNT, &val3, sizeof(val3)) < 0) {
        ...
    }

不设置的时候会走系统中对应的配置:

cat /proc/sys/net/ipv4/tcp_keepalive_time
7200

cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

2个小时以后会被操作系统关闭。

嗯是这个思路。

zyearn avatar Aug 20 '22 18:08 zyearn

这个啥时候发pr

yanglimingcn avatar Dec 02 '22 12:12 yanglimingcn

如果Client和Server端有连接,但长时间没发送数据(Server还活着),Server端会主动关闭这个连接么?

wumuzi520 avatar Apr 18 '23 09:04 wumuzi520

如果Client和Server端有连接,但长时间没发送数据(Server还活着),Server端会主动关闭这个连接么?

brpc server支持关闭空闲连接 https://github.com/apache/brpc/blob/435b5120cb26992d0d7789d959e75135d72cb52e/src/brpc/server.h#L58-L64

chenBright avatar Apr 18 '23 09:04 chenBright

这个啥时候发pr

@yanglimingcn 已合入到master

chenBright avatar Apr 27 '23 09:04 chenBright