goim长连接TCP编程
[TOC]
概览

长连接层Comet
主要用于监控外网TCP/WebSocket端口,并且通过设备ID进行绑定Channel实现,以及实现了Room合适直播等大房间消息广播。
业务逻辑层Logic
监控连接Connect,Disconnect事件,可以自定义鉴权,进行记录Session信息(设备ID、ServerID、用户ID等),业务可通过设备ID、用户ID、RoomID及全局广播进行消息推送。
推送能力层Job
通过消息队列的进行消息削峰处理,并把消息推送到对应Comet节点。
协议设计
字段
帧大小
解释
package length
4 bytes
包长度
header length
2 bytes
头长度
protocol version
2 bytes
协议版本
operation
4 bytes
操作码,如Auth、Heartbeat、Message
sequence id
4 bytes
请求序列ID,按请求、响应递增
body
PackageLen - HeaderLen
包内容
边缘节点
服务节点将会部署在多个地区,节点之间通过云VPC专线通信。
用户需要建立连接时(TCP或WebSocket),会优先分配给距离较近的节点建立连接,并且通过应用层Heartbeat进行保活检测,保证连接的可用性。

负载均衡
常见的负载均衡算法有如:
轮询
随机
加权轮询
自适应
在goim中选择的是加权轮询:
每个服务节点都有自己的权重,并且会定时renew当前节点的连接数
按地区、按权重计算服务IP的排序
客户端按返回的IP列表顺序,逐个连接尝试建立长连接,直到创建成功
心跳保活
心跳保活可以阻止NAT超时
,也是避免长连接断开的一个有效方法。
自适应心跳时间
心跳可选区间,比如[60s, 300s]
心跳步长,如step=30s
心跳周期探测,成功时next=max(cur+step, Max),失败时next=min(cur-step, Min)
长连接断开可能原因
NAT超时
所在进行被杀死
网络状态发生变化,如网络切换、断开、重连等
弱网、DHCP租期续租等
维持长连接方案
心跳保活
进程保活(多个进程之间相互拉起保活)
断线重连
用户鉴权与session
推拉结合
读写扩散
全局唯一ID设计
IM私信系统
reference
最后更新于
这有帮助吗?