本文由石墨文档技术杜旻翔分享,原题“石墨文档 Websocket 百万长连接技术实践”,即时通讯网收录时有修订。
cover-opti.png (14.68 KB, 下载次数: 1081)
下载附件 保存到相册
3 年前 上传
1.png (7.26 KB, 下载次数: 1052)
2.png (7.49 KB, 下载次数: 1160)
3.png (14.57 KB, 下载次数: 1057)
4.png (60.91 KB, 下载次数: 1061)
5.png (23.93 KB, 下载次数: 1091)
6.png (14.23 KB, 下载次数: 1218)
7.png (29.82 KB, 下载次数: 1133)
for { select { case <-t.C: var now = time.Now().Unix() var clients = make([]*Connection, 0) dispatcher.clients.Range(func(_, v interface{}) bool { client := v.(*Connection) lastTs := atomic.LoadInt64(&client.LastMessageTS) if now-lastTs > int64(expireTime) { clients = append(clients, client) } else { dispatcher.clearRedisMapping(client.Id, client.Uid, lastTs, clearTimeout) } return true }) for _, cli := range clients { cli.WsClose() } } }
8.png (36.74 KB, 下载次数: 1080)
9.png (24.18 KB, 下载次数: 1159)
type Packet struct { ... } type Connect struct { *websocket.Con send chan Packet } func NewConnect(conn net.Conn) *Connect { c := &Connect{ send: make(chan Packet, N), } go c.reader() go c.writer() return c }
type Packet struct { ... } type Connect struct { *websocket.Conn mux sync.RWMutex } func NewConnect(conn net.Conn) *Connect { c := &Connect{ send: make(chan Packet, N), } go c.reader() return c } func (c *Connect) Write(data []byte) (err error) { c.mux.Lock() defer c.mux.Unlock() ... return nil }
var ConnectionPool = sync.Pool{ New: func() interface{} { return &Connection{} }, } func GetConn() *Connection { cli := ConnectionPool.Get().(*Connection) return cli } func PutConn(cli *Connection) { cli.Reset() ConnectionPool.Put(cli) // 放回连接池 }
ping -s {a} {ip}
10.png (7.65 KB, 下载次数: 1112)
11.png (10.13 KB, 下载次数: 1136)
12.png (23.74 KB, 下载次数: 1128)
13.png (15.57 KB, 下载次数: 1144)
14.png (21.09 KB, 下载次数: 1120)
15.png (42.63 KB, 下载次数: 1099)
16.png (9.73 KB, 下载次数: 1057)
42["message",{"type":"xx","data":{"type":"xx","clients":[{"id":xx,"name":"xx","email":"xx@xx.xx","avatar":"ZgG5kEjCkT6mZla6.png","created_at":1623811084000,"name_pinyin":"","team_id":13,"team_role":"member","merged_into":0,"team_time":1623811084000,"mobile":"+xxxx","mobile_account":"","status":1,"has_password":true,"team":null,"membership":null,"is_seat":true,"team_role_enum":3,"register_time":1623811084000,"alias":"","type":"anoymous"}],"userCount":1,"from":"ws"}}]
17-1.png (10.16 KB, 下载次数: 1090)
17-2.png (14.49 KB, 下载次数: 1160)
17-3.png (8.9 KB, 下载次数: 1105)
17-4.png (11.27 KB, 下载次数: 1134)
18.png (20.61 KB, 下载次数: 1034)
19.png (11.28 KB, 下载次数: 1074)
20.png (11.75 KB, 下载次数: 1100)
21.png (10.3 KB, 下载次数: 1068)
22.png (9.79 KB, 下载次数: 1035)
23-1.png (10.04 KB, 下载次数: 1077)
23-3.png (8.78 KB, 下载次数: 1065)
23-2.png (22.38 KB, 下载次数: 1108)
23-4.png (13.97 KB, 下载次数: 1089)
24.png (23.27 KB, 下载次数: 1089)
25.png (10.4 KB, 下载次数: 1067)
26-1.png (13.07 KB, 下载次数: 1058)
26-2.png (15.58 KB, 下载次数: 1118)
26-3.png (14.19 KB, 下载次数: 1108)
26-4.png (9.22 KB, 下载次数: 1097)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:WarriorFromLong 发表于 2023-09-24 13:17 对于弃nginx的架构设计,有一点无法理解。他们是怎么做到,用户的请求负载均衡的呢。 网关部署在多台服 ...
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140625 second(s), 38 queries , Gzip On.