使用说明
提示
- 代码仓库:
- 开发环境:Java 8
- 在线体验:http://82.157.162.230:8083/ (opens new window)
- 账号:samrt-mqtt
- 密码:smart-mqtt
- 目标读者:
- 拥有上万个设备连接量的物联网用户(连接量不多的可选择免费的平替产品)
- 需要打造 IM 产品的用户
# 1. 关于 smart-mqtt
smart-mqtt 是 smartboot 组织内首个尝试走商业化路线的作品。
虽然我们知道用户更喜欢免费的开源产品,决定探索商业化路线势必会遭受一些非议。 更何况 smart-mqtt 是那么的年轻,距离成熟的商业化产品还有很长一段路要走。
但是多年开源经历,我们看到了很多开源作者正是因为没能从开源中获得可持续的收益,最终因生活所迫无奈选择终止维护开源项目。 开源不易,我们始于热爱,敬于技术,更要忠于生活。
从技术角度而言,一款能够承载海量设备互通互联的产品,一定是具备相当高的业务价值。 打造这样一款产品,要么背后有大厂支持为研发成本买单;要么依靠市场的正向反馈使其可持续迭代发展下去,而 smart-mqtt 正是后者。
好的产品,本身就该成为好的商品;一个有价值的产品,理当成为一款有价格的商品。
# 1.1 版本对比
社区版 | 企业版 | |
---|---|---|
授权对象 | 个人 | 企业 |
授权目的 | 技术学习 | 商业化 |
授权形式 | AGPL 3.0 | 商业化 License |
MQTT/TCP | ✅ | ✅ |
MQTT/Websocket | ❌ | ✅ |
共享订阅 | ✅ | ✅ |
Broker集群 | ❌ | ✅ |
数据持久化 | ❌ | ✅ |
数据桥接 -- redis | ❌ | ✅ |
数据桥接 -- kafka | ❌ | ✅ |
Dashboard | ❌ | ✅ 在线体验 (opens new window) |
# 1.2 成本估算
云产品的采购成本几乎同连接量成线性增长关系,而 smart-mqtt 本就存在性能溢出的优势,所以连接量越大,性价比越高。
规格 | Saas云产品 | smart-mqtt |
---|---|---|
1000连接/1000TPS/1000订阅 | 1.7万/年 | 3000~5000 + 授权费 |
50000连接/20000TPS/1000订阅 | 37万/年 | 5000~10000 + 授权费 |
100万连接/20万TPS/100万订阅 | 376.8万/年 | ~10万 + 授权费 |
# 1.3 同类产品比较
从计算机语言体系而言,大家普遍认为 Java 不具备优势。但事实情况是,Java 研发的中间件性能可以非常高。
只不过因为程序员通常会选择性忽略自身的不足,而把问题的根源加之于他方。 再加上 Java 的从业用户和项目基数过于庞大,就会有大量所谓的“事实案例”在控诉 Java 在性能、内存等方面的短板。 这属于认知问题。
回归到 Java 语言体系,市面上确实存在众多的 MQTT Broker 产品,但几乎都是在 Netty 之上做的封装。 这些项目的通信能力基于 Netty,MQTT 协议编解码亦基于 Netty。此类产品缺乏真正的核心竞争力,这属于技术问题。
smart-mqtt 底层通信采用自研的框架 smart-socket (opens new window), 并在 techempower (opens new window) 用数据证明了 Java 的性能并不低于任何的计算机语言。 再结合出色的 MQTT 编解码算法和通信模型设计,使得 smart-mqtt 有着深厚又扎实的基座。
总结下来 smart-mqtt 有以下几点优势这得您考虑选择它:
- 开放性
基于事件总线的架构模式,用户可将非 mqtt 的南向协议适配融入 smart-mqtt;也可将 mqtt 消息桥接至任意的北向服务。 - 亲和性
在当下以 Java 为主流开发语言的环境下,smart-mqtt 天然适合绝大多数从业者。 - 可替代性
smart-mqtt 完全遵循 MQTT 协议规范,用户无需担心被本产品捆绑。任何时候若觉得这款产品不再适合自己,可快速切换至其他同类产品。 - 纯国产血统(符合信创场景需求)
- 底层通信采用了自研通信框架 smart-socket (opens new window)
- http服务为亦是自研的 smart-http (opens new window)
- 前端框架为华为云开源的前端解决方案opentiny (opens new window)
提示
凡是提供同类比较的技术产品,通常的结论是自身各项能力都优于其他比较对象。试问这种结果是否真的客观、公正? 本着对用户负责的态度,我们不提供这种比较结论。
下面收集了市面上一些 mqtt 产品,您可根据自身判断选择合适的一款:
项目 | 语言 | 出品方 | 地址 |
---|---|---|---|
⭐️emqx | Erlang | EMQ | https://github.com/emqx/emqx (opens new window) |
⭐️Mosquitto | C | Eclipse | https://mosquitto.org/ (opens new window) |
⭐️Hivemq | Java | 国外产品 | https://www.hivemq.com/ (opens new window) |
FluxMQ | Java | FluxMQ | https://www.fluxmq.com/ (opens new window) |
mica-mqtt | Java | 如梦技术 | https://gitee.com/596392912/mica-mqtt (opens new window) |
BifroMQ | Java | 百度 | https://github.com/baidu/bifromq (opens new window) |
如果不希望出现在上述列表,可联系我们将其下线。
# 1.4 我们的用户
赞助商
提示
赞助通道已于 2024-01-01 关闭,仅符合条件的赞助商可继续以赞助金额获得 smart-mqtt 企业版授权。
武汉****科技有限公司
铂金赞助商
- name: 武汉****科技有限公司
desc: "铂金赞助商"
avatar: /img.png
2
3
武汉睿友科技有限公司
白银赞助商
- name: 武汉睿友科技有限公司
desc: "白银赞助商"
bgColor: '#718971'
textColor: '#fff'
avatar: ./img/backers/whrykj.png
2
3
4
5
企业支持计划用户
上海极锐星瀚传感技术有限公司
企业支持计划至 2024-12-16
宿迁市裕百信养殖服务有限公司
企业支持计划至 2024-12-07
北京盈泽世纪科技有限公司
数据监控
数研院(云南)信息产业发展有限公司
企业支持计划至 2024-06-01
- name: 上海极锐星瀚传感技术有限公司
desc: "企业支持计划至 2024-12-16"
avatar: https://foruda.gitee.com/images/1702712973986107309/d850d72d_5608665.png
- name: 宿迁市裕百信养殖服务有限公司
desc: "企业支持计划至 2024-12-07"
avatar: ./img/users/user_ybx.jpg
- name: 北京盈泽世纪科技有限公司
desc: "数据监控"
link: http://www.yingzeshiji.com.cn/
avatar: ./img/users/user_yzsj.png
- name: 数研院(云南)信息产业发展有限公司
desc: "企业支持计划至 2024-06-01"
# link: http://www.yingzeshiji.com.cn/
avatar: ./img/users/user_cyjk.png
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2. 快速启动
# 2.1 体验版
通过在 docker 环境下执行以下命令,可以一键拉起 smart-mqtt 服务,此时您将获得60分钟的企业版体验时长。
docker run --name smart-mqtt -p 18083:18083 -p 1883:1883 -d smartboot/smart-mqtt:latest
试用结束后某些功能将无法正常使用,直至导入正版授权 License。
# 2.2 正式版
正式版与体验版使用的是同一份镜像文件,差别在于两者环境搭的建步骤不同。 如果体验版通过贵公司的产品调研,可按照如下步骤获得正式授权:
获得授权凭证
对于获得 smart-mqtt 企业版授权资格的用户,我们会以邮件形式为发放一份名为:License.shield
的授权文件。 通过该文件,可以开启 smart-mqtt 企业版的各项高级特性。温馨提示
获得授权的企业用户有义务、也有责任妥善保管该授权文件。 若出现违规行为致使非授权对象使用了企业版功能,将被列入黑名单且不再允许使用 smartboot 相关技术和产品。
创建数据库
正式环境下我们推荐采用 mysql 进行数据持久化,所以请提前创建好数据:smart_mqtt。我们的程序会在第一次启动时自动完成表结构和数据初始化。
create database smart_mqtt;
- 调整配置文件,示例:
# 以下关于数据库具体连接信息采用 ${...} 表示,请按实际情况调整
docker run --name smart-mqtt \
-e BROKER_DBTYPE=mysql
-e BROKER_URL=jdbc:mysql://${host}:${port}/smart_mqtt?autoReconnect=true \
-e BROKER_USERNAME=${username} \
-e BROKER_PASSWORD=${password} \
-p 18083:18083 -p 1883:1883 -d smartboot/smart-mqtt:latest
2
3
4
5
6
7
- 待容器启动成功后,打开浏览器,登录 smart-mqtt 企业版管理后台。参照《3.2 License 管理》章节导入正式版
License.shield
,自此,smart-mqtt 企业版正式授权完成。
# 3. 功能介绍
# 3.1 登录系统
打开浏览器,输入 smart-mqtt 企业版管理后台地址,界面如下。
系统初始账号密码为:smart-mqtt/smart-mqtt
,强烈建议及时修改安全级别更高的密码。系统并未提供密码找回功能,请妥善掌管次账号密码。
# 3.2 License 管理
如若 License 已失效,登录系统后将自动跳转至以下页面。您需要通过底部的导入License
替换成有效的 License,导入成功后页面会自动跳转至 Dashboard 页面。
进入后台系统后,可以在页面顶部看到企业版的授权信息(如下图)。
对于试用版或者即将过期的 License,会以红色加粗的字体给出提示信息,用户可点击更换按钮导入新 License。
# 3.3 Dashboard
Dashboard 自上而下分为三块区域:
节点看板
实时展示当前 mqtt 集群各节点的运行状况。包括:smart-mqtt 版本号、JVM相关信息、节点CPU和内存使用率等。
地区分布
统计各省份地区的客户端累计连接量,并以不同档位在地图上标注不同的颜色。
指标统计 根据选择的时间范围,对各项指标做聚合统计并以图表形式展现。支持的统计指标分别为:
- 连接数
- Publish消息接收数
- Publish消息发送数
# 3.4 资源中心
# 3.4.1 连接管理
记录所有客户端连接信息,并提供各类条件查询能力。
对于海量连接的场景(例如十万级、百万级),需要充分评估数据库资源。尤其在瞬时产生大量连接时,将对数据库造成一定压力。 必要时候可以考虑关闭连接信息的数据库持久化,采用日志记录模式以获得更加性能表现。
# 3.4.2 Topic管理
展示当前 smart-mqtt 平台被订阅的 topic,以及订阅该 topic 的客户端数量。
如果订阅的 topic 数量比较多,并对数据库存储造成一定负担,可以考虑关闭连接信息的数据库持久化,采用日志记录模式以获得更加性能表现。
# 3.4.3 访问控制
为了提供更好的安全保障,smart-mqtt 为客户端提供了多种形式的身份合法性检验。
- 无需认证
这是 smart-mqtt 出厂默认的认证模式,即允许所有客户端链接。如在生产环境中使用,请提前配置好合适的认证模式。 - 密码认证
密码认证是一种最简单,同时也是最常用的认证方式。
当客户端发起连接认证时,会将携带的用户名、密码与 smart-mqtt 平台管理的认证信息作匹配。符合条件则认证通过,否则连接将被断开。
出于性能考虑,密码认证模式的全量配置都缓存于本地内存。而对于一机一密的海量认证场景,会存在较高的内存开销,建议采用「RestAPI 认证」模式。 - RestAPI认证
将客户端传递的认证信息转发至 HTTP 服务,并根据请求返回的内容判断认证结果,从而实现复杂、灵活的认证鉴权逻辑。
# 3.4 数据中心
# 3.4.1 数据桥接
桥接是用来对接 MQTT Broker 和外部数据系统的通道。 外部数据系统可以是 MySQL、MongoDB、InfluxDB 等数据库, 也可以是 Kafka,RocketMQ 等消息中间件,或者是 HTTP 服务器等。
通过桥接技术,用户可以实时地将消息从 MQTT Broker 发送到外部数据系统。
redis-bridge
- 启动 Redis 服务
为了便于演示,我们采用 docker 快速搭建出一套 redis 环境,并设置了连接认证密码为:
smart-mqtt
。
docker run --name redis -p 6379:6379 -d redis --requirepass "smart-mqtt"
- 配置Redis插件
# 3.5 系统设置
# 3.5.1 用户管理
在用户管理页面内提供了基本的账户新增和删除功能,但并没有提供账户编辑能力。 之所以提供如此简陋的能力,主要考虑到这是一款中间件产品,并不需要复杂的用户体系。 况且这款产品的主要目标用户是物联网平台的研发或者运维,受众群体相对聚焦。
# 3.5.2 Broker管理
Broker管理页面中展示了当前集群的所有节点信息。 点击集群拓扑按钮可以查看集群各节点的组织结构。
# 4. 产品设计
# 4.1 数据持久化
smart-mqtt 企业版将提供相对自由的数据持久化选型。目前已经适配了:H2 和 MySQL 两种数据库,其中 H2 数据库又分为内存模式和文件模式。
选择不同的持久化策略,会有着不同的服务效果:
- h2_mem
H2数据库的内存模式,重启服务将会丢失数据,通常用于企业版的演示环境。 - h2
H2 数据库的文件模式,会在运行包的同目录下生成smart-mqtt.mv.db
文件,选择该模式会在重启Broker服务时会保留历史数据。
该模式的优点在于无外部依赖,开箱即用。单缺点是多个Broker服务无法共享同一个 H2 数据库文件,不适用Broker集群环境。 - mysql
可靠性相对较高的持久化模式。多 Broker 连接同一数据库可方便组织成集群,各节点信息、数据交互便利。
缺点在于需要额外维护 MySQL 服务,好在目前此类数据库通常由云厂商托管了,也算省心省力。
# 4.2 运行指标
# 4.3 Websocket
WebSocket是一种在浏览器和web服务器之间提供双向通信的网络协议。
smart-mqtt 依托于 smart-http 提供的 websocket 能力,成功的将基于 websocket 协议的 MQTT 消息接入 Broker。 使其与普通 TCP 形式的 MQTT 保持一致的规范、体验和服务。
plugins:
- websocket:
port: 1884
2
3
# 4.4 集群部署
smart-mqtt 支持多个 Broker 服务组织成一套分布式集群。
任意一个 Broker 接收到外部投递的消息后,除了推送给与当前Broker连接的客户端; 还会分发给集群内其他匹配订阅规则的 Broker 节点,再由该节点将消息推送给与之连接的客户端。
提示
而对于 Broker 分发过来的消息,不会被集群内的接受者 Broker 二次分发。
启用集群功能只需要在配置文件中加入以下配置值。
plugins:
- enterprise:
cluster:
enable: true
nodes:
- mqtt://cluster-node-1:1883
- mqtt://cluster-node-2:1883
- mqtts://cluster-node-3:1883
2
3
4
5
6
7
8
- enable:是否启用集群功能。
- nodes:集群中其他节点通信地址。内网环境推荐使用
mqtt://
互联,可获得更好的通信性能。若涉及到跨网络、跨云的集群模式,通过启用mqtts://
以获得数据安全保障。注意
- 修改配置文件后需重启服务方可生效。
- 集群节点数需限定在获得授权的范围内,如需扩容请重新发起授权申请。 :::
# 4.5 负载均衡(Load Balance)
为了提高 MQTT Broker 集群的可用性、实现负载平衡以及动态扩容,生产场景下通常在客户端与 Broker 集群之间架设一套负载均衡服务。
如果出于安全需要客户端启用 TLS 安全连接,也可将其终止于 Load Balance。Load Balance 与 后端 Broker 集群采用普通 TCP 连接。
市面上多家云厂商都提供了 LB 产品可供选择。倘若需要私有部署可考虑以下产品:
开源LB | 地址 |
---|---|
Haproxy | https://www.haproxy.com/solutions/load-balancing/ (opens new window) |
Nginx | https://www.nginx.com/learn/load-balancing/ (opens new window) |
# 4.6 共享订阅
共享订阅是 MQTT 5.0 协议引入的一项高级特性,它增强了传统发布/订阅模型的功能以实现更灵活的消息分发和负载均衡。在共享订阅模式下,多个客户端可以共同订阅一个特定的主题,并通过特殊的订阅名格式来标识它们属于同一个共享订阅组。
不同于常规订阅,在共享订阅中,消息发布者发送到某个主题的消息不会被每个订阅该主题的客户端独立接收。取而代之的是,MQTT 代理(Broker)会根据预定义的策略将消息路由给共享订阅组中的不同客户端。例如,消息可以轮流分配给组内的各个客户端,或者基于某种负载均衡算法进行动态分配。
这种机制有助于避免单点过载,尤其是在处理大量并发消息或确保高可用性场景时。smart-mqtt 也支持共享订阅功能,允许用户在云端部署的应用程序中利用这一特性来提高系统伸缩性和消息处理效率,同时减少不必要的消息重复和潜在的数据处理瓶颈。
# 5. 附录
# 5.1 配置说明
为了提供兼具可读性和可维护性的配置体验,smart-mqtt 采用 yml 格式管理自身配置,其主体结构分为两大块:Broker基础配置、插件配置。
# Broker基础配置
broker:
# 节点ID,集群部署时要求集群内唯一
nodeId: smart-mqtt
# Broker 服务的端口号,默认:1883
port: 1883
# Broker 服务绑定的本地 IP 地址,若为空则所有 IP 可用。
host: 0.0.0.0
#Broker 的服务线程数,默认等同于当前服务器的 CPU 核数。
threadNum: 16
#消息推送服务的线程数,默认等同于当前服务器的 CPU 核数。
pushThreadNum: 16
#IO缓冲区大小,默认:**4096**。合理的大小设置会带来更好的通信性能,具体参考《缓冲区调优》。
bufferSize: 4096
#在完成应答前,同时投递的 QoS 1 和 QoS 2 消息的最大数量。
maxInflight: 256
#限制单个MQTT消息包的最大字节数,默认:**1048576**(1MB)
maxPacketSize: 4096
#Broker支持的Topic数量上限,默认:1024.
topicLimit: 1024
# 客户端支持的最长`keep-alive`时长。当发送的`Connect`中夹带的keepAlive时长超过改值时,将以`maxKeepAliveTime`为准。
maxKeepAliveTime:
#网络连接建立后,如果服务端在合理的时间内没有收到 CONNECT 报文,服务端应该关闭这个连接。
#单位:**毫秒**,默认:**5000**。
noConnectIdleTimeout: 5000
clusterEndpoint: mqtt://127.0.0.1:1883
nodeType: "core"
plugins:
- enterprise:
metric:
enable: true
period: 1
openapi:
port: 18083
host: 0.0.0.0
- database:
dbType: mysql
url: jdbc:mysql://{host:port}/smart_mqtt?autoReconnect=true
username: username
password: password
- websocket:
port: 1884
- redis-bridge:
enable: true
- kafka-bridge:
enable: true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 5.2 常见问题及调优
为了使系统具备更大的连接能力,可在宿主机执行以下命令。
echo 200000000 > /proc/sys/net/netfilter/nf_conntrack_max
echo 200000000 > /proc/sys/fs/file-max
2
# 5.3 免责申明
本免责声明适用于smart-mqtt产品(以下简称“产品”)的使用。在使用产品之前,请仔细阅读并充分理解本免责声明的内容。如您不同意本免责声明的任何内容,请立即停止使用产品。
产品描述
smart-mqtt是一款基于MQTT协议的开源物联网消息代理软件。它提供了一种简单、高效的方式来实现设备之间的通信和数据传输。
声明内容:
- 产品按“原状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定目的的适用性和非侵权性的保证。在任何情况下,对于因使用或依赖产品而导致的任何损失,我们概不负责。
- 我们对产品的使用不做任何形式的保证,包括但不限于对产品的性能、功能、准确性、可靠性、完整性、及时性、适用性等的保证。用户应对产品的使用自行承担风险。
- 我们对由于产品使用而引起的任何间接、特殊、偶然或后果性损失概不负责,包括但不限于利润损失、业务中断、数据丢失等。
- 我们对任何第三方通过产品进行的侵权行为概不负责。用户应自行承担与产品使用相关的法律责任。
- 我们对产品的安全性和稳定性不作任何保证。用户应自行采取必要的安全措施,以防止产品被未经授权的访问、篡改或破坏。
适用法律和管辖权
本免责声明的解释和适用均受到中华人民共和国法律的约束。如发生争议,双方应首先友好协商解决;协商不成的,任何一方均有权将争议提交至产品所在地的人民法院诉讼解决。
其他条款
- 本免责声明构成您与smart-mqtt之间关于产品的完整协议,取代您与smart-mqtt之间关于产品的任何其他协议、承诺或声明。
- 在未取得我们事先书面同意的情况下,我们不对本免责声明的任何条款进行修改或补充。
- 如果您对本免责声明有任何疑问或需要进一步解释,请联系我们。我们将尽力为您提供帮助和解答。
# 5.4 关于授权
smart-mqtt 以年订阅制的形式提供商业授权,每年的定价会随着项目自身发展状况而有所调整。客户可根据当年定价购买任意年限的授权,从而不受后续价格波动影响。
年份 | 价格 |
---|---|
2024 | 10000 元/年 |
对于本产品的意向客户,请注意以下几点:
- 如果当下能找到其他性价比更高的替代方案,请勿考虑 smart-mqtt。
- 我们不是一家企业,而是专注于技术的开源组织,有限的精力难以保障周到的售后服务。体验版所见之能力,便是商业授权之所得。决定订阅授权前,请充分验证体验版功能是否符合自身要求。
- 您所购买的是 smart-mqtt 当前能力在一定时期内的使用权。请不要提一些额外的需求,除非符合 smart-mqtt 今后的发展路线。
- 充分理解并同意我们的免责声明。