如何让长连接负责均衡呢?

116 天前
 dampler

假设我们有以下机器:

现客户端每隔 10s 向服务器上报心跳,流量路径客户端>CLB>服务器,使用的是 http 连接,keep-alive 设置的 30s 。按理来说连接经过 CLB ,服务器负责的连接是均衡的。

现在,假设故障了 4 台服务器,流量会偏移到一台服务器上,现在重启这 4 台机器,这些连接由于 keep-alive ,不会重新分布。

请问,这种问题怎么解决呢?

2466 次点击
所在节点    Go 编程语言
32 条回复
kxg3030
115 天前
做代理的时候 一般都会禁用 keepalive 头
qinze113
115 天前
用四层 lb 不用要七层 lb,四层 lb 配置成客户端到 LB 保持长连接既可
zhoudaiyu
115 天前
定时踢掉重连
dampler
115 天前
@xxs55 上一家公司就是这样做的
dampler
115 天前
@qinze113 也就是说关闭 keep-alive 功能,使用 clb 的回话保持,对吧。
dampler
115 天前
@raviscioniemeche 好的,这个我也去了解一下啦,禁用和启用的优缺点
dampler
115 天前
@mingyuewandao 很有参考意义,感谢感谢~
dampler
115 天前
@lasuar 明白老哥的意思的,现在的问题是服务端如何感知连接的压力,还有如何感知连接的时长,这个是目前遇到的卡点
photon006
115 天前
好奇长连接为什么不用 websocket ,全双工通讯比 http 更容易操控客户端

crc 算法可以根据多台服务器 ip 实现负载均衡

https://chatgpt.com/share/1a96aad4-ddb9-4b64-9e75-4674d050c9e7

多年以前网易开源游戏引擎 pomelo 就是这样的:

https://github.com/NetEase/pomelo

客户端都会默认自动重连,服务端 kickout 客户端就能恢复均衡,每台服务器连接数也是一目了然。
dampler
114 天前
大结局啦,已经找到解决方案了,祝各位升职加薪,每天开开心心!!!!
https://tencentcloudcontainerteam.github.io/tke-handbook/best-practice/scale-keepalive-service.html
dampler
114 天前
@photon006 业务场景不同吧。我的理解边缘机器并没有那么高的请求。这个和游戏场景还不一样。
dampler
113 天前
server := &http.Server{
Handler: r,
ConnContext: func(ctx context.Context, conn net.Conn) context.Context {
// 每个连接创建一个独立的计数器实例
return context.WithValue(ctx, "counter", new(counter))
},
}

使用 connContext 也是可以的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1056650

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX