做物联网平台的这些年,有一个很深的体会:技术方案没有绝对的好坏,只有适合不适合。今天聊聊视频监控中心的一些实践经验,供参考。

为什么要关注这个方向

物联网系统是典型的分布式系统,设备端、边缘层、云端、业务系统,每个环节都可能出问题。视频监控中心要解决的核心问题,就是在这种复杂环境下保证系统的可靠性和性能。

很多人觉得这个方向听起来很虚,不如直接写代码实在。但实际情况是,如果前期设计没做好,后期返工的成本会非常高。我们曾经有一个项目,前期为了赶进度没做这方面的设计,结果上线后各种问题,最后花了三个月重构才稳定下来。

核心设计思路

实现视频监控中心,关键是抓住几个核心原则:

解耦 各个环节之间要尽量松耦合。设备接入层只负责收数据,不要直接处理业务逻辑。业务逻辑的变化不应该影响设备连接。这样某个环节出问题时,不会拖垮整个系统。

异步 能异步处理的就异步处理。设备上报的数据先放到消息队列里,消费者按照自己的节奏处理。这样做削峰填谷,即使某个时刻数据量暴增,系统也不会崩。

容错 默认所有环节都可能失败。网络会断、服务会挂、数据库会超时。每个调用都要有超时设置、重试机制、降级方案。关键时刻要能保住核心功能,非核心功能可以暂时舍弃。

一个实际的例子

假设我们要设计一个设备状态监测系统。最朴素的实现可能是:

 ​
 func OnDeviceData(data DeviceData) {
 ​
     // 直接写数据库
     db.Save(data)
     // 检查是否需要告警
     if data.Status == "error" {
 ​
         SendAlert(data.DeviceID)
 ​
     }
 ​
     // 推送给业务系统
     CallBusinessAPI(data)
 ​
 }
 ​

这个写法的问题很明显:数据库慢了会影响设备连接;业务API超时了会拖垮整个处理链路;任何一步出错,数据就丢了。

改进后的写法:

 ​
 func OnDeviceData(data DeviceData) {
 ​
     // 先写消息队列,保证数据不丢
 ​
     mq.Publish("device.data", data)
 ​
 }
 ​
 // 消费者异步处理
 ​
 func ProcessDeviceData(data DeviceData) {
 ​
     // 存储
     go func() {
 ​
         if err := db.Save(data); err != nil {
 ​
             // 失败就重试,不影响主流程
             retry.Save(data)
 ​
         }
 ​
     }()
 ​
 ​
     // 告警检查
 ​
     go func() {
 ​
         if data.Status == "error" {
 ​
             alert.CheckAndSend(data)
 ​
         }
 ​
     }()
 ​
 ​
     // 业务推送(带熔断)
 ​
     go func() {
 ​
         if circuitBreaker.IsOpen() {
 ​
             return // 服务不可用,直接放弃
 ​
         }
 ​
         CallBusinessAPI(data)
 ​
     }()
 ​
 }
 ​

改进后的版本,各个环节互不影响,任何一个环节出问题,都不会影响数据接收。这就是解耦和异步的价值。

踩过的坑

不要过早优化。刚开始做的时候,总想着把各种极端情况都考虑到,结果设计做得过于复杂,开发周期拉长,上线时间推迟。实际上很多"优化"在实际场景中根本用不到。先做出能用的版本,根据实际运行情况再逐步优化。

监控要先行。系统复杂了以后,出问题定位很困难。如果没有完善的监控,出了问题只能靠猜。我们现在的做法是,每个关键环节都有指标上报,有异常自动告警,出现问题能快速定位到具体环节。

文档要及时写。架构设计、接口规范、部署文档,这些当时不写,过段时间自己都不记得了。特别是人员流动的时候,没有文档交接非常困难。

选型建议

关于具体的技术选型,我的一点看法:

消息队列 Kafka 和 RabbitMQ 都可以,Kafka 吞吐量大适合大数据量场景,RabbitMQ 功能丰富适合复杂路由场景。时序数据库 TDengine 和 InfluxDB 都不错,TDengine 国产化支持好,InfluxDB 生态更成熟。

缓存用 Redis 基本不会错。微服务框架如果是 Go 语言,Gin 或 Echo 都可以,不要太纠结,团队熟悉哪个就用哪个。

最重要的是,选型要符合团队的技术栈,不要为了追新而用不熟悉的技术,出了问题没法快速解决。


写在最后

在做物联网平台的过程中,我发现很多开发团队在设备接入、数据处理和可视化这几个环节都会遇到类似的困扰。有时候不是技术难点解决不了,而是缺少一个完整的参考实现。

最近我们在梳理 SagooIoT 企业级开源物联网平台 的架构设计时,把很多实践经验都沉淀到了代码里。如果你也在做相关的东西,不妨去看看,说不定能省掉一些踩坑的时间。

开源地址:https://github.com/sagoo-cloud/sagooiot

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