【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
前言
目前要处理大量设备同时频繁发送数据的情况,MQTT协议确实是一个更优的选择,因为它特别适合需要低带宽和高效能的物联网应用,下面是对目前主流协议的对比
数据截止日期:2024年11月10日
基础设施
- 后端: springcloud项目
- 设备端:IOT设备,每秒上报数据
对比项
| 特性 | RabbitMQ | Mosquitto | EMQX |
|---|---|---|---|
| 主要协议支持 | MQTT, AMQP, STOMP,等 | MQTT | MQTT, WebSocket, MQTT-SN |
| 适用场景 | 高可配置性、多协议需求、企业级应用 | 轻量级 IoT 应用、低资源消耗场景 | 大规模 IoT 应用、高并发连接 |
| 性能 | 高性能,通过插件支持 MQTT | 高效处理大量小型消息 | 高性能,优化用于大量设备并发 |
| 资源效率 | 相对较高的资源消耗 | 低资源消耗 | 低资源消耗,尤其在处理大量连接时 |
| 扩展性 | 高,支持集群模式 | 有限,主要依赖于单个节点的性能 | 非常高,设计用于横向扩展 |
| 客户端库兼容性 | 丰富的客户端库支持多种编程语言 | MQTT 客户端库广泛支持 | MQTT 客户端库广泛支持 |
| 社区和支持 | 活跃的社区支持,广泛的文档和使用案例 | 社区支持较强,文档充足 | 活跃的社区,提供专业支持和丰富的文档 |
| 高可用性和可靠性 | 支持持久化和消息确认,可配置的镜像队列和故障转移 | 支持持久化但配置较简单 | 高可用性配置,支持持久化和多种故障恢复机制 |
| 安全性 | 支持多种认证和授权方式,TLS加密 | 支持基本的认证和TLS加密 | 支持多种认证方式,TLS加密,访问控制和插件式安全策略 |
| 安装和配置的简易性 | 较复杂,尤其在集群和多协议配置时 | 简单易安装,配置简便 | 简单易安装,配置简便,具有高级配置选项 |
| 消息队列特性 | 延迟消息、消息排序、死信队列 | 较为基础的消息队列特性 | 延迟消息、消息路由、死信队列 |
| 监控与管理 | 强大的监控和管理工具,支持管理界面 | 基本的监控能力,依赖外部工具 | 强大的监控能力,包括官方和第三方管理界面 |
| 跨语言支持 | 广泛支持多种编程语言 | 主要支持通过 MQTT 协议进行交互的语言 | 广泛支持多种编程语言 |
| 透明度和开放性 | 开源,社区驱动,良好的企业支持 | 开源,由社区驱动 | 开源,有专业企业支持和社区版 |
| 消息持久化选项 | 多种持久化配置,支持持久化队列和消息 | 支持基础的消息持久化 | 支持高级持久化配置,如持久化订阅、消息存储 |
| 消息分发策略 | 支持多种分发策略,如循环、公平调度 | 基本的循环分发策略 | 支持灵活的消息分发策略,包括基于主题的负载均衡 |
| 集群能力 | 支持复杂的集群配置,包括节点镜像、集群间同步 | 仅支持基本的集群,不具备复杂的故障恢复和同步能力 | 高度可扩展的集群系统,支持跨区域集群 |
| 负载均衡 | 需要外部工具支持负载均衡 | 通常依赖于DNS或其他外部负载均衡机制 | 内置支持负载均衡,可通过配置实现更复杂的负载均衡策略 |
| 协议转换能力 | 支持多协议互操作,能够在不同的协议之间转换消息 | 专注于MQTT,没有内置的协议转换功能 | 支持MQTT与其他几种协议的转换,适合多协议环境 |
| 延迟和吞吐量 | 高吞吐量,延迟取决于配置和网络条件 | 高效率,低延迟,适合小型消息 | 设计用于高吞吐量和低延迟,优化了消息处理路径 |
| 适用规模 | 适合中到大型企业级应用 | 适合小型到中型项目,尤其是资源受限的环境 | 适合大规模部署,尤其是需要管理大量IoT设备的场景 |
| 插件系统 | 强大的插件系统,支持扩展功能和自定义开发 | 插件支持较少,功能相对有限 | 丰富的插件支持,可通过插件扩展或改变核心功能 |
| 文档和学习资源 | 详尽的官方文档和广泛的社区资源 | 文档全面,社区活跃 | 详细的文档和专业的支持,包括在线教程和案例 |
| 许可和成本 | 开源,也提供商业版 | 完全开源 | 开源社区版和商业版 |
| 数据压缩 | 支持通过插件或客户端库实现 | 不支持内置数据压缩 | 支持数据压缩,减少带宽使用 |
| 事务支持 | 支持事务,可以进行消息发布和确认的事务处理 | 基本的QoS支持,没有完整的事务机制 | 支持事务处理,确保消息的完整性 |
| 多租户支持 | 通过虚拟主机支持多租户 | 不支持多租户 | 支持多租户,允许多个隔离的环境在同一个实例中运行 |
| 客户端连接策略 | 支持复杂的连接策略,包括超时、限制连接数等 | 支持基本的连接管理,如超时和连接数限制 | 支持详尽的连接策略,包括IP黑白名单、TLS双向认证等 |
| 版本兼容性 | 良好的向后兼容性 | 良好的向后兼容性 | 良好的向后兼容性,定期更新以支持新的MQTT标准 |
| 定制开发 | 强大的插件架构允许广泛的定制开发 | 限制性较高,插件开发相对有限 | 支持广泛的定制开发,插件市场提供多种功能 |
| 实时监控和日志记录 | 提供详细的监控和日志记录能力,可通过管理界面访问 | 提供基本的日志记录功能,监控功能较为基础 | 提供高级的实时监控和日志记录,包括客户端活动、消息流等 |
| 系统资源消耗 | 中到高资源消耗 | 低资源消耗 | 中资源消耗,但在高负载情况下管理良好 |
| 灾难恢复 | 支持集群镜像和数据复制,灾难恢复能力强 | 基本的支持,依赖于持久化和备份 | 支持高级的灾难恢复策略,如数据复制和自动故障转移 |
| 用户和权限管理 | 提供详尽的用户管理和权限控制功能 | 基本的用户认证和权限设置 | 提供高级的用户和权限管理,支持复杂的权限配置 |
| 部署便利性 | 支持多种部署选项,如本地、云环境和容器化部署 | 极易部署,适合轻量级和容器化部署 | 支持广泛的部署选项,包括Kubernetes和Docker容器化部署 |
| 开发者工具 | 提供插件和管理工具,支持广泛的客户端库 | 主要依赖第三方开发工具和简洁的配置管理 | 提供丰富的开发者工具,包括Dashboard和API管理 |
| 协议扩展性 | 支持通过插件扩展其他协议 | 限于MQTT,不支持直接扩展为其他消息协议 | 支持多协议扩展,可以与WebSocket、HTTP、CoAP等协议集成 |
| 云服务集成 | 与多个云服务提供商有集成解决方案,如AWS、Azure | 集成较少,通常需要手动配置或使用第三方工具 | 强大的云服务集成,特别是在IoT云平台上的应用 |
| 容错机制 | 高级容错机制,包括队列镜像和节点复制 | 基本的容错支持,依赖于持久化和客户端重新连接 | 提供详细的容错和故障转移策略,支持多种备份和恢复选项 |
| 国际化和本地化支持 | 支持多语言管理界面和文档 | 英文为主,部分支持其他语言 | 提供多语言支持和本地化管理界面 |
| 监控与警报系统 | 高级监控系统,支持与外部监控工具集成,如Prometheus | 提供基础的监控功能,可通过插件增强 | 内置强大的监控系统,支持实时数据分析和警报系统 |
| 支持的操作系统 | 支持广泛的操作系统,包括Windows、Linux、MacOS | 主要支持Unix-like系统,Windows支持较为有限 | 广泛支持各种操作系统,包括较新的Linux发行版 |
| 社区活跃度和支持 | 拥有庞大且活跃的社区,提供企业级支持 | 社区支持强,但规模较小,主要由开源贡献者维护 | 拥有非常活跃的社区和企业级支持 |
| 性价比 | 中到高,取决于部署复杂度和企业支持需求 | 高性价比,适合预算有限的项目 | 高性价比,尤其在大规模部署时 |
GitHub社区活跃度
以下是更新后的RabbitMQ、Mosquitto和EMQX在GitHub上的开源项目对比表格:
| 特性 | RabbitMQ | Mosquitto | EMQX |
|---|---|---|---|
| GitHub 星标 (Stars) | 约 12.3千 | 约 9千 | 约 14.1千 |
| Forks 数量 | 约 3.9千 | 约 2.4千 | 约 2.2千 |
| 开放的问题 (Open Issues) | 224个 | 79个 | 164个 |
| Pull Requests | 46个 | 2个 | 51个 |
| 主要编程语言 | Erlang | C | Erlang/Java |
| 最近更新时间 | 2024年11月10日 | 2024年10月29日 | 2024年11月10日 |
解释:
- 星标:反映了项目在开源社区中的受欢迎程度。
- Forks:表示项目代码被复制的次数,多数用于个人项目或分支项目的开发。
- 开放的问题:显示了项目中待解决的问题数量,反映了项目活跃度及社区参与度。
- Pull Requests:提交的代码合并请求数量,也是衡量项目活跃度的指标。
- 主要编程语言:项目主要使用的编程语言。
- 最近更新时间:项目最后一次更新的时间,反映了项目的维护状态。
优缺点
RabbitMQ
| 特性 | 优点 | 缺点 |
|---|---|---|
| 消息路由 | - 多协议支持:支持AMQP、MQTT等多种协议,灵活性高,可适应复杂的消息传递需求。 - 复杂路由:具备丰富的路由功能,适合需要不同规则和队列的场景。 | - 高资源消耗:相较于Mosquitto、EMQX,在高并发MQTT场景下性能和效率稍弱。 - MQTT功能有限:作为MQTT代理时功能受限,更适合AMQP。 |
| 企业集成 | - 可靠性高:支持持久化和确认机制,适合对消息传递可靠性要求高的企业应用。 - 良好支持:广泛用于企业场景,且社区支持和文档较丰富。 | - 复杂性:部署和配置较复杂,集成成本较高,尤其是在只需要基础MQTT功能时显得过于复杂。 |
| 适用场景 | 复杂消息路由和企业级可靠消息传递场景,如跨协议系统或多种数据处理需求。 |
Mosquitto
| 特性 | 优点 | 缺点 |
|---|---|---|
| 轻量级 | - 资源占用少:特别适合嵌入式设备和低资源环境。 - 易于集成:安装和配置简单,适合小规模项目和测试。 | - 扩展性有限:不支持分布式集群,适合小规模设备接入。 - 功能较少:缺乏高级规则引擎和复杂数据路由能力。 |
| 消息延迟 | - 低延迟:在低带宽环境下表现良好,适合简单消息传输需求。 | - MQTT 5.0支持缺乏:不完全支持最新MQTT 5.0标准的功能。 |
| 适用场景 | 嵌入式设备、资源受限环境和小规模设备连接,适合单节点、简单数据传输的物联网应用。 |
EMQX
| 特性 | 优点 | 缺点 |
|---|---|---|
| 高并发 | - 高性能和分布式:支持大规模设备同时连接,适合高并发数据场景。 - 集群支持:具备分布式架构,可实现高扩展性。 | - 资源需求较高:相比Mosquitto更占用资源,不适合低性能硬件。 - 部署复杂:配置和集群设置相对复杂。 |
| 功能 | - 高级规则引擎:支持数据流向灵活配置,适合实时数据处理需求。 - MQTT 5.0支持:支持最新MQTT协议,提升安全性。 | - 学习成本高:对于技术要求较高的场景,维护和学习成本相对较高。 |
| 适用场景 | 高并发、大规模物联网应用场景,如智能医疗设备的大规模数据上传和监控。 |
相关文章:
【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
前言 目前要处理大量设备同时频繁发送数据的情况,MQTT协议确实是一个更优的选择,因为它特别适合需要低带宽和高效能的物联网应用,下面是对目前主流协议的对比 数据截止日期:2024年11月10日 基础设施 后端: springclo…...
【C#/C++】C++/CL中String^的含义和举例,C++层需要调用C#层对象时...
示例: String^ IDataServer::GetParam(String^ aParamName){ /// }在 C/CLI 中,String^ 和 IDataServer::GetParam(String^ aParamName) 这种写法是一种混合了 C 和 .NET 的语法,用于在 C 中操作 .NET 对象。C/CLI 是微软扩展的 C 语言&…...
Python学习从0到1 day26 第三阶段 Spark ② 数据计算Ⅰ
人总是会执着于失去的,而又不珍惜现在所拥有的 —— 24.11.9 一、map方法 PySpark的数据计算,都是基于RDD对象来进行的,采用依赖进行,RDD对象内置丰富的成员方法(算子) map算子 功能:map算子…...
【详细】如何优雅地删除 Docker 容器与镜像
内容预览 ≧∀≦ゞ 镜像与容器的区别删除容器和镜像的具体步骤1. 删除容器步骤 1:查看当前运行的容器步骤 2:停止容器步骤 3:删除容器 2. 删除镜像步骤 1:查看镜像列表步骤 2:删除镜像 3. 删除所有容器和镜像 使用 1Pa…...
Spring Spring Boot 常用注解总结
在 Java 开发中,Spring 和 Spring Boot 框架广泛应用于企业级应用开发。这两个框架提供了丰富的注解,使得开发更加高效和便捷。本文将对 Spring 和 Spring Boot 中常用的注解进行总结。 一、Spring 常用注解 1. Component 作用:用于将普通的…...
Flink独立集群+Flink整合yarn
Flink独立集群的搭建: 1、上传解压配置环境变量 # 1、解压 tar -xvf flink-1.15.4-bin-scala_2.12.tgz # 2、修改环境变量 export FLINK_HOME/usr/local/soft/flink-1.15.4 export PATH$PATH:$FLINK_HOME/bin 2、修改配置文件 cd /usr/local/soft/flink-1.15.4/…...
动态规划 之 简单多状态 dp 问题 算法专题
一. 按摩师 按摩师 状态表示 根据经验 题目要求 dp[i] 表示: 选择到i位置时, 此时的最长预约时长 但是根据题目又分成两种情况: f[i] : 选择到 i 位置的时候, nums[i] 必选, 此时的最长预约时长 g[i] : 选择到 i 位置的时候, nums[i] 不选, 此时的最长预约时长状态转移方程 …...
qt QPixmapCache详解
1、概述 QPixmapCache是Qt框架中提供的一个功能强大的图像缓存管理工具类。它允许开发者在全局范围内缓存QPixmap对象,从而有效减少图像的重复加载,提高图像加载和显示的效率。这对于需要频繁加载和显示图像的用户界面应用来说尤为重要,能够…...
Redis中的持久化
什么是 Redis 持久化? Redis 是一个内存数据库,也就是说它主要把数据存储在内存中,这样可以实现非常高的读写速度。通常,内存数据库是非常快速且高效的,但它也有一个很大的问题:数据丢失的风险。因为当 Red…...
Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称
常规限定文本长度 ( 通过 UntiyEngine.UI.Inputfiled 附带的长度限定 ) 痛点1 无法对中文,数字,英文进行识别,同样数量的汉字和同样数量的英文像素长度是不一样的,当我们限定固定长度后,在界面上的排版不够美观 痛点2…...
SMO+PLL滑膜观测器、MARS模型参考自适应观测器simulink仿真
模型内容介绍: (1)SMOPLL滑膜观测器通过SMO估计电机的转速和位置信息,并利用PLL技术对这些信息进行跟踪和校正,以实现高精度的电机控制; (2)MARS是一种基于模型参考自适应控制理论…...
例题解析:利用异或运算(XOR)找出单独的数
异或运算(XOR) 异或运算是一种位运算,通常用符号 ^ 表示。它的运算规则如下: 如果两个二进制位相同,结果为 0。如果两个二进制位不同,结果为 1。 具体来说,对于两个二进制位 a 和 bÿ…...
如何处理微信小程序大量未捕获的异常
1)如何处理微信小程序大量未捕获的异常 2)如何关闭代码创建的纹理的读写,或者创建不带读写的图片 3)回收带有贴图和Collider的Mesh,如何正确用对象池维护 4)Cloth组件使用在一个篮筐上,运行后篮…...
C#-StringBuilder
string:特殊的引用 每次重新赋值或者拼接时会分配新的内存空间,如果一个字符串经常改变会非常浪费空间。 StringBuilder:C#提供的一个用于处理字符串的公共类 修改字符串而不创建新的对象,需要频繁修改和拼接的字符串可以使用它…...
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来): http://localhost/sqli-labs/Less-39/ 本关是堆…...
linux安装zookeeper和kafka集群
linux安装zookeeper和kafka集群 一、Zookeeper集群部署安装zookeeper1. 下载2. 上传, 解压3. 配置 Zookeeper 节点4. 创建 myid 文件5. 启动参数更改6. sh文件授权7. 启动集群8. 防火墙开启端口 验证集群 二、kafka集群安装安装Kafka1. 下载Kafka安装包2. 上传到服务器…...
洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态
Linux系统的资源使用情况,你可以通过使用命令如free、top和netstat来实时监控内存、CPU及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。 本篇教程的灵感源自一位小伙伴的真实经历:…...
“双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!
作为一年一度的消费盛会,2024年“双十一”购物狂欢节早已拉开帷幕。蹲守直播间、在主播热情介绍中点开链接并加购,也已成为大多数人打开“双11”的重要方式。然而,在这火热的购物氛围背后,主播频频“翻车”、优质主播稀缺、客服响…...
Python调用企业微信的扫一扫
在企业微信里面新建了一个应用,指向了搭建服务器上Django写的web应用。 web应用需要使用扫描二维码的功能,就使用了大家都评价效果好的微信的扫一扫,事实也证明微信的扫一扫很好,但实现这个功能还是花了自己不少时间,很…...
速盾:CDN和OBS能共用流量包吗?
CDN和OBS是两种不同的云服务,它们在内容分发和存储方面有着不同的功能和优势。虽然它们都可以用于提供高效的内容分发和存储服务,但是它们的流量包是不能共用的。 CDN,即内容分发网络,是一种通过将内容存储在全球分布的服务器上&…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
