自动售货机MQTT通信踩坑实录:从掉线丢消息到百万级设备稳定在线的进化之路~YH
MQTT是物联网的事实标准自动售货机也不例外。但把MQTT跑稳尤其是在工业环境下跑稳比想象中难得多。一、协议选型为什么是MQTT不是HTTP做设备通信方案设计的时候第一个问题就是用HTTP还是MQTTHTTP的优点是简单谁都会用。缺点也很明显轮询效率低、实时性差、服务器压力大。每台设备每隔几秒就轮询一次一万台设备就是每秒几千次请求服务器扛不住。MQTT的优势长连接、实时推送、协议轻量、支持大规模并发。一台MQTT服务器可以扛几万到几十万台设备。消息是实时推送的不需要轮询。所以在售货机场景下MQTT是唯一合理的选择。二、QoS级别怎么选这是一个哲学问题MQTT有三个QoS级别。我们花了两周时间在这上面纠结。QoS 0最多分发一次。消息可能丢但开销最小。QoS 1至少分发一次。消息不丢但可能重复。QoS 2正好一次。消息不丢不重复但开销最大。我们的选择大部分消息用QoS 1支付相关用QoS 2心跳用QoS 0。开门指令、支付结果这类消息不能丢用QoS 1确保送达。重复消费虽然麻烦但可以幂等处理。心跳丢了无所谓下一个心跳周期会补上。支付相关的关键指令用QoS 2——虽然开销大但出错代价更高。坑点提醒QoS 2在大规模场景下性能下降明显。如果设备数量超过5万台QoS 2的吞吐量可能成为瓶颈。此时需要在QoS 1 应用层去重和QoS 2之间做权衡。三、心跳间隔设多少30秒是经验值心跳太频繁服务器压力大设备耗电。心跳间隔太长断线检测不及时。我们经过压测得出的结论心跳间隔30秒是最优值。设备每30秒发一次PINGREQ。服务器在1.5倍心跳间隔45秒内没收到心跳判定设备离线。但不断开连接再等1.5倍间隔90秒还没收到彻底断开并触发遗嘱消息。实测数据30秒心跳间隔下单台服务器能稳定支撑2.8万到3.2万台设备。超出这个数量需要做集群。四、遗嘱消息设备死了要让服务器知道这是MQTT最被低估的功能但在售货机场景里超级有用。设备连接时设置遗嘱消息Last Will——如果我异常断线了把这个消息发到指定Topic。服务器收到后可以立即知道哪台设备离线了触发告警。我们利用遗嘱消息实现了设备异常离线告警——运维团队会在5秒内收到钉钉通知比用户发现机器黑屏快了至少10分钟。五、消息持久化断网期间的消息不能丢这是生产环境最大的坑。设备断网期间云端下发的指令改价、调温、远程开门如果设备收不到会造成很严重的问题。我们的方案云端消息下发时先存入数据库状态标记为未送达。设备上线后云端检查所有未送达消息批量推送给设备。设备端收到消息后回复ACK确认。云端收到ACK后将消息状态更新为已送达。消息有效期超过24小时未送达的消息自动失效运维人员会收到通知手动处理。这个机制保证了一台设备断网一周后重新上线期间的所有指令都能被正确执行。六、Topic设计分得越细越好Topic设计决定了消息路由的灵活性和系统扩展性。我们的Topic分层vending/{deviceId}/state/online - 设备上线通知vending/{deviceId}/state/heartbeat - 设备心跳vending/{deviceId}/command/price/update - 云端下发改价指令vending/{deviceId}/command/temperature/set - 云端下发调温指令vending/{deviceId}/event/order/paid - 设备上报支付成功vending/{deviceId}/event/error - 设备上报故障这种设计的好处运维人员可以订阅特定设备的特定事件数据分析系统可以只订阅event/order相关Topic云端可以批量下发指令。七、性能压测数据这是我们压测的最终数据供参考指标数值单服务器最大设备连接数3.2万台消息吞吐量QoS 18600条/秒消息吞吐量QoS 22100条/秒平均消息延迟120ms99.9%消息延迟380ms系统可用性99.97%八、总结MQTT看起来很轻量但要把生产环境的稳定性做好需要从QoS、心跳、遗嘱、持久化、Topic设计等多个维度去优化。最核心的一条经验MQTT不是搭起来就能用的基础设施它需要根据业务场景做大量配置和二次开发才能支撑百万级设备的稳定在线。

相关新闻

降AI率黑科技实测!降AI率软件留学生亲测:Turnitin检测AI率直接归零全绿通过

