我的体会:技术方案没有银弹,只有适合不适合。今天聊聊Python插件集成方案的一些实践经验,供参考。
为什么要关注这个问题
物联网系统是典型的分布式系统,设备端、边缘层、云端、业务系统,每个环节都可能出问题。Python插件集成方案的核心目标,就是在这种复杂环境下保证系统的可靠性和性能。
很多人觉得架构设计很虚,不如直接写代码来得实在。但实际情况是,如果前期设计没做好,后期返工的成本会非常高。我们曾经有个项目,前期为了赶进度没做这方面的设计,结果上线后各种性能问题,最后花了三个月重构才稳定下来。
核心设计思路
实现Python插件集成方案,关键是抓住几个核心原则。
解耦是首要的。各个环节之间要尽量松耦合。设备接入层只负责收数据,不要直接处理业务逻辑。业务逻辑的变化不应该影响设备连接。这样某个环节出问题时,不会拖垮整个系统。
异步处理能大大提升系统的吞吐量。能异步处理的就异步处理。设备上报的数据先放到消息队列里,消费者按照自己的节奏处理。这样做削峰填谷,即使某个时刻数据量暴增,系统也不会崩。
容错设计必不可少。默认所有环节都可能失败。网络会断、服务会挂、数据库会超时。每个调用都要有超时设置、重试机制、降级方案。
一个具体的实现例子
假设我们要设计一个设备状态监测系统。最朴素的实现可能是收到数据后直接处理:
收到设备数据,直接写数据库。检查是否需要告警,如果需要就发送告警。推送给业务系统。
这个写法的问题很明显。数据库慢了会影响设备连接。业务API超时了会拖垮整个处理链路。任何一步出错,数据就丢了。
改进后的做法是先写消息队列,保证数据不丢。然后异步处理,存储、告警、业务推送分别用不同的消费者处理。即使某个环节出问题,也不影响其他环节。
实际踩过的坑
不要过早优化。刚开始做的时候,总想着把各种极端情况都考虑到,结果设计做得过于复杂,开发周期拉长。实际上很多优化在实际场景中根本用不到。先做出能用的版本,根据实际运行情况再逐步优化。
监控要先行。系统复杂了以后,出问题定位很困难。如果没有完善的监控,出了问题只能靠猜。每个关键环节都要有指标上报,有异常自动告警。
文档要及时写。架构设计、接口规范、部署文档,这些当时不写,过段时间自己都不记得了。
关于技术选型
消息队列Kafka和RabbitMQ都可以,Kafka吞吐量大适合大数据量场景,RabbitMQ功能丰富适合复杂路由场景。
时序数据库TDengine和InfluxDB都不错,TDengine国产化支持好,InfluxDB生态更成熟。
缓存用Redis基本不会错。微服务框架如果是Go语言,Gin或Echo都可以,不要太纠结,团队熟悉哪个就用哪个。
最重要的是,选型要符合团队的技术栈,不要为了追新而用不熟悉的技术,出了问题没法快速解决。
写这篇文章的时候,想起刚开始做物联网平台那会儿,走了不少弯路。有些东西书上看觉得很简单,真到生产环境才发现坑不少。
最近整理 SagooIoT 的代码,发现很多当时踩过的坑现在都有现成的方案了。如果你也在做类似的东西,不妨去逛逛,说不定能少走几步弯路。

1611

被折叠的 条评论
为什么被折叠?



