1. EMQX简介与核心概念
MQTT协议作为物联网领域的"普通话",已经成为设备互联的事实标准。而EMQX则是目前最流行的开源MQTT消息中间件之一,就像物联网世界的"交通枢纽"。我最早接触EMQX是在2018年一个智能家居项目中,当时为了处理数万设备的并发连接,尝试了多种方案后最终选择了它。
EMQX的核心优势在于其分布式架构和百万级连接处理能力。最新版本(5.x)相比早期版本在性能上有质的飞跃——在我的压力测试中,单节点轻松支撑10万+的MQTT连接。对于开发者而言,它提供了开箱即用的管理控制台,让消息流转和设备管理变得可视化。
这里有个生活化的类比:想象EMQX就像快递公司的分拣中心。设备(客户端)把包裹(消息)送到分拣中心(EMQX服务器),由服务器根据地址(Topic主题)准确投递给收件人(订阅者)。而MQTT协议就是快递员之间的暗号,保证包裹高效无误地传递。
2. 环境准备与安装
2.1 硬件与系统要求
在实际部署中,资源配置需要根据业务规模灵活调整。对于开发测试环境,我通常这样配置:
- 云服务器:2核4G配置(阿里云ECS t6系列就够用)
- 操作系统:Ubuntu 20.04 LTS(长期支持版更稳定)
- 磁盘空间:至少50GB(消息持久化需要额外空间)
注意:生产环境建议使用物理机或高性能云主机,避免虚拟化带来的性能损耗
2.2 安装方式对比
EMQX提供多种安装方式,这里我推荐两种最常用的:
- 二进制包安装(适合快速体验)
wget https://www.emqx.com/zh/downloads/broker/5.0.20/emqx-5.0.20-ubuntu20.04-amd64.tar.gz tar -zxvf emqx-5.0.20-ubuntu20.04-amd64.tar.gz cd emqx/bin ./emqx start- Docker安装(适合容器化部署)
docker run -d --name emqx \ -p 1883:1883 -p 8083:8083 \ -p 8084:8084 -p 8883:8883 \ -p 18083:18083 \ emqx/emqx:5.0.20我在AWS上实测发现,Docker方式会损失约15%的性能,但部署灵活性更高。如果追求极致性能,建议直接使用二进制安装。
3. 基础配置与安全加固
3.1 必须做的安全设置
第一次启动后,立即访问http://服务器IP:18083会看到登录界面。使用默认账号admin/public登录后,第一件事就是修改密码!我见过太多因为没改密码导致的安全事故。
通过CLI修改密码的方法(适合批量部署):
./emqx_ctl admins passwd admin 你的新密码3.2 网络端口配置
EMQX默认开放的端口需要特别注意:
- 1883:MQTT协议标准端口
- 8883:MQTT over SSL
- 8083:WebSocket连接
- 8084:WSS(WebSocket Secure)
生产环境中,我强烈建议:
- 关闭不必要的端口(如8083)
- 为8883端口配置有效的SSL证书
- 使用防火墙限制访问源IP
配置SSL的示例(需要提前准备证书):
listeners.ssl.default { bind = "0.0.0.0:8883" max_connections = 102400 ssl_options { keyfile = "/etc/emqx/certs/key.pem" certfile = "/etc/emqx/certs/cert.pem" cacertfile = "/etc/emqx/certs/cacert.pem" } }4. 高可用集群搭建
4.1 集群架构设计
EMQX集群采用去中心化架构,各节点平等。在我的生产实践中,通常采用3节点或5节点部署。下图展示了一个典型的三节点部署方案:
[客户端] | [负载均衡器] | [EMQX Node1] ↔ [EMQX Node2] ↔ [EMQX Node3] | | | [Redis集群] [MySQL集群] [监控系统]4.2 具体搭建步骤
假设有三台服务器:192.168.1.10、192.168.1.11、192.168.1.12
- 首先确保各节点时间同步(NTP服务)
- 修改每台服务器的/etc/hosts文件,添加主机名解析
- 在第一台节点执行:
./emqx start ./emqx_ctl cluster join emqx@192.168.1.11- 验证集群状态:
./emqx_ctl cluster status踩坑提醒:我曾遇到集群节点无法发现的问题,后来发现是防火墙没放行4370端口。建议提前检查端口连通性。
5. 性能调优实战
5.1 关键参数调整
在/etc/emqx/emqx.conf中,这几个参数直接影响性能:
# 最大连接数(根据内存调整) zone.external.max_connections = 1000000 # 消息吞吐量优化 listener.tcp.external.rate_limit = 1000,10000 # 会话超时设置 zone.external.session_expiry_interval = 2h5.2 监控与告警
EMQX内置了Prometheus监控接口,地址为http://IP:18083/api/v5/prometheus/stats。我通常配合Grafana使用这个看板配置:
dashboard { ## Prometheus Dashboard URL prometheus = "http://localhost:3000/d/emqx/emqx-prometheus-dashboard?orgId=1" ## AlertManager URL alertmanager = "http://localhost:9093" }常见性能瓶颈排查经验:
- 连接数上不去 → 检查ulimit和TCP参数
- 消息延迟高 → 检查网络带宽和磁盘IO
- CPU跑满 → 检查是否有异常主题订阅
6. 客户端开发实践
6.1 Python连接示例
使用paho-mqtt库的完整示例:
import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("test/topic") def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("your_server_ip", 1883, 60) client.loop_forever()6.2 生产环境注意事项
- 必须实现断线重连:物联网设备网络环境复杂
- 合理设置QoS级别:
- QoS0:可能丢失(适合传感器数据)
- QoS1:至少一次(适合控制指令)
- QoS2:精确一次(适合支付场景)
- 客户端ID规范:建议使用"设备类型+MAC地址"的格式
7. 常见问题解决方案
问题1:Dashboard无法访问
- 检查防火墙规则
- 确认EMQX是否正常运行(./emqx_ctl status)
- 查看日志(/var/log/emqx/emqx.log.1)
问题2:客户端连接频繁断开
# 调整keepalive参数 listener.tcp.external.keepalive = 3600s问题3:高并发下消息丢失
# 优化消息队列设置 zone.external.max_mqueue_len = 10000 zone.external.mqueue_priorities = "none"记得第一次上线时遇到消息堆积问题,后来发现是默认队列长度太小。调整后稳定运行至今。EMQX的灵活性就在于这些参数都可以根据业务特点精细调整。