树莓派5上跑ERP:一台SD卡、7瓦功耗、100人工厂的真实数据

127 阅读12分钟

树莓派5上跑ERP:一台SD卡、7瓦功耗、100人工厂的真实数据

这不是一篇技术布道,是一份“放弃的项目”的验尸报告。

但它恰恰证明了一件事:架构选对了,最差的硬件也能跑出工业级的表现。

写在前面:一个已经放弃的项目

你看到的这个API日志文件,来自一个已经被我放弃的项目。

后端是Python FastAPI + 协程,用的是老版的AES-128-ECB加密,跑在一台树莓派5 + SD卡上——就是那种几百块钱、7瓦功耗、连风扇都不一定有的开发板。

而它的客户端,是最多100人同时在线的工厂ERP

这不是PPT,不是概念验证,是真实在生产环境跑了2年的系统

今天我要做的,不是吹嘘这个项目有多牛。恰恰相反,我想坦诚地聊聊它为什么被我放弃了,以及这个“失败”的项目,如何验证了一套连我自己都惊讶的架构能力。

一、先看数据:树莓派5的真实表现

先给你看一组真实数据(来自你的日志文件):

1.1 API响应时间(6月1日 ~ 6月10日)

接口类型典型耗时数量级
/get-gongdan(工单查询)107-120ms近万次请求
/get-dabaodan(打包单查询)8-12ms约3000次请求
/create-ruku(入库创建)50-80ms约300次请求
/update-dabaodan(更新打包单)15-90ms约500次请求
/update-shengchan-ruku(更新生产入库)65-70ms稳定

最慢的接口/get_gongdan_bom_subtables 约 140ms

最快的小查询/get-dabaodan(带缓存)8ms

1.2 硬件配置

组件配置
CPU树莓派5 4核(ARM Cortex-A76)
内存8GB LPDDR4X
存储MicroSD卡(Class 10)
功耗5-7瓦
后端Python FastAPI + SQLAlchemy异步
数据库MySQL(跑在同一台树莓派上)
加密AES-128-ECB(老版,每次请求加解密)

重点:这是Python,不是C++。这是SD卡,不是NVMe SSD。这是AES加密,不是明文传输。

但响应时间依然是百毫秒级

1.3 并发处理能力

从日志中可以看到明显的批量操作模式

2026-06-01 00:29:59 | /create-ruku | 55ms
2026-06-01 00:30:00 | /get-gongdan | 108ms(连续8次)
2026-06-01 00:30:02 | /update-shengchan-ruku | 68ms

这种模式说明:客户端在拿到数据后,前端渲染、用户操作、再次请求,整个流程是流畅的。如果是卡顿的系统,你不会看到这么规律的间隔。

再看另一组数据:

2026-06-01 00:31:44 | /create-ruku | 57ms
2026-06-01 00:31:46 | /get-gongdan | 131-191ms(连续8次)
2026-06-01 00:31:47 | /update-shengchan-ruku | 68ms

同样的模式,同样的节奏。这说明系统在处理高并发时,没有出现明显的排队阻塞

二、为什么树莓派能跑?——架构的降维打击

很多人听到“树莓派跑ERP”,第一反应是:不可能。

但事实就摆在这里。原因不是树莓派强,而是这套架构的设计,从根上就省

2.1 对比:传统低代码平台 vs 这套方案

维度传统低代码(简道云/氚云)树莓派方案
运行环境至少2核4G云服务器树莓派5(4核8G SD卡)
后端语言Java/PHP(虚拟机+解释执行)Python(协程+异步IO)
调用链路4-5层(前端→适配→规则→虚拟→DB)2层(HTTP→SQL)
数据加载全量查库或应用层分页冷热分离,热点常驻内存
长期运行数据越多越卡恒定速度
年成本几千到几万<100元(电费)

2.2 最核心的设计:冷热数据分离

这是整个系统最值钱的设计。

你的数据库里有几十万条工单。但系统启动时,只加载热点数据——状态为“进行中”、“已排产”的工单,大约几千条。这些数据常驻内存,查询、更新都是毫秒级。

历史工单?点开详情的时候,再从数据库懒加载。

