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进行保活检测,保证连接的可用性。

边缘节点

负载均衡

常见的负载均衡算法有如:

  1. 轮询

  2. 随机

  3. 加权轮询

  4. 自适应

在goim中选择的是加权轮询:

  1. 每个服务节点都有自己的权重,并且会定时renew当前节点的连接数

  2. 按地区、按权重计算服务IP的排序

  3. 客户端按返回的IP列表顺序,逐个连接尝试建立长连接,直到创建成功

心跳保活

心跳保活可以阻止NAT超时,也是避免长连接断开的一个有效方法。

自适应心跳时间

  1. 心跳可选区间,比如[60s, 300s]

  2. 心跳步长,如step=30s

  3. 心跳周期探测,成功时next=max(cur+step, Max),失败时next=min(cur-step, Min)

长连接断开可能原因

  • NAT超时

  • 所在进行被杀死

  • 网络状态发生变化,如网络切换、断开、重连等

  • 弱网、DHCP租期续租等

维持长连接方案

  • 心跳保活

  • 进程保活(多个进程之间相互拉起保活)

  • 断线重连

用户鉴权与session

推拉结合

读写扩散

全局唯一ID设计

IM私信系统

reference

Terry-Mao/goim

消息推送架构-Based-GOIM

一套简洁的即时通信(IM)系统

alberliu/gim

LinkinStars/simple-chatroom

长连接及心跳保活原理简介

最后更新于

这有帮助吗?