EasyDSS点击视频广场偶尔出现“网络请求失败”的修复方案

博客讨论了在EasyDSS视频直播/点播服务平台中遇到的接口返回400错误的问题,该问题源于/vod/sharelist接口。经过调查,发现是由于全局变量sysConfig在并发环境下可能被意外重置为初始化值。为解决此问题,文章提出了引入读写锁(sync.RWMutex)来确保在更新配置时的线程安全,从而保证读取的系统配置始终是最新的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyDSS视频直播/点播服务平台诞生至今,我们做了不少版本的功能更新和升级,除EasyDSS外,TSINGSEE青犀视频全线平台均有演示平台供参考,用户可以进入演示平台阅览界面,也有测试版本供大家下载测试。若大家有兴趣可以联系我们进行测试。EasyDSS 的视频模块,用户反馈会出现网络请求失败的问题,需要刷新页面则正常显示。

image.png

查看后台日志,发现是 /vod/sharelist 接口返回 400 错误,导致的问题。源代码如下:

if !dao.SYSConfig().VODOpenSquare {
   c.AbortWithStatus(http.StatusBadRequest)
   return
}

用户的现场,视频广场功能已经打开,因此原则上该返回值应该永远不会被调用。因此说明 dao.SysConfig() 函数中返回的系统配置应该是不正确的。

在后台添加打印信息,发现 dao.SysConfig() 在运行过程中确实会出现全部变为初始化值的问题。默认代码如下:

//SYSConfig  sytem config
func SYSConfig() *do.TConfig {
   if sysConfig != nil {
      return sysConfig
   }
   return SYSConfigLoad()

}

func SYSConfigLoad() *do.TConfig {
   sysConfig = &do.TConfig{}
   GetDB().Where(consts.SqlWhereID, consts.PlatformID).First(sysConfig)
   configSys := &do.TConfigSys{}
   GetDB().First(configSys, "local_ip = ?", utils.LocalIP())
   //配置外网IP
   sysConfig.ExternalIP = configSys.ExternalIP
   return sysConfig
}

以上 SysConfig 代码如果不为空则直接返回,会带来以上问题。如果有人在调用 SysConfig() 代码的时候,另外一个部分调用了 SysConfigLoad(),全局的 sysConfig 就会被初始化,因此出现会获取到全部都是初始值的情况。

添加锁的代码,来保证更新配置的时候,不会被其他人读取到。因此修改代码如下:

//SYSConfig  sytem config
func SYSConfig() *do.TConfig {
   if sysConfig != nil {
      sysCfgLock.RLock()
      defer sysCfgLock.RUnlock()
      return sysConfig
   }
   return SYSConfigLoad()

}

func SYSConfigLoad() *do.TConfig {
   sysCfgLock.Lock()
   defer sysCfgLock.Unlock()

   sysConfig = &do.TConfig{}
   GetDB().Where(consts.SqlWhereID, consts.PlatformID).First(sysConfig)
   configSys := &do.TConfigSys{}
   GetDB().First(configSys, "local_ip = ?", utils.LocalIP())
   //配置外网IP
   sysConfig.ExternalIP = configSys.ExternalIP
   return sysConfig
}

添加 sysCfgLock 这个 sync.RWMutex{} 类型的读写锁,在更新 sysConfig 的时候,添加上写锁,则其他协程则不会访问成功,来保证读取的数据是最新的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值