降AI率黑科技实测!降AI率软件留学生亲测:Turnitin检测AI率直接归零全绿通过

写论文用AI确实省心又高效,尤其是面对海量文献和紧迫的截止日期时,简直是救星。但别高兴太早,现在越来越多高校开始用Turnitin等工具严格检测AI痕迹,一旦被发现,轻则被打回重写,重则直接挂科影响毕业。AI生…

2026/10/14 9:34:39 阅读更多 →
Ubuntu 20.04网络配置实战:从Netplan原理到静态IP、多网卡排错指南

Ubuntu 20.04网络配置实战:从Netplan原理到静态IP、多网卡排错指南

1. 项目概述:为什么Ubuntu 20.04的网络配置是个“坎”? 如果你刚接触Ubuntu 20.04,尤其是从更早版本(比如16.04、18.04)迁移过来,或者第一次在物理机或虚拟机上安装它,十有八九会在网络配置上卡…

2026/10/16 0:56:12 阅读更多 →
AI论文工具完全指南:从语法纠错到查重降AI,这一篇承包你的全部痛点

AI论文工具完全指南:从语法纠错到查重降AI,这一篇承包你的全部痛点

论文写完了,但总觉得哪里不对劲?别急,AI 工具真的能帮你把初稿打磨成能顺利通过审核的“成品”。每年毕业季,后台总能看到一堆这样的提问:“论文写完怎么改才能过审?”作为一个曾经被查重率 40% 惊到怀疑人…

2026/10/16 18:37:41 阅读更多 →

最新新闻

Spring Boot整合Shiro权限框架实战:从认证到动态权限配置

Spring Boot整合Shiro权限框架实战:从认证到动态权限配置

1. 为什么在Spring Boot项目里选Shiro而不是别的权限框架先说个现实问题。做Java后端的人一旦涉及登录、权限控制,十有八九会在Shiro和Spring Security之间纠结。Spring Security背靠Spring官方生态,功能全但学习曲线陡峭;Shiro则轻巧、直观&…

2026/10/17 0:35:01 阅读更多 →
64位OpenGL开发必学:用GLAD加载器解决函数指针链接错误

64位OpenGL开发必学:用GLAD加载器解决函数指针链接错误

简介:面向激光与物理光学设计领域的 Glad 5.8(64位)演示资源包,适配需要开展激光器建模、光束传播仿真与谐振腔优化的工程师、科研人员及高校相关专业学生。资源内含完整示例与说明文档,可帮助用户熟悉几何光学追迹、菲…

2026/10/17 0:35:01 阅读更多 →
基于信息熵与互信息的新词提取原理与实战

基于信息熵与互信息的新词提取原理与实战

1. 项目概述:为什么新词提取不是“找高频词”那么简单?“学习NLP的第20天——基于信息熵和互信息的新词提取实现”,这个标题乍看像一份学习笔记,但背后藏着自然语言处理中最常被低估、也最容易被误用的核心能力之一:未…

2026/10/17 0:35:01 阅读更多 →
一张4090跑通Qwen2.5-7B大模型LoRA微调完整实操指南

一张4090跑通Qwen2.5-7B大模型LoRA微调完整实操指南

简介:面向具备机器学习基础的研究人员和开发者,这是一份基于Qwen2.5-7B-Instruct大模型微调的完整实操指南。内容围绕AutoDL 4090云GPU环境,系统讲解从环境搭建、社区镜像选择、HF镜像下载预训练模型,到使用LLaMA-Factory配置数据…

2026/10/17 0:35:01 阅读更多 →
GEO生成式引擎优化:从传统搜索到AI引用的宣发新范式

GEO生成式引擎优化:从传统搜索到AI引用的宣发新范式

这两年做媒介宣发,最明显的变化是:投放出去的稿子,用户到底看没看到,越来越说不清了。以前我们靠阅读量、搜索排名和外链数量做判断,现在这些指标还在,真正的转化路径却已经变了——很多人遇到问题不再去搜…

2026/10/17 0:34:00 阅读更多 →
善付通支付结算接入全攻略:从报文加解密到订单对账闭环

善付通支付结算接入全攻略:从报文加解密到订单对账闭环

简介:建设银行善付通支付结算接入文档是一份面向企业开发与财务人员的详细技术指南,适用于需要将善付通采购订单、销售订单、收付款及结算对账流程嵌入自有系统的场景。文档完整覆盖对接流程、数据传输规范、报文格式与数据加解密要求,并逐一…

2026/10/17 0:34:00 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →