vss-performance 长任务Panic隔离与协程恢复

📅 2026/8/1 1:50:32 👁️ 阅读次数 📝 编程学习
vss-performance 长任务Panic隔离与协程恢复

07 长任务 Panic 隔离与协程恢复

试用安装包下载 | SMS | 在线演示

项目地址:https://github.com/openskeye/go-vss

背景

VSS 长期运行,任何nil 指针、越界、第三方库 bug都可能触发 panic。若 panic 发生在唯一的 SIP 发送循环或 Catalog 定时器里,会导致整类信令崩溃。本仓库对「长生命周期任务」采用defer recover + 休眠重启的策略,把故障限制在单次崩溃,并自动拉起

项目中的做法

SipProc.DO包装每个SipProcLogic

server/sip.goSipProc.DO对每个注册的 Logic(FetchDataLogicSendLogicCatalogLoopLogic等)启动 goroutine,并在参数里注入RecoverCall

  • recover()捕获栈;
  • 打日志;
  • time.Sleep(1 * time.Second)防止 panic 死循环刷日志;
  • 递归调用p.DO(options...)把同一组任务整批重启

DO: 每个 Logic 一个 go

Logic.DO主循环

panic

recover + LogError + Stack

Sleep 1s

p.DO(options...) 重启整批

与「子 proc」的关系

部分 Logic 内部还有子 goroutine(如CatalogLoopLogicgo l.proc()),子协程若 panic 且未 recover,仍会进程崩溃。当前主要防护在外层 DO;对特别关键的proc,可再加一层 recover(后续增强点)。

要点

  1. 1秒退避:避免故障依赖(如 DB 挂了)时CPU 空转 + 日志洪峰
  2. 整批重启:一次DO重启所有 Logic,需保证无全局脏锁;若某 Logic 重启两次可能重复 Listen,当前 SIP Listen 在 main 不在此DO内,风险主要在业务循环
  3. 根因仍需修:recover 是保命不是修复;线上应配告警对接日志关键字Recover

相关代码路径

  • core/app/sev/vss/internal/server/sip.goSipProc.DORecoverCall
  • core/app/sev/vss/main.go— 注册的所有gbs_proc/procLogic