自动售货机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/8/11 8:33:01 阅读更多 →
Ubuntu 20.04网络配置实战:从Netplan原理到静态IP、多网卡排错指南

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

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

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

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

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

2026/8/11 8:33:01 阅读更多 →

最新新闻

基于ChatGPT的AI工作流自动化:从环境搭建到实战脚本

基于ChatGPT的AI工作流自动化:从环境搭建到实战脚本

在日常开发工作中,我们常常被大量重复、繁琐的任务所困扰:编写格式化的代码注释、生成测试数据、排查日志中的错误、撰写技术文档、甚至回复格式化的邮件。这些工作消耗了大量宝贵的时间和精力,却往往难以带来实质性的技术成长。幸运的是&…

2026/8/11 9:22:19 阅读更多 →
JVM垃圾回收算法与调优实战指南

JVM垃圾回收算法与调优实战指南

1. JVM垃圾回收算法深度解析 作为一名Java开发者,我经常被问到关于JVM垃圾回收的问题。记得有一次在生产环境遇到内存泄漏,整整排查了两天才发现是某个静态集合没有及时清理。从那以后,我就养成了深入研究GC机制的习惯。今天,我就…

2026/8/11 9:22:19 阅读更多 →
UI设计Prompt工具入门:把模糊需求变成结构化界面规范

UI设计Prompt工具入门:把模糊需求变成结构化界面规范

在使用AI辅助设计时,很多人遇到的第一个问题并不是模型能力不足,而是不知道怎样准确描述界面需求。同一句“做一个简洁的登录页”,不同工具可能生成完全不同的布局、配色和组件。要让结果更稳定,关键是把模糊想法转成结构化的UI设…

2026/8/11 9:22:19 阅读更多 →
如何用3分钟解决Windows程序缺少DLL错误?VisualCppRedist AIO完整指南

如何用3分钟解决Windows程序缺少DLL错误?VisualCppRedist AIO完整指南

如何用3分钟解决Windows程序缺少DLL错误?VisualCppRedist AIO完整指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否经常遇到"无法启动…

2026/8/11 9:22:19 阅读更多 →
构建企业级高并发压测框架:从JMeter脚本到工程化实践

构建企业级高并发压测框架:从JMeter脚本到工程化实践

1. 项目概述:从“能用”到“敢用”的性能压测思维跃迁 如果你已经能用JMeter跑起来一个简单的HTTP请求,看到聚合报告里那些TPS、响应时间的数据,那么恭喜你,你已经踏入了性能测试的门槛。但门槛之后,才是真正的战场。我…

2026/8/11 9:22:19 阅读更多 →
Mermaid Live Editor:代码驱动图表创作的完整高效解决方案

Mermaid Live Editor:代码驱动图表创作的完整高效解决方案

Mermaid Live Editor:代码驱动图表创作的完整高效解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-ed…

2026/8/11 9:21:18 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →