开始使用(GetStarted)

    emqttd设计目标是承载移动终端或物联网终端大量的MQTT连接,并实现在大量终端间快速低延时(Low-Latency)消息路由:

    1. 稳定承载大规模的MQTT客户端连接,单服务器节点支持50万到100万连接。

    2. 分布式节点集群,快速低延时的消息路由,单集群支持1000万规模的路由。

    3. 消息服务器内扩展,支持定制多种认证方式、高效存储消息到后端数据库。

    4. 完整支持MQTT V3.1.1协议,扩展支持WebSocket、CoAP或私有TCP等多协议。

    MQTT发布订阅模式简述

    MQTT是发布订阅(Publish/Subscribe)模式的消息协议,与HTTP协议请求响应(Request/Response)模式不同。

    MQTT发布者与订阅者之间通过”主题”(Topic)进行消息路由,主题(Topic)格式类似Unix文件路径,例如:

    MQTT主题(Topic)支持’+’, ‘#’的通配符,’+’通配一个层级,’#’通配多个层级(必须在末尾)。

    MQTT消息发布者(Publisher)只能向特定’名称主题’(不支持通配符)发布消息,订阅者(Subscriber)通过订阅’过滤主题’(支持通配符)来匹配消息。

    Note

    初接触MQTT协议的用户,通常会向通配符的’过滤主题’发布广播消息,MQTT协议不支持这种模式,需从订阅侧设计广播主题(Topic)。 例如Android推送,向所有广州用户,推送某类本地消息,客户端获得GIS位置后,可订阅’news/city/guangzhou’主题。

    五分钟下载启动emqttd

    emqttd消息服务器每个版本,会发布Ubuntu、CentOS、FreeBSD、Mac OS X、Windows平台的程序包。

    下载地址:

    程序包下载后,可直接解压启动运行,例如Mac平台:

    1. # 启动emqttd
    2. ./bin/emqttd start
    3. # 检查运行状态
    4. ./bin/emqttd_ctl status
    5. # 停止emqttd
    6. ./bin/emqttd stop

    emqttd消息服务默认采用匿名认证,启动后MQTT客户端可连接1883端口,启动运行日志输出在log/目录。

    1. git clone https://github.com/emqtt/emqttd.git
    2. cd emqttd && make && make dist

    Web管理控制台(Dashboard)

    emqttd消息服务器启动后,会默认加载Dashboard插件,启动Web管理控制台。用户可通过Web控制台, 查看服务器运行状态、统计数据、客户端(Client)、会话(Session)、主题(Topic)、订阅(Subscription)。

    控制台地址: http://127.0.0.1:18083,默认用户: admin,密码:public

    emqttd消息服务器功能列表

    • 完整的MQTT V3.1/V3.1.1协议规范支持

    • QoS0, QoS1, QoS2消息支持

    • 持久会话与离线消息支持

    • Retained消息支持

    • Last Will消息支持

    • TCP/SSL连接支持

    • MQTT/WebSocket(SSL)支持

    • HTTP消息发布接口支持

    • $SYS/#系统主题支持

    • 客户端在线状态查询与订阅支持

    • 客户端ID或IP地址认证支持

    • 用户名密码认证支持

    • LDAP认证

    • Redis、MySQL、PostgreSQL、HTTP认证集成

    • 浏览器Cookie认证

    • 多服务器节点集群(Cluster)

    • 多服务器节点桥接(Bridge)

    • mosquitto桥接支持

    • Stomp协议支持

    • Stomp/SockJS支持

    • 通过Paho兼容性测试

    扩展模块通过’etc/emqttd.config’配置文件的auth, modules段落启用。

    例如启用用户名密码认证:

    1. {access, [
    2. %% Authetication. Anonymous Default
    3. {auth, [
    4. %% Authentication with username, password
    5. ...

    启用客户端状态发布模块:

    扩展插件(Plugin)

    扩展插件通过’bin/emqttd_ctl’管理命令行,加载启动运行。

    例如启用PostgreSQL认证插件:

    1. ./bin/emqttd_ctl plugins load emqttd_plugin_pgsql

    100万线连接测试说明

    Note

    emqttd消息服务器默认设置,允许最大客户端连接是512,因为大部分操作系统’ulimit -n’限制为1024。

    emqttd消息服务器当前版本,连接压力测试到130万线,8核心/32G内存的CentOS云服务器。

    操作系统内核参数、TCP协议栈参数、Erlang虚拟机参数、emqttd最大允许连接数设置简述如下:

    # 2M - 系统所有进程可打开的文件数量:

    1. sysctl -w fs.file-max=2097152

    # 1M - 系统允许当前进程打开的文件数量:

    1. ulimit -n 1048576

    TCP协议栈参数

    # backlog - Socket监听队列长度:

    emqttd/etc/vm.args:

    1. ## max process numbers
    2. +P 2097152
    3. ## Sets the maximum number of simultaneously existing ports for this system
    4. +Q 1048576
    5. ## Increase number of concurrent ports/sockets
    6. -env ERL_MAX_PORTS 1048576
    7. -env ERTS_MAX_PORTS 1048576

    emqttd最大允许连接数

    emqttd/etc/emqttd.config:

    1. %% Size of acceptor pool
    2. {acceptors, 64},
    3. %% Maximum number of concurrent clients
    4. {max_clients, 1000000},
    5. %% Socket Access Control
    6. {access, [{allow, all}]},
    7. %% Connection Options
    8. {connopts, [
    9. %% Rate Limit. Format is 'burst, rate', Unit is KB/Sec
    10. %% {rate_limit, "100,10"} %% 100K burst, 10K rate
    11. ]},
    12. ...

    测试客户端在一个接口上,最多只能创建65000连接:

    1. sysctl -w net.ipv4.ip_local_port_range="500 65535"

    按应用场景测试

    MQTT是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息QoS支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。

    不同的应用有不同的系统要求,用户使用emqttd消息服务器前,可以按自己的应用场景进行测试,而不是简单的连接压力测试:

    1. Android消息推送: 推送消息广播测试。

    2. 移动即时消息应用: 消息收发确认测试。

    3. 智能硬件应用: 消息的往返时延测试。

    emqtt开源MQTT客户端项目

    GitHub: