EMQ ---問題集


1)emqttd 使用 SSL遇到的問題:服務器直接布了一份emqttd

,然后什么都沒管,端口默認的ws 8083,wss8084,mqtt 1883,mqtt(ssl) 8883。

結果跑起來之后點了點發現出了問題,前端的websocket根本連不上,Chrome報錯

WebSocket connection to 'wss://10.0.0.111:8084/mqtt' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE

mqtt配置文件中描述如下:

但是發現即使按照這個路徑配置好了還是不行,google上有解答方案:

問題原因在於證書只對域名有效,而不是IP。改成域名一測,立馬成功 

還有一個小提示,在windows環境下安裝的emqttd,他的config文件不要用記事本打開,如果用記事本打開進行修改的話,運行emqttd console會報錯,但是用寫字板打開沒問題,感覺是編碼的原因

 

一個客戶端sub很多主題和數據,出現宕機?使用本地共享訂閱解決!

EMQ中CPU是公平分配給MQTT會話,大量pub消息到一個訂閱,訂閱不會拿到更多cpu,最終導致消息累積,內存溢出宕機。

最好的解決辦法是分組訂閱,把消息打散,多個客戶端訂閱。

問:請問一下,我現在的業務就是只使用一個sub,主題是\hello\#,去訂閱數萬個終端消息。請問針對這個問題,如何來優化業務邏輯?可以通過增加sub的方式嗎?即把數萬終端分成幾個小組,每小組往一個主題pub,然后再分別訂閱?

答:不需要自己實現,使用emq 2.x的本地+共享訂閱相結合即可。使用主題:$local/$share/group/topic

http://emqtt.com/docs/v2/advanced.html#local-subscription

高級特性 (Advanced Features)

EMQ 2.0 版本新增了本地訂閱與共享訂閱功能。

簡介
使用本地訂閱后,指消息只在訂閱者的本地(所連接的)EMQ節點,不會流傳到集群中的其它EMQ節點中。在共享訂閱中,訂閱同一個主題的客戶端會輪流的收到這個主題下的消息,也就是說同一個消息不會發送到多個訂閱者,從而實現訂閱端的多個節點之間的負載均衡。共享訂閱對於數據采集/集中處理類應用非常有用。在這樣的場景下,數據的生產者遠多余數據的消費者,且同一條數據只需要被任意消費者處理一次。

本地訂閱 (Local Subscription)

本地訂閱(Local Subscription) 只在本節點創建訂閱與路由表,不會在集群節點間廣播全局路由,非常適合物聯網數據采集應用:

mosquitto_sub -t '$local/topic'

mosquitto_pub -t 'topic' 

使用方式: 訂閱者在主題(Topic)前增加 ‘$local/’ 前綴。

共享訂閱 (Shared Subscription)

共享訂閱(Shared Subscription)支持在多訂閱者間采用分組負載平衡方式派發消息:

                            ---------
                            | | --Msg1--> Subscriber1 Publisher--Msg1,Msg2,Msg3-->| EMQ | --Msg2--> Subscriber2 | | --Msg3--> Subscriber3 --------- 

共享訂閱支持兩種使用方式:

訂閱前綴 使用示例
$queue/ mosquitto_sub -t ‘$queue/topic’
$share/<group>/ mosquitto_sub -t ‘$share/group/topic’

其中$queue與$share的區別,在於$share后面可以加不同的分組(group),比如$share/group1/topic,$share/group2/topic,$share/group3/topic,生產者發一個topic的消息,訂閱$share/group1/topic的消費者、$share/group2/topic的消費者、$share/group3/topic的消費者都能收到消息,如果一個分組中存在多個消費者,則多個消費者還會共享訂閱消息,每個group的消息隨機其中一個消費者能獲得。

emq2.x版本,共享訂閱只支持單節點,不支持集群。

使用場景
當生產者和消費者的消息只想通過一個EMQ節點,可使用EMQ的本地訂閱。
當消費者的消息想通過EMQ實現訂閱端的多個消費者之間的負載均衡,則可使用EMQ的共享訂閱。
特殊情況下,當多個生產者生產多條消息的時候,一個消費者壓力會很大,分擔一個消費者的壓力,或者其它情況,需要用到本地共享訂閱。本地共享訂閱是本地訂閱與共享訂閱的組合。

下圖為本地共享訂閱的消息走向和訂閱關系。每個消費者都必須本地共享訂閱每一個EMQ節點,這樣每條消息只會走向一個消費者。注意:這里的SUB指消費者,PUB指生產者。

 

消息流向
每個PUB的消息從經過LB(負載均衡),發送到不同的EMQ節點中,比如第一個EMQ節點收到的M1、M3、M4的消息:

通過本地訂閱,這個EMQ節點的消息把收到的M1、M3、M4的消息不發給其它集群的EMQ節點,只從這個EMQ節點發送給訂閱的SUB。
通過共享訂閱,這個EMQ的消息把收到的M1、M3、M4的消息發送給不同的SUB端。
通過上述本地訂閱+共享訂閱,實現多個PUB發送的每條消息隨機到達一個並且只有一個SUB。
訂閱關系
每個SUB使用本地共享訂閱($local/$share/A)來訂閱EMQ集群中的每個EMQ節點。

.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM