brpc
brpc copied to clipboard
Support TCP heartbeat to support the case that brpc client unaware of servers' down
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.
可以通过给客户端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个小时以后会被操作系统关闭。
可以通过给客户端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个小时以后会被操作系统关闭。
嗯是这个思路。
这个啥时候发pr
如果Client和Server端有连接,但长时间没发送数据(Server还活着),Server端会主动关闭这个连接么?
如果Client和Server端有连接,但长时间没发送数据(Server还活着),Server端会主动关闭这个连接么?
brpc server支持关闭空闲连接 https://github.com/apache/brpc/blob/435b5120cb26992d0d7789d959e75135d72cb52e/src/brpc/server.h#L58-L64
这个啥时候发pr
@yanglimingcn 已合入到master