當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > MQTT開源軟件之EMQ入門篇
EMQ 2.0 消息服務(wù)器簡介
EMQ (Erlang/Enterprise/Elastic MQTT Broker)是基于Erlang/OTP平臺(tái)開發(fā)的開源物聯(lián)網(wǎng)MQTT消息服務(wù)器。Erlang/OTP是出色的軟實(shí)時(shí)(Soft-Realtime)、低延時(shí)(Low-Latency)、分布式(Distributed)的語言平臺(tái)。MQTT是輕量的(Lightweight)、發(fā)布訂閱模式(PubSub)的物聯(lián)網(wǎng)消息協(xié)議。
EMQ 項(xiàng)目設(shè)計(jì)目標(biāo)是承載移動(dòng)終端或物聯(lián)網(wǎng)終端海量的MQTT連接,并實(shí)現(xiàn)在海量物聯(lián)網(wǎng)設(shè)備間快速低延時(shí)(Low-Latency)消息路由:
1. 穩(wěn)定承載大規(guī)模的MQTT客戶端連接,單服務(wù)器節(jié)點(diǎn)支持50萬到100萬連接。
2. 分布式節(jié)點(diǎn)集群,快速低延時(shí)的消息路由,單集群支持1000萬規(guī)模的路由。
3. 消息服務(wù)器內(nèi)擴(kuò)展,支持定制多種認(rèn)證方式、高效存儲(chǔ)消息到后端數(shù)據(jù)庫。
4. 完整物聯(lián)網(wǎng)協(xié)議支持,MQTT、MQTT-SN、CoAP、WebSocket或私有協(xié)議支持。
MQTT發(fā)布訂閱模式簡述
MQTT是發(fā)布訂閱(Publish/Subscribe)模式的消息協(xié)議,與HTTP協(xié)議請求響應(yīng)(Request/Response)模式不同。
MQTT發(fā)布者與訂閱者之間通過"主題"(Topic)進(jìn)行消息路由,主題(Topic)格式類似Unix文件路徑,例如
sensor/1/temperature
chat/room/subject
presence/user/feng
sensor/1/#
sensor/+/temperature
uber/drivers/joe/inbox
MQTT主題(Topic)支持'+', '#'的通配符,'+'通配一個(gè)層級,'#'通配多個(gè)層級(必須在末尾)。
MQTT消息發(fā)布者(Publisher)只能向特定'名稱主題'(不支持通配符)發(fā)布消息,訂閱者(Subscriber)通過訂閱'過濾主題'(支持通配符)來匹配消息。
初接觸MQTT協(xié)議的用戶,通常會(huì)向通配符的'過濾主題'發(fā)布廣播消息,MQTT協(xié)議不支持這種模式,需從訂閱側(cè)設(shè)計(jì)廣播主題(Topic)。
例如Android推送,向所有廣州用戶,推送某類本地消息,客戶端獲得GIS位置后,可訂閱'news/city/guangzhou'主題。
五分鐘下載啟動(dòng)EMQ
EMQ 2.0消息服務(wù)器每個(gè)版本,會(huì)發(fā)布Ubuntu、CentOS、FreeBSD、Mac OS X、Windows平臺(tái)程序包與Docker鏡像。
下載地址: //emqtt.com/downloads
程序包下載后,可直接解壓啟動(dòng)運(yùn)行,例如Mac平臺(tái):
unzip emqttd-macosx-v2.0.zip && cd emqttd
# 啟動(dòng)emqttd
./bin/emqttd start
# 檢查運(yùn)行狀態(tài)
./bin/emqttd_ctl status
# 停止emqttd
./bin/emqttd stop
EMQ 消息服務(wù)默認(rèn)允許匿名認(rèn)證,啟動(dòng)后MQTT客戶端可連接1883端口,啟動(dòng)運(yùn)行日志輸出在log/目錄。
源碼編譯EMQ 2.0
git clone https://github.com/emqtt/emq-relx.git
cd emq-relx && make
cd _rel/emqttd && ./bin/emqttd console
Web管理控制臺(tái)(Dashboard)
EMQ 消息服務(wù)器啟動(dòng)后,會(huì)默認(rèn)加載Dashboard插件,啟動(dòng)Web管理控制臺(tái)。用戶可通過Web控制臺(tái),查看服務(wù)器運(yùn)行狀態(tài)、統(tǒng)計(jì)數(shù)據(jù)、客戶端(Client)、會(huì)話(Session)、主題(Topic)、訂閱(Subscription)、插件(Plugin)。
控制臺(tái)地址: //127.0.0.1:18083,默認(rèn)用戶: admin,密碼:public
EMQ 2.0消息服務(wù)器功能列表
• 完整的MQTT V3.1/V3.1.1協(xié)議規(guī)范支持
• QoS0, QoS1, QoS2消息支持
• 持久會(huì)話與離線消息支持
• Retained消息支持
• Last Will消息支持
• TCP/SSL連接支持
• MQTT/WebSocket(SSL)支持
• HTTP消息發(fā)布接口支持
• $SYS/#系統(tǒng)主題支持
• 客戶端在線狀態(tài)查詢與訂閱支持
• 客戶端ID或IP地址認(rèn)證支持
• 用戶名密碼認(rèn)證支持
• LDAP認(rèn)證
• Redis、MySQL、PostgreSQL、MongoDB、HTTP認(rèn)證集成
• 瀏覽器Cookie認(rèn)證
• 基于客戶端ID、IP地址、用戶名的訪問控制(ACL)
• 多服務(wù)器節(jié)點(diǎn)集群(Cluster)
• 多服務(wù)器節(jié)點(diǎn)橋接(Bridge)
• mosquitto橋接支持
• Stomp協(xié)議支持
• MQTT-SN協(xié)議支持
• CoAP協(xié)議支持
• Stomp/SockJS支持
• 通過Paho兼容性測試
• 2.0新功能: 本地訂閱($local/topic)
• 2.0新功能: 共享訂閱($share/<group>/topic)
• 2.0新功能: sysctl類似k = v格式配置文件
EMQ 2.0擴(kuò)展插件列表
EMQ 2.0支持豐富的擴(kuò)展插件,包括控制臺(tái)、擴(kuò)展模塊、多種認(rèn)證方式、多種接入?yún)f(xié)議等:
擴(kuò)展插件通過'bin/emqttd_ctl'管理命令行,或Dashboard控制臺(tái)加載啟用。例如啟用PostgreSQL認(rèn)證插件::
./bin/emqttd_ctl plugins load emq_auth_pgsql
100萬線連接測試說明
*EMQ* 2.0消息服務(wù)器默認(rèn)設(shè)置,允許大客戶端連接是512,因?yàn)榇蟛糠植僮飨到y(tǒng)'ulimit -n'限制為1024。
EMQ 消息服務(wù)器1.1.3版本,連接壓力測試到130萬線,8核心/32G內(nèi)存的CentOS云服務(wù)器。
操作系統(tǒng)內(nèi)核參數(shù)、TCP協(xié)議棧參數(shù)、Erlang虛擬機(jī)參數(shù)、EMQ大允許連接數(shù)設(shè)置簡述如下:
Linux操作系統(tǒng)參數(shù)
2M - 系統(tǒng)所有進(jìn)程可打開的文件數(shù)量
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
1M - 系統(tǒng)允許當(dāng)前進(jìn)程打開的文件數(shù)量
ulimit -n 1048576
TCP協(xié)議棧參數(shù)
backlog - Socket監(jiān)聽隊(duì)列長度::
sysctl -w net.core.somaxconn=65536
Erlang虛擬機(jī)參數(shù)
## Erlang Process Limit
node.process_limit = 2097152
## Sets the maximum number of simultaneously existing ports for this system
node.max_ports = 1048576
EMQ 大允許連接數(shù)
emqttd/etc/emq.conf 'listeners'段落
## Size of acceptor pool
listener.tcp.acceptors = 64
## Maximum number of concurrent clients
listener.tcp.max_clients = 1000000
測試客戶端設(shè)置
測試客戶端在一個(gè)接口上,多只能創(chuàng)建65000連接
sysctl -w net.ipv4.ip_local_port_range="500 65535"
echo 1000000 > /proc/sys/fs/nr_open
按應(yīng)用場景測試
MQTT是一個(gè)設(shè)計(jì)得非常出色的傳輸層協(xié)議,在移動(dòng)消息、物聯(lián)網(wǎng)、車聯(lián)網(wǎng)、智能硬件甚至能源勘探等領(lǐng)域有著廣泛的應(yīng)用。1個(gè)字節(jié)報(bào)頭、2個(gè)字節(jié)心跳、消息QoS支持等設(shè)計(jì),非常適合在低帶寬、不可靠網(wǎng)絡(luò)、嵌入式設(shè)備上應(yīng)用。
不同的應(yīng)用有不同的系統(tǒng)要求,用戶使用emqttd消息服務(wù)器前,可以按自己的應(yīng)用場景進(jìn)行測試,而不是簡單的連接壓力測試:
1. Android消息推送: 推送消息廣播測試。
2. 移動(dòng)即時(shí)消息應(yīng)用: 消息收發(fā)確認(rèn)測試。
3. 智能硬件應(yīng)用: 消息的往返時(shí)延測試。
4. 物聯(lián)網(wǎng)數(shù)據(jù)采集: 并發(fā)連接與吞吐測試。
開源MQTT客戶端項(xiàng)目
GitHub: https://github.com/emqtt
Eclipse Paho: https://www.eclipse.org/paho/
MQTT.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries