skeyevss-performance 多协议监听与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。国标设备侧常混用两种传输并行监听避免在单协议上排队同时充分利用多核。SIP 监听SipGbsServer TCPSipGbsServer UDP终端/平台RegisterHandlers2. 发送侧单协程select多路 channel任务再go出去SendLogicsend_sip_proc.go主循环从多个SipSend*channel 收消息每类消息再起独立 goroutine执行实际catalog/invite/bye等。这样分发协程不会被慢设备或网络 RTT 阻塞能继续消费队列不同信令类型之间互不抢锁除共享svcCtx内状态外。按任务 go funcSendLogic selectSipSend* channels缓冲 100信令生产者HTTP 内部接口WebSocketCatalog/心跳定时SipSendCatalogSipSendVideoLiveInvite...读队列catalog()VideoLiveInvite()3. 启动屏障InitFetchDataStateSIP Server 在Listen前执行svcCtx.InitFetchDataState.Wait()见sip.go保证字典、设置、流媒体列表等已从 DB RPC 拉取完毕再对外收包。避免「注册」时大量REGISTER命中未就绪配置造成重试与无效 RPC。SipGbsServerFetchDataLogicMainSipGbsServerFetchDataLogicMainInitFetchDataState 等待首轮数据DoneListen TCP/UDP要点不要把 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— 多路selectgo发送