EMQX vs Mosquitto | 2023 MQTT Broker 对比

news/2024/4/24 22:45:11/

引言

物联网开发者需要为自己的物联网项目选择合适的 MQTT 消息产品或服务,从而构建可靠高效的基础数据层,保障上层物联网业务。目前市面上有很多开源的 MQTT 产品,在性能功能等方面各有优点。本文将选取目前最为流行的两个开源 MQTT Broker:EMQX 和 Mosquitto,从技术架构、性能、功能、社区情况等多维度进行 1v1 对比,帮助读者更加深入了解这两个产品。

Mosquitto 简介

Mosquitto 项目最初由 IBM 和 Eurotech 于 2013 年开发,后来于 2016 年捐赠给 Eclipse 基金会。Eclipse Mosquitto 基于 Eclipse 公共许可证(EPL/EDL license)发布,用户可以免费使用。作为全球使用最广的 MQTT 协议实现之一 ,截至 2023 年 3 月,Mosquitto 的 GitHub Star 数超过了 7.1 K。

Mosquitto 用 C/C++ 编写,采用单线程架构。Mosquitto 支持 MQTT 协议的 5.0、3.1.1 和 3.1 版本,同时支持 SSL/TLS 和 WebSockets。轻量级设计使其适合部署在嵌入式设备或资源有限的服务器上。

优点:

  • 易于安装使用
  • 支持 MQTT 5.0 协议
  • 轻量高效
  • 积极的社区支持

缺点:

  • 可扩展性有限(<100k)
  • 没有集群支持
  • 缺少企业功能
  • 有限的云原生支持

EMQX 简介

EMQX 项目于 2012 年底在 Github 发布,许可证为 Apache2,如今已成为世界上最具扩展性的 MQTT 消息服务器,被广泛应用于物联网、车联网、工业物联网等各类关键业务场景。

EMQX 采用 Erlang/OTP 编写,这是一种用于构建大规模可扩展软实时系统的编程语言。与 Mosquitto 不同,EMQX 在设计之初即采用了分布式集群架构,可以轻松实现弹性水平扩展,从而稳定承载大规模的 MQTT 客户端接入。最新版本 EMQX 5.0 可在 23 个节点的单集群中建立 1 亿个并发的 MQTT 连接。

优点:

  • 支持大规模部署
  • 高可用性
  • 横向可扩展性
  • 高性能和高可靠
  • 丰富的企业功能
  • 率先采用 MQTT over QUIC

缺点:

  • 上手复杂
  • 难以有效管理

社区情况

EMQX 是 GitHub 上评价最高、最活跃的 MQTT Broker 项目,在过去 12 个月里有 11.4K 个 Star 和超过 3000 个 Commit。

Mosquitto 以其轻量级的单线程架构在部署上比 EMQX 更普遍,特别是在资源有限的嵌入式设备上。

注:Mosquitto 项目最初由 Roger Light 在 2008 年创建,后来在 2013 年被 Eclipse 基金会接收。

性能与可扩展性

Mosquitto 作为一个轻量级 MQTT 消息中间件有着比较优秀的单节点性能,单机可以支撑 10w 级别的设备并发连接。但不支持集群架构。

EMQX 作为可集群部署的大规模消息服务器,单节点可以支持百万级并发连接,单集群支持亿级并发连接。但 CPU 和内存使用率更高。

EMQX 是如何支持单集群亿级 MQTT 并发连接的?点击查看详细测试过程 →

协议支持

Mosiquitto 作为 MQTT Broker 提供了完整的 MQTT 3.1/3.1.1/5.0 协议支持,支持协议规范中的遗嘱消息、保留消息、共享订阅等能力,同时也支持 MQTT over WebSocket,可以满足大多数 MQTT 设备接入需求。

EMQX 同样完整支持 MQTT 3.1/3.1.1/5.0 以及 MQTT over Websocket 协议。同时 EMQX 5.0 开创性地引入了下一代互联网协议 HTTP/3 的底层传输协议 QUIC 的支持,以解决复杂网络环境下的通信问题,提升整体吞吐量和移动连接的稳定性。此外,EMQX 也扩展支持 MQTT-SN、CoAP、LwM2M、STOMP 以及其他协议扩展。