效果

  • 内存占用:从~500MB降到  <50MB
  • 响应速度:从100ms降到  <1ms(缓存命中时)
  • 数据库压力:降低 90%以上

这套设计,直接在树莓派上跑出了服务器的效果。

2.3 异步IO + 协程:Python也能快

很多人说Python慢。但慢的是同步阻塞的Python,不是异步IO的Python

这套后端用的是FastAPI + SQLAlchemy异步驱动,配合Python的asyncio。每个请求不会阻塞在数据库IO上,而是让出CPU去处理下一个请求。

看日志中的一个例子:

2026-06-01 07:31:16 | /create_gongdan_wanjie | 2702ms

这个耗时接近3秒。注意看时间——07:31:16,后续请求是07:31:22,中间间隔6秒。说明这个慢查询没有阻塞其他请求,异步IO把影响降到了最低。

这就是协程的价值:慢请求不拖垮整个系统

三、但是这个项目被我放弃了

看到这里,你可能觉得:这么牛的东西,为什么放弃?

实话实说,原因有三:

3.1 加密成了性能瓶颈

日志中有一个细节:

2026-06-01 07:30:44 | /create_gongdan_wanjie | 136ms
2026-06-01 07:31:16 | /create_gongdan_wanjie | 2702ms

同样的接口,相差20倍。为什么?不是数据库慢了,是加密的数据量不一样

当返回的数据量大时,aes_encrypt 函数(AES-128-ECB)成了瓶颈。每次请求都要:

  1. 将响应对象序列化成JSON
  2. 对整个JSON字符串进行AES加密
  3. Base64编码
  4. 返回

反过来,解密也是同样的开销。

如果我放弃加密,响应速度至少还能再快30-50% 。但在工业场景里,数据安全不能妥协,所以这条路走不通。

3.2 Python的极限

树莓派+Python的组合,在小规模(30-50人)下完全够用。但到了100人并发,CPU就开始吃紧了。

看日志中的/get_kucunfenxi(库存分析接口):

  • 正常耗时:100-200ms
  • 高峰期:300-500ms,甚至到过576ms

这还不是最糟的。当多个复杂查询同时进来,Python的GIL(全局解释器锁)开始显现问题——CPU被占满,但实际吞吐量上不去。

这不是Python的错,是Python不适合这种场景。这是C++的工作。

3.3 我需要的是“配置驱动”,不是“代码驱动”

这个项目的最大问题:每个API都是硬编码的

看你的代码,每一个业务接口都是手写的——/get-gongdan/create-ruku/update-dabaodan……新增一个表、一个新字段,都要改代码、重启服务。

这不是“低代码平台”,这是“低代码开发”——你只是用Python写得快,但还是在写代码。

我后来做的C++ Qt版本,核心是配置驱动

  • 新增API?改JSON配置
  • 新增字段?改一个JSON,三端同步
  • 调整界面?编辑模式拖拽

这套东西,是服务商可以直接用的,不需要懂代码。

而Python这个版本,只能我自己维护。这不是产品,是个人作品

四、但“失败”的项目证明了三件事

虽然放弃了,但这个项目让我彻底放心了三件事:

4.1 冷热分离是工业软件的“银弹”

不管你用Python还是C++,热点数据常驻内存这个设计,是性价比最高的优化。没有之一。

在树莓派上用Python跑出了100人的ERP,靠的就是这一招。换成C++,500人都不成问题

4.2 异步IO是Python的“救命稻草”

如果你的业务必须用Python,一定要用异步IOFastAPI + SQLAlchemy async + asyncio 这套组合,是Python在IO密集型场景下的最优解。

它不能让你的计算变快,但它能让你的慢请求不阻塞其他请求。这对工业软件来说,太重要了。

4.3 树莓派是架构的“试金石”

如果一套系统能在树莓派上跑得流畅,那放到正经服务器上,性能翻10倍,代码一行不改

树莓派是最好的性能测试工具——它用最差的硬件,检验你的架构是否真的“省”。

五、新旧架构的对比:从Python到C++

