MQTT開源軟件之EMQ入門篇
時間:2018-09-29 來源:未知
EMQ 2.0 消息服務器簡介
EMQ (Erlang/Enterprise/Elastic MQTT Broker)是基于Erlang/OTP平臺開發的開源物聯網MQTT消息服務器。Erlang/OTP是出色的軟實時(Soft-Realtime)、低延時(Low-Latency)、分布式(Distributed)的語言平臺。MQTT是輕量的(Lightweight)、發布訂閱模式(PubSub)的物聯網消息協議。
EMQ 項目設計目標是承載移動終端或物聯網終端海量的MQTT連接,并實現在海量物聯網設備間快速低延時(Low-Latency)消息路由:
1. 穩定承載大規模的MQTT客戶端連接,單服務器節點支持50萬到100萬連接。
2. 分布式節點集群,快速低延時的消息路由,單集群支持1000萬規模的路由。
3. 消息服務器內擴展,支持定制多種認證方式、高效存儲消息到后端數據庫。
4. 完整物聯網協議支持,MQTT、MQTT-SN、CoAP、WebSocket或私有協議支持。
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
EMQ 2.0消息服務器每個版本,會發布Ubuntu、CentOS、FreeBSD、Mac OS X、Windows平臺程序包與Docker鏡像。
下載地址: //emqtt.com/downloads
程序包下載后,可直接解壓啟動運行,例如Mac平臺:
unzip emqttd-macosx-v2.0.zip && cd emqttd
# 啟動emqttd
./bin/emqttd start
# 檢查運行狀態
./bin/emqttd_ctl status
# 停止emqttd
./bin/emqttd stop
EMQ 消息服務默認允許匿名認證,啟動后MQTT客戶端可連接1883端口,啟動運行日志輸出在log/目錄。
源碼編譯EMQ 2.0
git clone //github.com/emqtt/emq-relx.git
cd emq-relx && make
cd _rel/emqttd && ./bin/emqttd console
Web管理控制臺(Dashboard)
EMQ 消息服務器啟動后,會默認加載Dashboard插件,啟動Web管理控制臺。用戶可通過Web控制臺,查看服務器運行狀態、統計數據、客戶端(Client)、會話(Session)、主題(Topic)、訂閱(Subscription)、插件(Plugin)。
控制臺地址: //127.0.0.1:18083,默認用戶: admin,密碼:public
EMQ 2.0消息服務器功能列表
• 完整的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、MongoDB、HTTP認證集成
• 瀏覽器Cookie認證
• 基于客戶端ID、IP地址、用戶名的訪問控制(ACL)
• 多服務器節點集群(Cluster)
• 多服務器節點橋接(Bridge)
• mosquitto橋接支持
• Stomp協議支持
• MQTT-SN協議支持
• CoAP協議支持
• Stomp/SockJS支持
• 通過Paho兼容性測試
• 2.0新功能: 本地訂閱($local/topic)
• 2.0新功能: 共享訂閱($share/<group>/topic)
• 2.0新功能: sysctl類似k = v格式配置文件
EMQ 2.0擴展插件列表
EMQ 2.0支持豐富的擴展插件,包括控制臺、擴展模塊、多種認證方式、多種接入協議等:
擴展插件通過'bin/emqttd_ctl'管理命令行,或Dashboard控制臺加載啟用。例如啟用PostgreSQL認證插件::
./bin/emqttd_ctl plugins load emq_auth_pgsql
100萬線連接測試說明
*EMQ* 2.0消息服務器默認設置,允許大客戶端連接是512,因為大部分操作系統'ulimit -n'限制為1024。
EMQ 消息服務器1.1.3版本,連接壓力測試到130萬線,8核心/32G內存的CentOS云服務器。
操作系統內核參數、TCP協議棧參數、Erlang虛擬機參數、EMQ大允許連接數設置簡述如下:
Linux操作系統參數
2M - 系統所有進程可打開的文件數量
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
1M - 系統允許當前進程打開的文件數量
ulimit -n 1048576
TCP協議棧參數
backlog - Socket監聽隊列長度::
sysctl -w net.core.somaxconn=65536
Erlang虛擬機參數
## Erlang Process Limit
node.process_limit = 2097152
## Sets the maximum number of simultaneously existing ports for this system
node.max_ports = 1048576
EMQ 大允許連接數
emqttd/etc/emq.conf 'listeners'段落
## Size of acceptor pool
listener.tcp.acceptors = 64
## Maximum number of concurrent clients
listener.tcp.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消息服務器前,可以按自己的應用場景進行測試,而不是簡單的連接壓力測試:
1. Android消息推送: 推送消息廣播測試。
2. 移動即時消息應用: 消息收發確認測試。
3. 智能硬件應用: 消息的往返時延測試。
4. 物聯網數據采集: 并發連接與吞吐測試。
開源MQTT客戶端項目
GitHub: //github.com/emqtt
Eclipse Paho: //www.eclipse.org/paho/
MQTT.org: //github.com/mqtt/mqtt.github.io/wiki/libraries

