SkeyeVSS开发心得-信令发送流水线与注意事项

张开发
2026/4/8 0:22:29 15 分钟阅读

分享文章

SkeyeVSS开发心得-信令发送流水线与注意事项
开发心得信令发送流水线本文是 VSS流播放详解 的配套开发笔记。项目源码地址https://github.com/openskeye/go-vss1. 三个要点国标出站 SIP 不要绕过SendLogic业务、HTTP、定时器只往svcCtx.SipSendXXX里投递直接拿gosip在别处Send等于拆掉「单写出口」并发事务和排障都会变差。types.RequestSipCatalogLoopMap是设备真实来源没注册进 map大量 HTTP/信令路径会DeviceUnregisteredNewGBSSender第三参在 Invite 等场景常是通道 ID与 Catalog 用的设备 ID别混详见 5.1。SipSend*channel 有界默认 100洪峰时-会阻塞生产者要考虑节流、异步、或扩容缓冲别假设「发进 channel 就等于已经发出 SIP」。2. 总线模型一条select多路投递for { select { case v : -l.svcCtx.SipSendCatalog: go func(v *types.Request) { if err : l.catalog(v); err ! nil { functions.LogError(send catalog failed err: , err) } }(v) // ... SipSendDeviceInfo / VideoLiveInvite / ... } }外层一条select保证同一时刻只从一个SipSend*取一条不会在select里做重逻辑。内层普遍go funcInvite / MS / SDP慢指令不卡住其它信令代价是错误大多只打日志HTTP 层拿不到SendLogic的 error—— heart flow 要靠StepRecord/日志/MS 状态见 §8。3.InitFetchDataState.Wait()和谁对齐SendLogic与其它 gbs_proc 一样在DO开头Wait()FetchData 两条分支各Done一次之后才消费SipSend*。心得冷启动结束前往SipSendCatalog里塞任务可能被长时间阻塞在 send 侧若 nobody 消费集成测试里要先等数据就绪或mock 缩短启动链。4. Catalog与 2.4.1.2 及catalog_loop.go一致来源行为注册成功1sSipSendCatalog立即SipCatalogLoop登记心跳map 无记录时补 Catalog 补 loopCatalogLoop.proc每秒扫表判据item.Now%val.Unix()CatalogInterval在常见配置下几乎不命中规划时每 N 秒自动 Catalog只改 YAML 不够要对齐proc否则线上目录仍主要靠注册/心跳/手工。若要严格周期需要改catalog_loop.go或另起定时任务往SipSendCatalog投递。5.ThrottleFixedGridTrailingCatalog 上的节流器catalog里对同一req.ID做约 3 秒栅格合并避免短时间多次 Catalog打爆设备。调试时狂点「刷新目录」可能只看到最后一次真正发出前后请求在日志里像是被丢弃了。别在节流键里用错 ID应用设备国标 ID与NewGBSSender(..., req, req.ID)一致。6.SipCatalogLoopMap扩展 HTTP 时的必查点大量video_live_invite、手工 Catalog、部分诊断都是SipCatalogLoopMap.Get(deviceUniqueId)。设备刚上线 1s 内、或心跳未补 loop前map 可能暂时没有前端连点播放会得到未注册。注销路径要SipCatalogLoop Online:false否则恶意请求仍可能往里塞与register.go一致性有关。7.VideoLiveInvite不在GBSSender里结束流水线MS RTPPub → INVITE → ACK → 解析 200 SDP → MS ACKRtpPub → 状态位。并写入AckRequestMap供BYE。Invite 成功不等于浏览器已能播播放器问/video/stream信令问SIP/MS。见 [5.4 流播放开发心得]。From/To/Via/SDP填错全是身份混淆问题见5.1 / 2.4.1.1 SDP。8. 错误可见性SipSendVideoLiveInvite - msg只说明任务进入总线真正失败可能在VideoLiveInvite内MS、SIP 状态码、SDP 解析最终LogError。inviteStep/StepRecord给前端时间线若产品要HTTP 同步失败码要在Invite 之前或 在轮询、WS设计不能假设SendLogic会把 error 抛回 HTTP。9. 新增一种出站信令时types.ServiceContext增加SipSendXxx chan *YourReq容量根据需求约定默认 100。service_context.NewServiceContext里make(chan ...)。SendLogic.DO增加casego func 独立SendLogic方法。业务侧只做svcCtx.SipSendXxx - ...禁止复制粘贴GBSSender.Send到 handler。慢调用必须context/超时或可取消避免goroutine 堆积。若依赖已注册先SipCatalogLoopMap.Get再组GBSSender。10. 联调清单新逻辑是否只通过已有SipSend*发出 SIP是否误用NewGBSSender第三参设备 vs 通道是否会在channel 满时阻塞SIP 收包线程 / HTTP 请求Catalog/目录类是否接受3s 节流、定时 proc 可能不触发的现状Invite/Media 类是否验证AckRequestMap清理BYE、stop_stream无泄漏InitFetchDataState与集成测试启动顺序是否一致11. 相关文档文档内容2.4.1.2 信令发送流水线正文设计与表2.4.1.4 国标设备注册注册与 map 写入5.1 信令与 SDPINVITE 头与 SDP5.0 ServiceContextchannel / map 总览主源码internal/logic/gbs_proc/send_sip_proc.go、catalog_loop.go、internal/pkg/sip/gbs_send.go、internal/svc/service_context.go。

更多文章