ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Eclipse Mosquitto 两周年回顾:从 SQLite 依赖到轻量 MQTT Broker 的演进之路

Eclipse Mosquitto 两周年回顾:从 SQLite 依赖到轻量 MQTT Broker 的演进之路 物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载本文基于 Eclipse Mosquitto 项目官方博客 Two!2011-10-25 发布整理而成。该文发布于项目两周岁之际记录了 2010 年 10 月至 2011 年 10 月间 Mosquitto 从 0.8.3 迈向 0.13 的关键技术演进移除 SQLite 依赖、完成 Windows 原生移植、支持 MQTT 3.1、持续向 IBM RSMB 特性对齐以及对 1.0 版本的规划。本文将以这篇里程碑文章为主线结合当前仓库中的源码与文档逐条还原每一项技术决策背后的实现细节帮助读者理解 Mosquitto 的架构设计初衷与后续演进脉络。一、两周年里程碑0.8.3 → 0.13 的年度成绩单2011 年 10 月 25 日Mosquitto 项目迎来两周岁生日。彼时项目版本已从 0.8.3 推进到 0.13官方博客在 Two! 中总结了这一年的核心成果彻底移除 SQLite 依赖内存与磁盘上的数据存储全部改由自定义例程实现broker 变得更加紧凑compact、性能更好better performing且实现更为优雅more elegantWindows 原生移植为后续摆脱 Cygwin 依赖、提供安装程序与 Windows 服务支持埋下伏笔MQTT 3.1 支持紧跟 2010 年更新的 MQTT v3.1 规范Python 模块大幅改进为后来的异常式 API 演进做准备向 RSMBIBM Really Small Message Broker特性对齐以drop-in replacement为目标进入 Debian 与 Ubuntu 官方软件包仓库客户端代码被 Facebook 的 iPhone 应用采用——这是社区影响力的有力佐证。需要说明的是这些是 2011 年时间点上的历史事实当前仓库中的 Mosquitto 已经演进为同时支持 MQTT v3.1、v3.1.1 与 v5.0 的成熟 broker本文后续章节将结合仓库现状逐项展开。二、移除 SQLite从数据库依赖到自定义内存存储2.1 历史背景为什么要离开 SQLite在 0.9 之前的版本中Mosquitto 使用 SQLite 存储客户端与消息数据并连带依赖 pcre 与 sqlite3-pcre 两个附加库。2010 年 11 月发布的 Version 0.9 released 明确记录了这一重大变更Client and message data is now stored in memory with custom routines rather than a sqlite database. This removes the dependencies on sqlite, pcre and sqlite3-pcre.移除 SQLite 后broker 在每秒处理消息数与内存占用两方面都获得了明显改善——这正是博客文中more compact, better performing and more elegant三组形容词的出处。2.2 仓库中的实现证据当前仓库中这一架构决策的痕迹依然清晰可辨持久化格式src/persist.h定义了自有的磁盘数据库格式MOSQ_DB_VERSION 6为当前数据库版本DB_CHUNK_CFG、DB_CHUNK_BASE_MSG、DB_CHUNK_CLIENT_MSG、DB_CHUNK_RETAIN、DB_CHUNK_SUB、DB_CHUNK_CLIENT六种 chunk 类型分别承载配置、基础消息、客户端消息、保留消息、订阅与客户端数据读写实现分布在 persist_read.c、persist_write.c 及对应 v5 变体中SQLite 的残余角色仓库中仍保留plugins/persist-sqlite/目录但它已不再是 broker 的内置依赖而是作为一个可选的持久化插件存在。其 test.conf 展示了插件的加载方式persistence_location . plugin ./mosquitto_persist_sqlite.so plugin_opt_page_size 4096 plugin_opt_flush_period 5这一设计印证了博客中broker 更优雅的说法核心 broker 不再背负数据库依赖需要 SQLite 持久化的用户通过插件机制按需启用即可。2.3 遗留兼容代码的清理时间线从 Version 0.11 released 的变更日志可以看到旧 SQLite 代码的清理是一个渐进过程0.9提供可选的旧 SQLite 数据库导入支持默认编译开启0.10导入支持默认关闭0.11彻底移除全部旧 SQLite 代码。这条时间线展示了 Mosquitto 团队在破坏性变更上的稳健策略——先保留导入能力过渡再逐步移除最终完全切换。三、MQTT 3.1 支持用户名/密码认证的引入3.1 版本能力在源码中的落点MQTT 3.1 的核心在于 CONNECT 报文携带用户名/密码标志位。当前仓库在 include/mosquitto/mqtt_protocol.h 中完整保留了各协议版本的常量定义#define PROTOCOL_NAME_v31 MQIsdp #define PROTOCOL_VERSION_v31 3 #define PROTOCOL_NAME MQTT #define PROTOCOL_VERSION_v311 4 #define PROTOCOL_VERSION_v5 5注意 MQTT 3.1 的协议名是MQIsdp而非 v3.1.1/v5.0 的MQTT这是 3.1 规范的重要识别特征。同一头文件还定义了完整的报文类型CMD_CONNECT、CMD_PUBLISH、CMD_SUBSCRIBE等与 CONNACK 返回码枚举CONNACK_REFUSED_BAD_USERNAME_PASSWORD 4等可直接作为协议级事实依据。3.2 0.9 时期的实现局限博客文中提到的MQTT 3.1 support在 0.9 时代是分层的客户端与客户端库完整支持 v3.1mosquitto_pub/mosquitto_sub与 libmosquitto 均可携带用户名密码broker兼容 v3.1 连接但当时不提供任何用户名/密码校验机制——Version 0.9 released 原文为 The broker supports the username and password connection flags, but will not do anything with the username and password并计划在 0.10 补齐。这一能力缺口随后由 password file 与 ACL 机制填补如今可通过mosquitto_passwd源码见 apps/mosquitto_passwd/mosquitto_passwd.c与 aclfile.example 配置实现完整的认证授权。3.3 如今的三协议共存从 include/mosquitto/mqtt_protocol.h 可以看出当前 broker 同时支持 v3.1、v3.1.1协议版本 4与 v5.0协议版本 5三种协议版本这正是从 0.9 时代单一 v3.1 支持不断演进的结果。四、对标 RSMB功能完备性与差异化超越4.1 drop-in replacement 目标博客文与 Version 0.9 released 都明确提到Mosquitto 的一个核心目标是成为 IBM RSMB 的**可直接替换drop-in replacement**方案另一目标则是做得比 RSMB 更多。0.9 时期两者均有进展对齐 RSMBport配置变量的行为改为与 RSMB 一致仅作用于默认 listener只能出现一次超越 RSMB新增IPv6 支持——RSMB 当时并不支持 IPv6。4.2 桥接Bridge特性是最后一块拼图两周年博文直言 1.0 的验收标准是完整的 RSMB 特性除少数冷门功能外而当时尚未完成的主要是部分桥接bridge特性完整的配置热加载configuration reloading。桥接功能在今天的仓库中已经非常成熟核心实现位于 src/bridge.c约 290 处桥接相关代码配置说明见 man/mosquitto.conf.5.xml 中 Configuring Bridges 章节桥接还可以与本地保留消息、topic 重映射等特性组合使用参考 06-bridge-b2br-remapping.py 等测试。4.3 配置热加载的最终落地配置热加载在两周年时仍属规划项如今已通过SIGHUP 信号实现。src/signals.c 中可以看到完整的处理链路if(signal SIGHUP){ flag_reload true; }主循环检测到flag_reload后依次执行listeners__reload_all_certificates()、broker_control__reload()与bridge__reload()src/signals.c 第 104-119 行区域实现不重启即重载配置。这一行为也在 man/mosquitto.8.xml 的 SIGHUP 条目中正式文档化。五、Windows 原生移植从 Cygwin 依赖到原生服务5.1 年度进展与后续规划两周年博文确认Windows 原生移植已在 0.9 期间部分完成Version 0.9 released 称当时会暂时丢失部分功能如配置修改与持久化。博文同时预告了 0.14 的目标改进 Windows 移植、取消单独的 Cygwin 版本、提供 Windows 安装程序、让 Mosquitto 以正规 Windows 服务方式运行。5.2 仓库中的实现这些规划最终全部落地仓库中的证据包括NSIS 安装脚本installer/mosquitto.nsi 与 installer/mosquitto64.nsi分别面向 32/64 位构建Windows 服务支持broker 的 Windows 服务逻辑位于 src/service.c其中包含mosq%d_reload事件src/signals.c 第 154 行附近等平台适配代码线程抽象层common/winthread_mosq.c 与 common/winthread_mosq.h 提供了跨平台线程封装使 libmosquitto 在 Windows 与 POSIX 平台上保持一致的行为。六、Python 模块从回调式到异常式 API 的演进方向两周年博文指出Python 模块虽已大幅改进但还可以更 Pythonic——当时的规划是让 API 抛出异常throw exceptions而非返回整数错误码作者甚至在文中坦言需要一位 Python 专家的帮助。这一演进方向的早期铺垫在 Version 0.9 released 中可以看到Python 回调函数开始可选地接收额外参数用于返回构造Mosquitto()时传入的 user 对象。而从 0.9 起Debian/Ubuntu 上的 Python 绑定包也按 Debian 命名规范由libmosquitto0-python更名为python-mosquitto。需要说明当前仓库中的 libmosquitto 底层 API 仍以返回整数错误码如MOSQ_ERR_INVAL为约定C 语言接口的对应约束在 lib/libmosquitto.h 等头文件中定义Python 绑定的具体形态请以对应发行版的打包为准。七、进入 Linux 发行版Debian 与 Ubuntu 打包7.1 年度成就两周年博文将被 Debian 打包……以及 Ubuntu 打包列为年度亮点。仓库中的相关佐证散见于早期打包记录www/posts/2010/09/debian-packages.md、www/posts/2010/05/fedora-packages-available.md 等博客文章记录了各发行版打包的推进过程包配置文件libmosquitto.pc.in 与 libmosquittopp.pc.in 提供了 pkg-config 元数据是发行版打包的基础设施。7.2 安装方式现状如今用户可以通过发行版包管理器直接安装 Mosquitto也可参考 README-compiling.md 从源码编译。仓库根目录的 Makefile 与 CMakeLists.txt 同时提供两套构建体系前者对应config.mk配置后者面向 CMake 用户。八、社区力量Bug 反馈与生态应用博文最后特别致谢了社区贡献无数被报告的 bug、修复、建议与兴趣。仓库中的证据包括详尽的历史变更日志ChangeLog.txt 记录了从早期版本到当前的完整演进贡献指南CONTRIBUTING.md 规范了社区协作流程致谢名单THANKS.txt 列出了历届贡献者生态应用博客提及 Mosquitto 客户端代码被 Facebook iPhone 应用采用——这是 2011 年的历史事实说明其轻量客户端库在移动场景的价值。九、展望1.0 的验收标准与后续演进9.1 2011 年时的 1.0 规划博文为 1.0 设定了明确验收标准完整实现 RSMB 特性排除少数冷门项具体待办包括补齐桥接特性与完整配置热加载同时推进 Windows 移植、安装程序与 Windows 服务支持计划落在 0.14Python 模块则追求更 Pythonic 的异常式 API。9.2 从今天的仓库看规划兑现对照当前仓库上述规划均已成真桥接src/bridge.c 提供完整实现man/mosquitto.conf.5.xml 的 Configuring Bridges 章节给出详细配置项address、bridge_attempt_unsubscribe等配置热加载通过 SIGHUP 实现src/signals.cWindows 支持installer/mosquitto.nsi、src/service.c持久化体系persist.h 与 persist_read.c、persist_write.c 构成自研格式的完整读写实现man/mosquitto.conf.5.xml 中的persistence、persistence_file、persistence_location、autosave_interval默认 1800 秒、autosave_on_changes、persistent_client_expiration支持2m、14d、1y等时长语法等配置项共同支撑运维协议能力include/mosquitto/mqtt_protocol.h 显示已扩展至 MQTT v5.0 的完整属性系统MQTT_PROP_*枚举与 v5 返回码MQTT_RC_*。9.3 一路走来的版本脉络从两周年时的 0.13到如今仓库中的成熟版本Mosquitto 走过的路径可以在以下文件中完整追溯各版本发布博客www/posts/2010/、www/posts/2011/ 等目录下的发布公告官方变更日志ChangeLog.txt协议级演进证据include/mosquitto/mqtt_protocol.h。结语两周年博文以一句轻描淡写的 All in all I think it should be a good year 收尾而其背后是 SQLite 依赖的彻底剥离、Windows 原生移植的推进、MQTT 3.1 的支持、向 RSMB 特性对齐的执着以及一个活跃社区的持续反馈。透过当前仓库的源码回看这些当年的年度计划无一例外地沉淀成了今天的架构基石自研的紧凑持久化格式、完整的桥接与热加载能力、跨平台的服务化部署以及从 v3.1 到 v5.0 的协议全支持。对于想要理解 Mosquitto 设计哲学的读者而言这篇两周年总结连同仓库中的实现共同构成了一份完整的演进档案。赞分享物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto 项目两周年回顾从 0.8.3 到 0.13 的架构演进与 1.0 路线图Eclipse Mosquitto 项目两周年回顾从 0.8.3 到 0.13 的架构演进与 1.0 路线图 Mosquitto 作为一款开源 MQTT Br后端消息队列消息路由Eclipse Mosquitto终极指南轻量级MQTT broker核心功能解析Eclipse Mosquitto终极指南轻量级MQTT broker核心功能解析 Eclipse Mosquitto是一款开源的 轻量级MQTT broke物联网消息队列后端从依赖臃肿到轻量演进Flying Saucer移除JSR305的技术之路从依赖臃肿到轻量演进Flying Saucer移除JSR305的技术之路 一、痛点直击JSR305依赖的甜蜜负担 你是否也曾遭遇过这些困境项目构建时频后端上一篇如何让珍贵的微信对话永不消失WeChatMsg帮你建立个人社交记忆库下一篇微信聊天记录永久保存终极指南三步掌握WeChatMsg开源方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表