mqtt選擇


 

 

1.名稱

MQTT

 

kafka

 

2.歷史

IBM推出的一種針對移動終端設備的發布/預訂協議。

 

LinkedIn公司開發的分布式發布-訂閱消息系統。后來,成為Apache項目的一部分。

 

3.原理

基於二進制消息    發布/訂閱編程模式的消息協議。

 

發布/訂閱(Publish/Subscribe)模式

 

4.應用場景

物聯網:大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議。                                   

•遙感數據

•汽車

•智能家居

•智慧城市

•醫療醫護

 

 

在線應用(消息)和離線應用(數據文件,日志)               1.消息系統(吞吐量,內置的分區,冗余及容錯性)                                                       2.行為跟蹤(戶瀏覽頁面、搜索及其他行為)

3.日志收集(抽象成一個個日志或事件的消息流)

 

 

 

消息系統

 

 

 

 

 

 

 

 

 

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務。kafka集群,還是producer和consumer都依賴於zookeeper來保證系統可用性。                                                        

 

5.消息消費(push/pull)

 

 

 

 

 

 

 

 

6.角色對比

 

 

 

 

 

 

創建主題(一類消息)

5.主題(Topic

主題篩選器:通過主題對消息進行分類的                             層級主題:通過反斜杠表示多個層級關系;                                 通過通配符進行過濾:+可以過濾一個層級,而*只能出現在主題最后表示過濾任意級別的層級。舉個例子:

• building-b/floor-5:代表B樓5層的設備。

• +/floor-5:代表任何一個樓的5層的設備。

• building-b/*:代表B樓所有的設備。

注意,MQTT允許使用通配符訂閱主題,但是並不允許使用通配符廣播。

 

每個topic划分為多個partition。                                            每個partition在存儲層面是append log文件。

 

6.服務質量(Quality of ServiceQoS

為了滿足不同的場景,MQTT支持三種不同級別的服務質量為不同場景提供消息可靠性:

•級別0:盡力而為。消息可能會丟,但絕不會重復傳輸

•級別1:消息絕不會丟,但可能會重復傳輸

•級別2:恰好一次。每條消息肯定會被傳輸一次且僅傳輸一次

 

級別1,Kafka利用這一特點減少確認從而大大提高了並發。

 

7.存儲方式

內存、redis、mongdb等

 

磁盤 

 將消息持久化到磁盤,因此可用於批量消費。因為kafka是對日志文件進行append操作,因此磁盤檢索的開支是較小的;為了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數(或尺寸)達到一定閥值時,再flush到磁盤,這樣減少了磁盤IO調用的次數.

8.設計原則(為什么MQTT用來做物聯網消息傳輸、Kafka用來做日志收集)

1.協議精簡,不添加可有可無的功能。

2.發布/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞。

3.允許用戶動態創建主題,零運維成本。

4.把傳輸量降到最低以提高傳輸效率。(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。

 

5.把低帶寬、高延遲、不穩定的網絡等因素考慮在內。

6.支持連續的會話控制。

7.理解客戶端計算能力可能很低。

8.提供服務質量管理。

9.假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。

 

 

 

 

吞吐量

1.數據磁盤持久化:消息不在內存中cache,直接寫入到磁盤,充分利用磁盤的順序讀寫性能

2.zero-copy:減少IO操作步驟

3.數據批量發送

4.數據壓縮

5.Topic划分為多個partition,提高parallelism

負載均衡

1.生產者發送消息到pattition

2.存在多個partiiton,每個partition有自己的replica,每個replica分布在不同的Broker節點上

3.多個partition需要選取出lead partition,lead partition負責讀寫,並由zookeeper負責fail over

4.通過zookeeper管理broker與consumer的動態加入與離開                                                                                        

拉取系統

kafka broker會持久化數據,consumer采取pull的方式消費數據:

1.consumer根據消費能力自主控制消息拉取速度

2.consumer根據自身情況自主選擇消費模式,例如批量,重復消費,從尾端開始消費等

可擴展性

當需要增加broker結點時,新增的broker會向zookeeper注冊,而producer及consumer會根據注冊在zookeeper上的watcher感知這些變化,並及時作出調整。

 

 

 

 

 

 

 

9.消息類型

1. CONNECT:客戶端連接到MQTT代理

2. CONNACK:連接確認

3. PUBLISH:新發布消息

4. PUBACK:新發布消息確認,是QoS 1給PUBLISH消息的回復

5. PUBREC:QoS 2消息流的第一部分,表示消息發布已記錄

6. PUBREL:QoS 2消息流的第二部分,表示消息發布已釋放

7. PUBCOMP:QoS 2消息流的第三部分,表示消息發布完成

8. SUBSCRIBE:客戶端訂閱某個主題

9. SUBACK:對於SUBSCRIBE消息的確認

10. UNSUBSCRIBE:客戶端終止訂閱的消息

11. UNSUBACK:對於UNSUBSCRIBE消息的確認

12. PINGREQ:心跳

13. PINGRESP:確認心跳

14. DISCONNECT:客戶端終止連接前優雅地通知MQTT代理

 

 

 

10.服務端實現

數十個 MQTT 服務器端程序                                    Mosquitto(C/C++)

emqttd(Erlang/OTP)

Moquette

HiveMQ(Java)

 

Scala  官方實現的系統

 

 

 

 

 

 

11.總結

兩者都是從傳統的Pub/Sub消息系統演化出來的,但是進化的方向不一樣 。                                                                             Kafka是為了數據集成的場景,通過分布式架構提供了海量消息處理、高容錯的方式存儲海量數據流、保證數據流的順序等特性。

MQTT是為了物聯網場景而優化,提供多個QoS選項(exact once、at least once、at most once),還有層級主題、遺囑等特性。

 

 

12.有意思的東西

Mqtt to Apache Kafka Connect

https://github.com/evokly/kafka-connect-mqtt

 

Mosca

Kafka MQTT Bridge Example

https://github.com/mcollina/mosca/tree/master/examples/kafka

Mosca supports different backends such as redis and mongodb, but also kafka. A Kafka MQTT Bridge application is included in the Mosca examples.

 

--------------------- 本文來自 wang被注冊了 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/yeshenzzrff/article/details/79021479?utm_source=copy 


免責聲明!

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



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