3.1 vss-performance 多协议监听与SIP发送流水线异步化
VSS 多协议监听与 SIP 发送流水线异步化
试用安装包下载 | SMS | 在线演示
项目地址:https://github.com/openskeye/go-vss
背景
VSS 同时承担GB28181 信令面(SIP)与媒体面回调(HTTP通知、WebSocket、SSE)。若信令处理与业务发送在同一线程或同步阻塞,单路设备抖动会拖慢整进程吞吐。本仓库采用多监听 + 有界队列 + 分发协程将「收包」与「发信令」解耦。
项目中的做法
1. GBS 双栈监听(TCP / UDP 并行)
main.go中用sync.WaitGroup启两个 goroutine,分别对 GBS 注册同一套 Handler,绑定TCP与UDP。国标设备侧常混用两种传输,并行监听避免在单协议上排队,同时充分利用多核。
2. 发送侧:单协程select多路 channel,任务再go出去
SendLogic(send_sip_proc.go)主循环从多个SipSend*channel 收消息;每类消息再起独立 goroutine执行实际catalog/invite/bye等。这样:
- 分发协程不会被慢设备或网络 RTT 阻塞,能继续消费队列;
- 不同信令类型之间互不抢锁(除共享
svcCtx内状态外)。
3. 启动屏障:InitFetchDataState
SIP Server 在Listen前执行svcCtx.InitFetchDataState.Wait()(见sip.go),保证字典、设置、流媒体列表等已从 DB RPC 拉取完毕再对外收包。避免「注册」时大量REGISTER命中未就绪配置,造成重试与无效 RPC。
要点
- 不要把 SIP 回调里重逻辑直接阻塞:应投递到 channel 或由短函数快速返回。
- 缓冲深度100是折中:过小易反压 HTTP;过大掩盖积压,需配合监控。
- per-message goroutine在极高并发下会增加调度开销;若未来单机信令 QPS 再上一个量级,可改为固定 worker 池+ 按
deviceId分片串行(当前以简单与隔离为主)。
相关代码路径
core/app/sev/vss/main.go— 监听、NewSipProc().DO(...)core/app/sev/vss/internal/server/sip.go—InitFetchDataState.Wait()core/app/sev/vss/internal/logic/gbs_proc/send_sip_proc.go— 多路select+go发送