安全性

安全性对于物联网设备连接以及设备之间、设备与云服务之间的数据交换至关重要。Mosquitto 和 EMQX 都支持基于 TLS/SSL 的安全连接。此外,EMQX 还支持 QUIC 传输、OCSP Stapling、Audit Logs 和 Black Duck 源代码扫描。

认证与鉴权

在客户端认证权限与访问控制方面,Mosiquitto 提供了动态安全插件,通过灵活的方式处理用户名/密码身份验证和访问控制。Mosiquitto 支持匿名与用户名密码方式认证,并可以通过动态安全插件提供的自定义组群和角色的方式控制消息主题的访问权限。

EMQX 支持多种认证机制,如用户名密码认证、JWT 认证以及基于 MQTT 5.0 协议的增强认证。EMQX 支持与多种数据存储方式集成,包括内置数据库、文件、MySQL、PostgreSQL、MongoDB 和 Redis。

此外,EMQX 为用户提供了黑名单功能,用户可以通过 Dashboard 和 HTTP API 将指定客户端加入黑名单以拒绝该客户端访问,除了客户端标识符以外,还支持直接封禁用户名甚至 IP 地址,方便用户灵活管理客户端的连接与访问。

数据集成

Mosquitto 默认通过 MQTT 客户端消息订阅方式实现外部系统对数据的消费。此外,Mosquitto 提供了多个 Mosquitto 之间的数据桥接能力,可以用于多个 broker 之间的分布式部署与数据打通。

EMQX 在数据集成方面提供了 WebHook 方式将客户端消息和事件推送到外部系统中。EMQX 也同样提供了类似于 Mosquitto 的 MQTT 数据桥接功能,可以连接多个 EMQX 集群或其他标准 MQTT 服务。EMQX 在企业版中重点增强了数据集成能力。EMQX 企业版可以通过规则引擎对接各类主流型数据库、消息队列以及云服务,在数据可靠性与架构设计灵活性上大大增强。

规则引擎

为了用户更加方便地实现高性能数据预处理与基于业务需求的数据路由,EMQX 内置了基于 SQL 的规则引擎组件,搭配数据桥接使用,无需编写代码即可实现一站式的 IoT 数据提取、过滤、转换、存储与处理,以加速应用集成和业务创新。

可操作性与可观测性

Mosquitto 提供了基本的日志和调试功能,用于监控代理状态和故障排除。然而,它缺乏先进的管理和监控功能,使用户难以从其运行状态获得更多洞察进行性能优化。

EMQX 通过 HTTP API 和 Dashboard 提供丰富和可视化的监控功能,使其更容易监控和管理。此外,EMQX 支持与 Prometheus、StatsD 和Datadog 的集成,使运维团队能够轻松使用第三方监控平台。

云原生部署与 K8s 支持

Mosquitto 支持基于 docker 的容器化部署。EMQX 在此基础上提供了基于 Kubernetes Operator 和 Terraform 云原生自动部署能力,更加方便在容器环境下的部署与运维。

EMQX Kubernetes Operator: 点击查看

桥接 Mosquitto 到 EMQX

虽然 EMQX 和 Mosquitto 作为 MQTT Broker 有着很多不同之处,但它们可以通过 MQTT 桥接的方式实现完美结合。

我们可以在物联网边缘的嵌入式硬件或网关上部署 Mosquitto,实现小规模边缘数据接入,然后通过桥接方式与云端的 EMQX 集成,实现大规模的云端数据汇聚接入。

桥接 Mosquitto MQTT 消息至 EMQX

结语

