Appearance
FreeMQTT 简介
FreeMQTT是用Python编程语言并基于Tornado Web框架开发的 一款MQTT服务器开源软件。
如无特殊声明,本指南中 "FreeMQTT" 等同于 "FreeMQTT 服务器"。
历史
2013年,我们在一个项目中决定采用 MQTT协议, 最开始打算用开源的 mosquitto broker , 在经过压力测试后,我们放弃了这个Broker。最终我们开始尝试自己用 Python 2.x 语言并基于 Tornado Web 框架(自带TCP server 框架)来实现一个 MQTT Broker。这便是第一个版本的 FreeMQTT v0.01, 实现的MQTT的协议版本是 v3.1。经过和 mosquitto (2013年的版本)对比测试结果,极大地激励着我们把这个项目做下去。
2014年,根据当是 MQTT 官方发布的最新协议 3.1.1(当时为修订版本,非正式版本),我们升级了 FreeMQTT 到 v0.02 版本。
2016年,FreeMQTT 从 Python 2.x 迁移到 Python 3.x 并采用 async / await 的异步 io 机制重构了 FreeMQTT,版本升级到 v0.05。
2018年,再次对 FreeMQTT 重构,主要是采用 leveldb key-value 数据库实现 session & subscribe & retain 消息的持久性存储。FreeMQTT升级到 v0.08。
2022年,在 FreeMQTT 中实现 MQTT over Websocket 功能。 FreeMQTT 版本为 v0.09。
2024年,基于新的 MQTT V5.0 协议版本,再次彻底重构 FreeMQTT, 在这次重构中,摒弃了 leveldb 持久性存储而采用内存存储机制。在新版本的 FreeMQTT 同时支持 MQTT 3.1.1 & MQTT 5.0,但不再支持 MQTT 3.1;采用了新的存储管理与订阅匹配算法,匹配时间复杂度为 O(1)。
当前 FreeMQTT 最新版本号为 v1.02
理念
- 以人为本,面向用户
- 取舍有度,做精做强
- 不尚空谈,不搞花架子
- 化繁为简,去伪存真
- 持续迭代,精益求精
- 安全第一,高效稳定
特色
独特的应用隔离安全机制
- FreeMQTT 把每个接入的 MQTT 客户端划归为一个独立的 App
- 通过 freemqtt_token 命令为每个App生成令牌Token(可生成多个)
- 令牌 Token 含有 App ID 并用秘钥 secret 进行了加密签名
- MQTT 客户端连接 FreeMQTT 时将令牌 Token 做口令 password 传入 connect 方法
- FreeMQTT 在接收到 CONNECT 消息时,通过解密,验证签名来进行鉴权
- 如果 FreeMQTT 鉴权成功,则会从令牌Token得到MQTT客户所属的App ID
- 不同的App之间,MQTT客户是相互独立的,例如 App A 有个客户A, App B 有个客户B,则客户A与客户B可以具有相同的客户ID
- 每个App相当于一个虚拟的MQTT Server
- 不同的App之间消息隔离,互不干扰
独特的存储管理与订阅匹配算法
- 独特的存储管理架构
- 独特Topic和订阅Topic Filter匹配算法,匹配时间复杂度为 O(1)
- 在Topic级数固定的情形下,主题Topic匹配速度是有界的常数
- 匹配时间不会随着客户端订阅的主题增加而增加
定期发布统计信息
- 定期通过系统主题 $SYS/METRICS 发布每个Application统计信息
- 在线客户数、收发消息总数、普通订阅主题数、共享订阅主题数、retain 消息数、服务器持续运行时间
独有的MQTT客户端上线下线通知机制
- 通过系统主题 $SYS/ONLINE 实时通知客户上线
- 通过系统主题 $SYS/OFFLINE 实时通知客户下线
- 避免了传统的需要客户端设置的遗嘱消息才能得到离线的通知,且不能得到上线通知
支持MQTT3.1.1和MQTT5.0 客户互通共存
- 可以同时接受MQTT3.1.1 & MQTT5.0的客户接入
- MQTT3.1.1和MQTT5.0客户之间可以互通消息