在物联网的飞速发展下,数据交互和传输安全性的需求空前高涨。MQTT 作为一个轻量级的消息传输协议,已成为业界的首选。而在众多的 MQTT 实现中,smart-mqtt 突显出其卓越的技术实力和创新能力,逐渐成为了 MQTT 新时代的领跑者。
项目仓库
Gitee(主仓库):https://gitee.com/smartboot/smart-mqtt(opens new window)
Github(镜像同步):https://github.com/smartboot/smart-mqtt(opens new window)
开发环境:Java 8
1. smart-mqtt 的飞跃之路
从 2022 年的初版 v0.1 到 2023 年的 v0.28,smart-mqtt 经历了众多的升级和迭代。在这之中,它不仅展现出了技术的深度和广度,而且反映出其对市场需求的敏感度和响应速度。
2. 特色亮点
a. 技术迭代和完善
smart-mqtt 在每一次版本更新中,都不断修复已知问题并优化功能。例如,在 v0.28 中,它修复了 retain 消息实现不符合规范的问题,并进行了许多底层接口的调整与优化。
b. 企业版的强劲扩展
smart-mqtt 的企业版在功能上远超其社区版,它提供了更多的专业功能如指标实时统计、客户端连接管理、Topic 管理、账户管理等,满足大企业的商业需求。
c. 性能的极致优化
smart-mqtt 致力于为用户提供最佳的性能体验。如在 v0.26 版本中,通过采纳时间轮定时器替换 JDK 默认定时器,大大提高了计时效率。同时在多个版本中,smart-mqtt 也对其内存管理、消息编解码、消息推送模型等关键流程进行了精细的优化。
d. 开放与创新
smart-mqtt 并不满足于现有的功能和表现,它始终保持开放的心态。在 v0.17 版本中,通过引入 smart-socket 的插件化机制,提供了消息超时重发的功能,表明了其对技术的前瞻性和创新意识。
3. 插件开发
smart-mqtt 非常重视与社区的交流和合作。在多个版本更新中,都可以看到来自社区反馈的 bug 修复和功能建议。这也使得 smart-mqtt 更加完善,更具适应性。
smart-mqtt 是一款非常开放的产品,在满足基本 MQTT 服务的同时,还能基于其插件化的能力衍生出多样化的功能,例如:服务指标统计、集群服务、数据路由等。
smart-mqtt 企业版的几乎每项特性都是一个插件,并且插件与插件之间各自独立自治。
在事件总线章节中为了大家展示了相对细致的 samrt-mqtt 内部架构。 但如果从插件视角重新审视 smart-mqtt,则会是另外一番景象(见下图)。 通过订阅事件总线上不同类型的事件,并配套不同的实现策略,可以实现很多实用的功能。当然,你也可以完全脱离事件总线做一些有意思的插件,譬如:插件的热插拔、Broker服务动态启停等。
4. 未来展望
随着物联网技术的持续发展,smart-mqtt 在技术深度和广度上仍有巨大的挖掘空间。而从其迄今为止的表现来看,smart-mqtt 无疑有能力和信心继续引领 MQTT 技术的前沿发展。
结论
smart-mqtt 不仅仅是一个 MQTT Broker,它是 IoT 领域的一个杰出代表,是技术与创新的完美结合。对于任何希望在 IoT 领域取得突破的企业和开发者,smart-mqtt 都是一个不可忽视的伙伴。
扩展阅读:
发版记录
#smart-mqtt broker v0.28发布(2023-09-17)(opens new window)
- bugfix:修复retain消息实现不符合规范的问题。(感谢 springrain-zorm 反馈)
- 调整消息总线接口入参设计。
- 删除 broker 模块中的 EventObject。
- 服务配置项 name 调整为 nodeId。
- 移除 BrokerContext#getRuntime 接口。
- 调整控制台 Banner 输出时机。
#smart-mqtt broker v0.27发布(2023-09-03)(opens new window)
【社区版】
- 新增事件类型:UNSUBSCRIBE_TOPIC,当 topic 订阅关系解除时触发。
- 移除 BrokerContext#getSessions 接口。
- 提升 MqttClient 的重连功能稳定性。
【企业版】
- 基于事件总线提供更高效、更精准的指标实时统计。
- 更加丰富的指标统计时间粒度。
- 新增客户端连接管理页面。
- 新增 Topic 管理页面。
- 新增账户管理功能
- 新增 Broker 集群管理功能
#smart-mqtt broker v0.26发布(2023-08-13)(opens new window)
- 移除 commons-collections4 依赖,减少发行包大小。
- 新增 BROKER_CONFIGURE_LOADED 事件类型,当配置文件完成加载后触发。
- 新增系统环境变量:BROKER_LOWMEMORY、BROKER_MAXINFLIGHT,用于设置 Broker 启动参数。
- 支持启用低内存模式,提升百万连接场景下的资源使用率。
- noConnectIdleTimeout 默认值调整至15秒
- MqttClient 采用事件模型处理 Connect ACK消息。
- 提升MqttClient重连功能稳定性。
- 采用时间轮定时器替换JDK默认定时器。
#smart-mqtt broker v0.25发布(2023-07-29)(opens new window)
【社区版】
- smart-socket升级值1.5.32。
- 设置 slf4j-simple 的 maven scope 为 runtime。
- 更新 readme.md。
- 重构消息总线,提升可扩展性。
- 新增事件类型:OPEN_API_STARTED。
- 移除开源版中的 openapi 定义。
- MqttSession 新增 getMqttContext 接口。
- 清理 smart-mqtt.yaml 配置文件,移除无用项。
【企业版】
- 新增两款数据桥接插件:redis-bridge、kafak-bridge
- 添加后台登录账户认证。
- 提升 mqtt-over-websocket 的稳定性。
#smart-mqtt broker v0.24发布(2023-07-08)(opens new window)
【开源版】
【企业版】
- 增加按省份维度的访问量排名统计。
- 提供更加高效,且自适应采样粒度的指标统计功能。
- 企业版的主数据库调整为mysql,依旧保留h2的开箱即用特性。
- 屏蔽服务启动时的DDL语句打印。
- 优化数据库索引,提供更高效的检索体验。
- 丰富集群间的关键信息互通。
- 修复非周期性指标在入库时被重置的bug。
#smart-mqtt broker v0.23发布(2023-06-24)(opens new window)
- smart-http升级至1.2.5
- layui-vue 升级至2.3.1
- 企业版页面新增地图监控大屏。
#smart-mqtt broker v0.22发布(2023-06-17)(opens new window)
【社区版】
- 禁止客户端匹配 ”$“ 开头的主题名。
- BrokerContext新增bundle、getBundle用于绑定自定义资源。
- Broker服务的线程池、内存池支持资源复用。
- 优化Broker端的消息推送模型。
- 提升MqttClient通信服务稳定性。
- smart-http升级至1.2.4
【企业版】
- 移除redis-bridge-plugin模块,将于开源之夏活动中由社区同学贡献开源版。
- 移除mqtt-bridge-plugin模块。
- 优化指标统计
#smart-mqtt broker v0.21发布(2023-06-03)(opens new window)
【社区版】
- smart-socket 升级至1.5.29。
- fastjson2 升级至 2.0.21.graal。
- 迁移指标采集功能至企业版。
- 优化SubAck的响应效率。
- Broker支持注册 smart-socket 插件。
- 新增事件类型:NOTIFY_TOPIC_PUSH,用于触发指定topic的消息推送。
- 优化MQTT的连接会话管理。
- 重构topic的订阅匹配模型。
- 重构消息推送模型。
- 重构飞行窗口。
- 提升MqttClient服务稳定性。
- 补充单元测试用例。
【企业版】
- 采用异步方式持久化统计指标,降低对通信性能造成的影响。
- 统计指标适配 Prometheus。
#smart-mqtt broker v0.20发布(2023-05-20)(opens new window)
【社区版】
- smart-socket 升级至1.5.27。
- snakeyaml 升级至2.0。
- 修复了消息编解码过程中的bug,提高消息传输的可靠性。
- 优化了消息解码异常触发的状态机,降低误判概率。
- 加强了消息编解码字节边界的检验,避免数据解析错误。
- 改进了内存管理策略,减少通信过程中的内存消耗。
- 修复了MQTT 5.0协议实现中的遗嘱消息和QoS2通信编解码问题。
- 对遗嘱消息模型字段进行了优化,提高代码可读性。
- 引入社区同学贡献的redis桥接模块,提供更多扩展选项。
- 为MQTT Client提供更高效的pulbish能力,提升性能表现。
【企业版】
- 补充表结构索引,解决慢sql问题。
- 新增账户管理接口
- Broker启动时重置旧连接状态。
#smart-mqtt broker v0.19发布(2023-04-22)(opens new window)
- 实现消息重发规范
#smart-mqtt broker v0.18发布(2023-04-16)(opens new window)
- 社区版中移除连接认证功能,后续将在企业版中重新提供一套相对成熟的方案。
- 清理无用配置项。
- 优化消息Push逻辑。
- 重构 BrokerTopic 模型结构。
- 社区版源码中补充关于商业授权的License注释。
- 【企业版】优化Broker管理系统UI。
- 【企业版】节点管理中补充 Broker 端口号的信息记录。
- 【企业版】补充表索引,解决慢SQL问题。
- 【企业版】H2数据库启用mysql模式。
- 【企业版】关闭ChatGPT入口。(因为国内服务器已无法调用OpenAPI)
#smart-mqtt broker v0.17发布(2023-03-19)(opens new window)
- 通过引入smart-socket的插件化机制,以更低的性能损耗实现消息超时重发。
- 修复此前版本引入的topic取消订阅不生效的bug。
- 网络断开连接后即时中断消息推送,减少不必要的尝试。
- MQTT Client 的topic订阅与取消订阅请求纳入飞行队列管理。
- 重构部分消息模型。
- 重构飞行队列,提供更加完善的Push能力。
- 更合理的日志输出。
#smart-mqtt broker v0.16发布(2023-03-19)(opens new window)
- 优化 docker-compose.yml 配置,提升压测体验。
- 简化客户端连接空闲超时处理逻辑,节省内存开销。
- 显式管理 openAPI 服务的线程资源。
- 提升IO的flush效率。
- 调整内存消息队列的消费模式:当订阅者消费过慢导致消息被发布者覆盖,将直接跳跃至最新一条。
- 简化消息的 Push 模型,并获得大幅的性能提升。
- 暂时移除消息重发策略,会在后续版本中重构。
- 缩小 MQTT Client 消息发送的锁粒度,提升通信效率。
- 重构飞行队列,在高并发场景下能显著节省内存开销。
- 其他关于内存和性能的细节优化。
#smart-mqtt broker v0.15发布(2023-03-04)(opens new window)
【社区版】
- smart-socket 版本调整至:1.5.24。
- smart-http 版本升级值:1.1.21。
- 完善 openAPI 定义,并提供部分接口实现。
- 完善 MQTT5 协议规范的实现。
- Broker 支持节点命名,用于集群模式下区分节点的唯一性。
- 提供内存模式的指标统计功能。
- 调整消息推送服务与插件模块的初始化顺序。
- MQTT Client 支持飞行窗口,提供更稳定可靠的通信服务。
- 消息序列化日志打印调整成 JSON 格式输出。
- 改进后台管理系统的交互体验。
【企业版】
- 新增 chatGPT 插件,实现与人工智能对话。
- 新增 Database 插件,用于持久化Broker运行时数据以供后台管理系统展示。(适配数据库:H2、MySQL)
- 实现现存所有的 openAPI 接口。
#smart-mqtt broker v0.14发布(2023-01-28)(opens new window)
- 新增事件类型:SUBSCRIBE_ACCEPT、UNSUBSCRIBE_ACCEPT、CONNACK
- 重新设计MQTT协议编解码接口,提升代码可读性、扩展性、可维护性。
- 新增broker后台管理系统。
- 完善MQTT5.0规范实现:
#smart-mqtt broker v0.13发布(2022-12-31)(opens new window)
社区版
- 适配 mqtt 5.0 规范协议。
- 更新的项目readme描述信息。
- MqttClient 支持 maxPacketSize 配置,限制 MQTT 消息包容量上限。
- 增加事件类型:
SUBSCRIBE_REFRESH_TOPIC
,当客户端取消 topic 订阅时触发。 - 修复特定场景下消息订阅失效问题。
- 重新设计消息编解码器。使整体结构更清晰,更具扩展性。
- smart-socket 升级至
1.6.1
。
#smart-mqtt broker v0.12发布(2022-12-31)(opens new window)
社区版
- 优化客户端超时断连的提示信息。
- 重构Connect消息的处理逻辑。
- 实现连接认证失败的错误响应码。
- topic订阅支持黑名单约束。
- 优化Broker线程数配置,要求至少2个线程。
- 整理provider包结构。
- 修复操作系统 hosts 配置异常可能引发的接口阻塞问题。
企业版
- 试用版License过期时间延续至2023年12月31日。
- 修复 License 过期时间格式化错误问题。
- 优化运行期间 License 过期后的提示文案。
#smart-mqtt broker v0.11发布(2022-12-22)(opens new window)
社区版
- MQTT默认的最大报文字节数调整为 1MB。
- 调整Broker消息推送线程组名称。
- 优化消息推送模型,获得更强劲的通信性能。
- 调整MQTTClient线程组名称。
- 提升飞行窗口稳定性
#smart-mqtt broker v0.10发布(2022-12-16)(opens new window)
社区版
- 采用自研的压测工具 smart-mqtt-bench 替换 emqx-bench,以获得更好更强劲的压测体验。
- fastjson 升级至 fastjson2:2.0.20.graal。
- 重构消息推送模型,通过优化设计获得更高的通信性能。
- 新增事件总线的事件类型:MESSAGE_BUS_CONSUMED
- MemoryMessageStoreQueue 仅存储类型为 MqttPublishMessage 的消息。
- 缓冲区配置参数由 readBufferSize 调整为 bufferSize,且 read/write 共享该参数。
- 新增 Broker 服务的 Topic 数量限制,且默认值为:1024。
- MQTT Broker 支持的最大报文采用参数化配置:maxPacketSize。
- maxKeepAliveTime 由 1分钟调整成10分钟。
- 移除 BrokerContext#batchPublish 接口。
- 移除 MonitorPlugin 插件。
- 多个 MQTTClient 支持共享内存池。
- MQTT Client 缓冲区采用参数配置化。
- 支持临时扩容缓冲区容量,不超过 maxPacketSize 即可。
- 升级飞行窗口流控算法。
- 消息输出支持主动和被动两种模式。
企业版
- 调整授权提示信息。
- 改进打包工具。
- 适配最新版 smart-mqtt。
#smart-mqtt broker v0.9发布(2022-12-03)(opens new window)
社区版
- 读缓冲区大小调整为参数配置化。
- CONNECT_TIMEOUT默认值调整为5秒
- MQTT 消息输出功能调整为MqttWriter接口的具体实现类,以适应 mqtt-over-websocket 的场景。
- 修复unsubscribe一个未订阅的 topic 时引发的空指针问题。
- 配置文件调整为 yaml 格式。
- 插件服务支持优先级排序。
企业版
#smart-mqtt broker v0.8发布(2022-11-12)(opens new window)
- 升级 smart-socket 至 1.5.23
- smart-mqtt 相关组件提交至 Maven 中央仓库。【ISSUE:I5ZOQ4 (opens new window)】
- 重构消息总线
- 指标监控频率调整为1分钟。
- 客户端支持通配符订阅。【ISSUE:I5ZJLZ (opens new window)】
- 修复客户端重连后没有触发 Topic 订阅的问题。
#smart-mqtt broker v0.7发布(2022-09-10)(opens new window)
- 新增 docker-compose.yml ,极致体验的 MQTT Broker。
- 优化日志级别。
- Broker接受消息后不对Qos进行持久化。
- ping响应消息采用单例模式。
- 支持系统环境变量配置broker运行参数,现开放 BROKER_PORT、BROKER_THREADNUM两项配置。
- 将插件的启动先于 Broker TCP服务启动之前完成。
- 启动 TCP 服务时若发生异常释放相关资源。
- 启用内存池,提升运行性能。
- 消息read缓冲区暂时下降至 4KB,下个迭代换成配置化。
- 启用运行指标监控插件。
#smart-mqtt broker v0.6发布(2022-09-03)(opens new window)
- 应社区用户要求,开源版 smart-mqtt适配 JDK 回退至1.8。
- 完善retain消息的规范实现,当服务端接收到保留标志为 1 且有效载荷为零字节的 PUBLISH 报文时,该主题下任何现存的保留消息必须被移除。
- 优化日志输出格式,增加时间信息。
- smart-mqtt broker 线程数支持配置化。
- 更新客户端connect鉴权的接口设计。(by @yamikaze )
- 支持docker启动 smart-mqtt 服务
- 修复mqtt协议版本不兼容时引发的空指针问题。
- 修复订阅topic后retain消息被无限推送的问题。
#smart-mqtt broker v0.5发布(2022-07-17)(opens new window)
- 【新特性】Broker支持客户端连接鉴权
- 【优化】重构Topic订阅逻辑,并增加重订阅特性
- 【优化】简化客户端连接超时监听的处理逻辑。
- 【优化】对各事件类型打上标注
- 【优化】清理TopicFilterProvider,开源版与企业版保持同等Topic匹配策略
- 【优化】采用事件总线监听连接活跃状态
- 【优化】确保网络断开后,事件状态 EventType.DISCONNECT 必然被调用
- 【优化】引入订阅事件的退出机制
- 【优化】AbstractSession 新增 getRemoteAddress 接口
#smart-mqtt broker v0.4发布(2022-07-10)(opens new window)
- 【新特性】升级了Broker内核的架构设计,采用事件驱动+消息驱动的双引擎模式构建出具备高度扩展性的MQTT服务
- 【新特性】支持Topic通配符的订阅方式
- 【优化】彻底移除了原先监听器的功能,统一切换至事件总线
- 【优化】引入 slf4j-simple 进行日志输出
- 【优化】升级 smart-socket 至 1.5.19,带来更安全的网络通讯,可支持 TLSv1.3
- 【优化】移除 fastjson 依赖
- 【优化】其他一些细节优化
- 【Bugfix】修复连接成功后userName未绑定至MqttSession的问题
#smart-mqtt broker v0.3发布(2022-05-01)(opens new window)
- 【新特性】Retain 消息内存持久化,并在客户端 CONNECT 成功后推送匹配的消息。
- 【新特性】新增飞行窗口(Inflight Window)功能,限制同时发送Qos1和Qos2的数量,保障通信质量。
- 【新特性】新增 MQTT Broker 和 MQTT Client 的消息重发功能。
- 【优化】重构 MQTT 消息模型设计。
- 【优化】改进消息内存持久化的处理逻辑。
- 【优化】提升并发场景下的线程安全性。
- 【优化】改进客户端的 subscribe 和 publish 的接口设计。
- 【优化】客户端正常断开连接时发送 DISCONNECT 消息。
- 【优化】MQTT 消息对象序列化调整为 JSON 格式。
- 【优化】主动拦截已断开连接的消息发送行为。
- 【优化】以正整数作为合法的 packetId。
- 【优化】补充压测的单元测试。
- 【bugfix】修复Broker端在某些异常场景下资源释放不彻底问题。
- 【bugfix】修复 CONNECT 消息的合法性校验错误问题:如果客户端提供的 ClientId 为零字节且清理会话标志为 0,服务端必须发送返回码为 0x02的 CONNACK 报文响应客户端的 CONNECT 报文。
#smart-mqtt broker v0.2发布(2022-04-18)(opens new window)
- 优化客户端ping消息:发送了 PINGREQ 报文之后,如果在合理的时间内仍没有收到 PINGRESP 报文,则关闭到服务端的网络连接。
- 优化Connect消息监听:网络连接建立后,如果服务端在合理的时间内没有收到 CONNECT 报文,服务端应该关闭这个连接。
- 优化 Connect ACK 消息监听:如果客户端在合理的时间内没有收到服务端的 CONNACK 报文,客户端应该关闭网络连接。
- 优化报文标识符的生成策略,防止同一标识符在同时刻被复用。
- 内存持久化会话状态。
- 重构Qos1和Qos2的回调处理机制。
- bugfix:修复unsuback报文标识符取值不正确问题
- bugfix:修复 broker 推送消息至subscriber时继承了publisher消息质量的问题。
- 其他一些代码细节优化
#smart-mqtt broker v0.1发布(2022-04-14)(opens new window)
- 支持MQTT v3.1.1协议标准
- 支持Qos0、Qos1、Qos2 的消息传递
- 支持遗嘱消息
- 支持 retain 消息
- 支持心跳消息
- 插件化设计模式
- mqtt client 相关功能
- 优雅停机