通过以上对比,我们可以看出:Mosquitto 作为单节点的轻量级 MQTT 消息中间件,更加适合部署在工业网关、工控机、小型服务器中,实现中小规模的 MQTT 设备连接场景下快速高效的数据接入与消息路由。而 EMQX 作为支持高可用集群的大规模 MQTT 消息服务器,更适合部署在数据中心、公有云或私有云环境,为较大规模数据接入以及对高可用有需求的用户提供服务。

您可以选择 Mosquitto 用于嵌入式硬件和 IoT 边缘部署,并使用 EMQX 作为云中高度可扩展、高可用的 MQTT 消息服务。

此外,对于有更大规模设备连接与大吞吐数据接入需求,且对数据完整性、数据持久化以及数据集成灵活性有较高要求的用户,我们建议您使用 EMQX 企业版本。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/emqx-vs-mosquitto-2023-mqtt-broker-comparison


http://www.ppmy.cn/news/46918.html

相关文章

Python入门教程+项目实战-9.5节: 程序实战-模式匹配算法

目录 9.5.1 何为模式匹配&#xff1f; 9.5.2 朴素模式匹配算法 9.5.3 系统学习python 9.5.1 何为模式匹配&#xff1f; 模式匹配是数据结构中字符串的一种基本运算: 给定一个子串&#xff0c;要求在主串中找出与该子串相同的所有子串&#xff0c;这就是模式匹配。举个简单的…

1. 大端法和小端法

int32_t num 0x01020304;一个int32_t是4个字节&#xff0c;在内存中的存储是高位字节在低地址&#xff0c;低位字节在高地址。 &#xff08;数字&#xff09;前者的高低是数字位数的高低&#xff0c;左边是高位数&#xff0c;右边是低位数&#xff1b; &#xff08;地址&…

凌恩生物美文分享|好看又实用,多组学联合分析项目大揭秘!

基因层面的功能潜能有没有真的实现表达&#xff0c;表达量是高是低&#xff1f;下游合成的蛋白质行使了什么样得功能&#xff0c;代谢产物通过体循环到达靶器官&#xff0c;又是如何影响靶器官的工作运行的&#xff1f; 一个完整的生物学故事&#xff0c;中心法则贯穿始终&…

PS学习记录-基础操作与快捷键

1、复制图层 在【移动工具】状态下&#xff0c;配合【alt】按键拖动图像&#xff0c;可以进行复制图层 当然&#xff0c;PS里复制图层的方式很多&#xff0c;比如&#xff1a;选中图层&#xff0c;按【ctrlJ】&#xff0c;也是复制图层 2、多选图层 2.1同上&#xff0c;也是…

unity打造基于增量断点更新的下载框架与代码实现

Unity是目前最流行的游戏引擎之一&#xff0c;它可以用来制作各种类型的游戏&#xff0c;例如2D和3D游戏。在游戏开发过程中&#xff0c;我们通常需要使用一些下载框架来帮助我们管理和更新游戏资源。其中&#xff0c;增量断点更新是一种非常重要的技术&#xff0c;它可以大大减…

MathType+MicrosoftWord

MathTypeMicrosoftWord MathType的安装Microsoft Word MathType的安装 链接&#xff1a;https://pan.baidu.com/s/1bEd41GF-yRCRw2tb1XH8og?pwd1234 提取码&#xff1a;1234 语言选择英文&#xff01;&#xff01;&#xff01; 安装好之后&#xff0c;按win键&#xff0c;可…

CentOS7.x安装php7.x或php.8.x

CentOS 7.x默认安装的是PHP 5.x系列版本&#xff0c;想升级可以按照以下步骤&#xff0c;以PHP7.4为例&#xff1a; 移除旧版PHP&#xff1a; yum -y remove php*添加EPEL (Extra Packages for Enterprise Linux)仓库&#xff08;如果已安装&#xff0c;或提示已是最新版本&…

ArcGIS中的土地利用变化分析详解

本篇主要是针对矢量数据的分析。 一、不同时期的土地利用矢量数据&#xff0c;如何分析其图形及属性变化&#xff1f; 土地利用图&#xff08;左图为1993年&#xff0c;右图为2003年&#xff09; 思路如下&#xff1a; 可以先对2个图层进行Union操作&#xff0c;然后在结果中…