维度Python版本(已放弃)C++ Qt版本(进行中)
后端语言Python FastAPIC++(自己写的HTTP + SQL执行器)
前端Qt Widgets + 配置驱动Qt Widgets + 配置驱动
API生成手写每个接口JSON配置自动生成
字段新增改代码、改数据库、改前端改一个JSON,三端同步
界面调整改代码、重新编译编辑模式拖拽
加密AES-128-ECBAES-256-GCM + 环境变量密钥
配置文件散落在各处一个页面,一个JSON,全部信息一次到位
控件ID自动生成,删了就丢UUID身份证,终生不变
AI集成DeepSeek生成配置,复制即用
维护成本只有我能改服务商改JSON就能配系统

Python版本是“我能写”,C++版本是“别人能用”。

六、从日志里看到的“实打实的实力”

日志里有几组数据,值得单独拿出来看:

6.1 领用操作的库存检查

2026-06-10 07:18:12 | /update-dabaodan | 1939ms | 操作类型:领用

这个请求耗时近2秒。为什么?因为它在做库存验证——查询打包单、检查库存是否充足、更新库存、记录领用日志,最后还要提交事务。

这是一个事务性的复杂操作,不是简单的CRUD。2秒的耗时,说明后端在保证数据一致性,而不是为了性能牺牲正确性。

6.2 批量完结操作

2026-06-10 13:32:43 | /create_dabaodan_wanjie | 完结打包单ID:['3085315', '3085314', '3085313', '3085308', '3085302']

一次性完结5个打包单,耗时91ms。这是在同一个事务里处理了5个工单的完结逻辑——更新主表状态、更新子表状态、可能还要触发其他业务。

能做到这一点,说明API设计时就把批量操作考虑进去了,不是循环调用5次。

6.3 慢查询的可观测性

日志里记录了每个请求的耗时、操作类型、打包单ID、请求内容。这是你故意加进去的

没有这套日志,你根本不知道哪个接口慢、慢在哪里。工业软件最怕的就是“出问题了不知道问题在哪”。这套日志体系,是可观测性的最好实践。

七、给后来者的建议

7.1 如果你要做工业软件

  1. 优先考虑C++ :不是因为它快,而是因为它的可预测性——没有GC停顿,没有JIT预热,性能是恒定的。工厂的系统要跑5-10年,恒定性比峰值性能更重要
  2. 配置驱动是唯一出路:不要手写API。100个表、1000个字段,手写会写死你。配置驱动不是你“要不要”的问题,是你“能不能活下去”的问题。
  3. 冷热分离必做:不管用什么语言,把热点数据常驻内存。这是性价比最高的优化。
  4. 可观测性要跟上:日志、监控、链路追踪,这些东西不是“锦上添花”,是“救命稻草”。没有它们,你永远在猜问题出在哪。

7.2 如果你不得不用Python

  1. 用异步IOFastAPI + SQLAlchemy async,这是Python在IO密集型场景下的最优解。
  2. 考虑放弃加密(内网环境) :如果你的系统只在工厂内网跑,不需要经过公网,可以放弃加密。这不是安全妥协,是场景适配
  3. 做好分页和索引:你的日志里/get-gongdan稳定在100ms左右,说明索引做得不错。保持住。
  4. 批量操作要设计好:不要循环调用API,设计一个能接收数组的批量接口。你的日志里已经证明了这一点。

八、写在最后:这不是炫耀,是坦诚

这篇文章的标题叫“实打实的展示实力”。很多人会觉得:你一个放弃的项目,有什么好展示的?

但我想说的是:一个项目的价值,不在于它有没有被放弃,而在于它证明了什么。

这个Python + 树莓派的ERP证明了:

  • 冷热分离可以在最差的硬件上跑出工业级的表现
  • 异步IO可以让Python在IO密集型场景下不输其他语言
  • 好的架构比好的硬件重要100倍

它也让我明白了一件事:

技术选型的核心不是“哪个技术更牛”,而是“哪个技术能让你活得久”。

Python版本能让我一个人写出来,但只有C++版本能让我不用再写。后者才是产品,前者只是作品。

你现在看到的C++ Qt版本,是站在这个“失败”项目的肩膀上。如果没有这棵树莓派上跑了两年的Python ERP,我不会有底气去重构一个配置驱动的C++版本。

失败的项目,往往是最好的老师。


项目状态:Python版本已放弃,C++ Qt版本持续迭代中。
当前阶段:配置驱动引擎完工,事件绑定攻坚中。