EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。Erlang/OTP 是出色的软实时(Soft-Realtime)、低延时(Low-Latency)、分布式(Distributed) 的语言平台。MQTT 是轻量的(Lightweight)、发布订阅模式(PubSub) 的物联网消息协议。
EMQ X 项目设计目标是承载移动终端或物联网终端海量 MQTT 连接,并实现在海量物联网设备间快速低延时消息路由:
MQTT 是发布订阅(Publish/Subscribe) 模式的消息协议,与 HTTP 协议请求响应(Request/Response) 模式不同。
MQTT 发布者与订阅者之间通过”主题”(Topic) 进行消息路由,主题(Topic) 格式类似 Unix 文件路径,例如:
sensor/1/temperature chat/room/subject presence/user/feng sensor/1/# sensor/+/temperature uber/drivers/joe/inbox
MQTT 主题(Topic) 支持’+’, ‘#’的通配符,’+’通配一个层级,’#’通配多个层级(必须在末尾)。
MQTT 消息发布者(Publisher) 只能向特定’名称主题’(不支持通配符)发布消息,订阅者(Subscriber)通过订阅’过滤主题’(支持通配符)来匹配消息。
注解
初接触MQTT协议的用户,通常会向通配符的’过滤主题’发布广播消息,MQTT 协议不支持这种模式,需从订阅侧设计广播主题(Topic)。 例如 Android 推送,向所有广州用户,推送某类本地消息,客户端获得 GIS 位置后,可订阅 ‘news/city/guangzhou’ 主题。
EMQ X R3.0 消息服务器每个版本,会发布 Ubuntu、CentOS、FreeBSD、Mac OS X、Windows 平台程序包与 Docker 镜像。
下载地址: http://emqtt.com/downloads
程序包下载后,可直接解压启动运行,例如 Mac 平台:
unzip emqx-macosx-v3.0.zip && cd emqx # 启动emqx ./bin/emqx start # 检查运行状态 ./bin/emqx_ctl status # 停止emqx ./bin/emqx stop
EMQ X 消息服务默认允许匿名认证,启动后 MQTT 客户端可连接1883端口,启动运行日志输出在 log/ 目录。
git clone https://github.com/emqx/emqx-rel.git cd emqx-rel && make cd _rel/emqx && ./bin/emqx console
EMQ X 消息服务器启动后,会默认加载 Dashboard 插件,启动 Web 管理控制台。用户可通过 Web 控制台,查看服务器运行状态、统计数据、客户端(Client)、会话(Session)、主题(Topic)、订阅(Subscription)、插件(Plugin)。
控制台地址: http://127.0.0.1:18083,默认用户: admin,密码:public
EMQ X R3.0 支持丰富的扩展插件,包括控制台、扩展模块、多种认证方式、多种接入协议等:
emqx_plugin_template | 插件模版与演示代码 |
emqx_retainer | Retain 消息存储插件 |
emqx_dashboard | Web 管理控制台,默认加载 |
emqx_auth_clientid | ClientId、密码认证插件 |
emqx_auth_username | 用户名、密码认证插件 |
emqx_auth_ldap | LDAP 认证插件 |
emqx_auth_http | HTTP 认证插件 |
emqx_auth_mysql | MySQL 认证插件 |
emqx_auth_pgsql | PostgreSQL 认证插件 |
emqx_auth_redis | Redis 认证插件 |
emqx_auth_mongo | MongoDB 认证插件 |
emqx_sn | MQTT-SN 协议插件 |
emqx_coap | CoAP 协议插件 |
emqx_stomp | Stomp 协议插件 |
emqx_recon | Recon 优化调测插件 |
emqx_reloader | 热升级插件(开发调试) |
emqx_delayed_publish | 延时发布消息 |
扩展插件通过 ‘bin/emqx_ctl’ 管理命令行,或 Dashboard 控制台加载启用。例如启用 PostgreSQL 认证插件:
./bin/emqx_ctl plugins load emqx_auth_pgsql
注解
EMQ X R3.0 消息服务器默认设置,允许最大客户端连接是512,因为大部分操作系统 ‘ulimit -n’ 限制为1024。
EMQ X R3.0 消息服务器1.1.3版本,连接压力测试到130万线,8核心/32G内存的 CentOS 云服务器。
操作系统内核参数、TCP 协议栈参数、Erlang 虚拟机参数、EMQ 最大允许连接数设置简述如下:
# 2M - 系统所有进程可打开的文件数量:
sysctl -w fs.file-max=2097152 sysctl -w fs.nr_open=2097152
# 1M - 系统允许当前进程打开的文件数量:
ulimit -n 1048576
# backlog - Socket 监听队列长度:
sysctl -w net.core.somaxconn=65536
emqttd/etc/emq.conf:
## Erlang Process Limit node.process_limit = 2097152 ## Sets the maximum number of simultaneously existing ports for this system node.max_ports = 1048576
emqx/etc/emqx.conf ‘listeners’段落:
## Size of acceptor pool listener.tcp.external.acceptors = 64 ## Maximum number of concurrent clients listener.tcp.external.max_clients = 1000000
测试客户端在一个接口上,最多只能创建65000连接:
sysctl -w net.ipv4.ip_local_port_range="500 65535" echo 1000000 > /proc/sys/fs/nr_open
MQTT 是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息 QoS 支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。
不同的应用有不同的系统要求,用户使用emqttd消息服务器前,可以按自己的应用场景进行测试,而不是简单的连接压力测试:
GitHub: https://github.com/emqtt
emqttc | Erlang MQTT客户端库 |
emqtt_benchmark | MQTT连接测试工具 |
CocoaMQTT | Swift语言MQTT客户端库 |
QMQTT | QT框架MQTT客户端库 |
Eclipse Paho: https://www.eclipse.org/paho/
MQTT.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries
原文地址