电子采购系统的优缺点分析及选型建议

在现今&#xff0c;电子采购系统的出现&#xff0c;为企业采购带来了全新的解决方案。它可以使采购过程更加自动化、高效化&#xff0c;减少采购成本和人力资源的浪费。本文将对电子采购系统的优缺点进行分析&#xff0c;并提供选型建议。 电子采购系统优点&#xff1a; 1、自…

Spring《三》DI 依赖注入

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 上一篇&#xff1a;Spring《二》bean 的实例化与生命周期 下一篇&#xff1a;敬请期待 目录 一、setter 注入&#x1f349;1.注入引用数据类型2.注入简单数据类型 二、构造器注入&#x1f34a;1.注入引用数据类型2.…

Java基础(十七):日期时间API

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

Golang流媒体实战之七:hls拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Golang流媒体实战》系列的第七篇&#xff0c;继续学习一个重要且通用的知识点&#xff1a;hls拉流在《体验开源项目lal》一文中&#xff0…

【大数据基础】基于 TMDB 数据集的电影数据分析

https://dblab.xmu.edu.cn/blog/2400/ 实验内容 环境搭建 pip3 install bottle数据预处理 本次项目使用的数据集来自知名数据网站 Kaggle 的 tmdb-movie-metadata 电影数据集&#xff0c;该数据集包含大约 5000 部电影的相关数据。本次实验使用数据集中有关电影的数据表 tm…

公司新来一00后说我不会自动化测试,3个问题直接给他问趴下...

今天我们公司刚入职一小伙&#xff0c;听说是00后&#xff0c;今天在办公室交流了一下&#xff0c;他问我会不会自动化测试&#xff0c;我直呼好家伙&#xff0c;直接问了他3个开展自动化测试问题....一问3不知.....还有待加强呀 我们在制定自动化测试实施策略时&#xff0c;首…

哪个洗脱一体机好用?好用的洗拖一体机推荐

洗地机是一款使用非常方便的清洁工具&#xff0c;通常可以实现吸、拖、洗三个功能&#xff0c;对于各类家庭污渍都有着不错的处理能力&#xff0c;无论是干燥垃圾还是潮湿垃圾一律可以有效清理。不过很多新手朋友在选购洗地机时会因为看不懂参数而频繁踩雷。本文为大家整理了洗…

【hello Linux】理解文件系统

目录 创建文件的过程&#xff1a; 删除文件的过程&#xff1a; 创建目录的过程&#xff1a; 查看inode编号&#xff1a; 硬链接 软链接 Linux&#x1f337; 我们知道文件所有数据 文件内容 文件属性信息&#xff1b; 未打开的文件是被存放到磁盘/固态硬盘中的&#xff1b; …

Allegro thermal relief热风焊盘

为了画个通孔焊盘&#xff0c;看了很久的 Thermal relief相关的内容&#xff0c;终于基本上理解了。记录一下。 这篇文章讲得非常清楚&#xff1a; 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层&#xff0c;减少一些焊盘和铜皮的连…

Leetcode究极刷题笔记(31~35)

&#xff08;31&#xff09;下一个排列&#xff08;中等&#xff09; 实现思路&#xff1a; 从题目中&#xff0c;我们可以看出本题的意思就是让你选一个比当前序列大的最小的那个解&#xff0c;比如132&#xff0c;哪么比它大的最小解就是213&#xff08;先从第一位开始比&am…

Js实现滚动变色的文字效果

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>滚动变色的文字js特效</title> </head> <body> <div style"width:736px;"> 请注意下方的文…

环境变量详解

目录 环境变量是什么&#xff1f; 常见环境变量 查看环境变量 指令查看 代码查看 系统调用查看 本地变量 环境变量全局性 环境变量是什么&#xff1f; 我们要执行一个我们所写的c/c程序时&#xff0c;需要./可执行文件&#xff0c;告诉操作系统你在哪里&#xff0c…