
建構實時web或移動應用程式比建構标準服務更具挑戰性。這是因為您選擇的将資料從伺服器傳遞到用戶端的協定将對總體體驗産生重大影響。
當您需要資料從伺服器快速地流向客戶機時,需要一個持久連接配接。您可以使用長輪詢(long polling)、WebSockets、伺服器發送事件(SSE)或HTTP2推送來完成此操作。
今天,我們将具體看看MQTT和SSE,看看它們之間的比較。
MQTT和SSE的簡要曆史
MQTT,即消息隊列遙測傳輸(Message Queuing Telemetry Transport),是一種釋出-訂閱(publish-subscribe)消息協定,最早出現于1999年。IBM的andy Stanford-Clark和eurotech的Arlen Nipper在那一年釋出了該協定。
最初,它為沙漠管道段之間的連接配接提供支援,以便進行主動監測。這是通過将管道連接配接與衛星網絡同步來實作的。
這個想法是建立一種輕量級的機器對機器通信協定,該協定甚至可以在帶寬低,連接配接性無法預測的有限網絡上以及低功耗裝置上運作。它還合并了不同級别的服務品質(QoS)。
從那時起,MQTT已成為類似應用程式的公認協定,在CPU功率有限、電池限制和不可預測的通信執行個體之間橋接裝置之間的連接配接。最近,MQTT已成為物聯網解決方案的首選協定。
另一方面,SSE(Server-Sent Events)出現的時間要晚得多,在2006年。該協定基于伺服器發送的DOM事件,它是Opera 9 web浏覽器引入的。當時,它還是一項試驗技術,僅在發生新事件或更新時才将内容從伺服器推送到客戶機或web浏覽器。
首先,用戶端使用EventSource接口建立連接配接。基于JavaScript的API使HTTP流保持打開狀态并接收更新,直到最終将其關閉。
這是一個新的EventSource對象的示例,該對象設定為從伺服器接收事件:
它們有何不同?
有兩種主要的方法來處理資料傳遞。第一個稱為用戶端請求,它表示浏覽器或應用正在從伺服器請求資料。第二種方法稱為伺服器推送,這是遠端伺服器主動将資料推送到網站或應用程式。本質上,一個涉及用戶端,另一個涉及伺服器。
雖然隻有兩種方法可以進行資料傳遞,但是可以通過幾種方法實作此過程:
1)長輪詢或短輪詢(用戶端pull)
2)WebSockets(伺服器推送)
3)伺服器發送的事件(伺服器推送)
輪詢是在用戶端完成的,當應用程式或網站定期向伺服器請求資料時會發生輪詢。
WebSockets是用戶端和伺服器之間的持久連接配接,主要用作通信協定。
最後,SSE(Server-Sent Events)是一種異步機制,通過活動連接配接将資料推送到用戶端。當新的資料塊或更新可用時,伺服器也可以發送資料。連接配接可能保持打開狀态,但這并不一定意味着資料正在傳輸。
僅從這些定義,您就可以看到客戶機-伺服器程序有多麼不同。這也意味着它們各有優缺點,這使得它們在某些情況下非常适合使用,而在另一些情況下就不那麼實用了。
MQTT作用概述
MQTT協定依賴于類似網絡的系統,包括伺服器,一個或多個用戶端和代理。代理是MQTT伺服器,連接配接的裝置是用戶端。釋出者和用戶端都不會處理這些工作。相反,處理能力和通信主要由代理處理。
是以,MQTT允許開發人員建立通信通道層次結構。從視覺上看,這就像一個樹枝。釋出者或伺服器首先向代理發送新資料,以及傳遞控制說明。
然後,代理會促進另一端的客戶之間的資訊交換。進階用戶端可以從釋出伺服器接收每一條消息或更新,而低級用戶端隻接收與其基本級别相關的消息。
所有釋出并發送給代理的資料(以及接收到的資料)均采用二進制協定進行編碼。 是以,必須先解釋該消息,然後才能使用資料内容。
盡管如此,MQTT僅通過純文字分發安全性憑證,是以它并不完全安全,并且不能為大多數應用程式提供足夠的身份驗證或安全性。開發人員可以通過實作SSL架構解決此問題,該架構通過加密保護任何傳輸的資料。
MQTT:優點和缺點
優點
1)MQTT是一種難以置信的輕量級協定,旨在連接配接資源最受限的裝置。
2)它内置了多層服務品質(QoS)。
3)大多數雲OT廠商和提供商已經支援MQTT,使其成為傳感器不斷收集和報告聚合資料的IoT解決方案的理想選擇。
4)MQTT是雙向的。
缺點
1)由于集中代理的性質,開發人員在使用MQTT時可能會遇到擴充限制,本地代理中心會限制其支援的擴充量。
2)具有諷刺意味的是,MQTT通常運作在TCP/IP網絡堆棧的頂部,該堆棧是為具有更大記憶體和處理能力的裝置而設計的。是以,喚醒和通訊時間可能會延長,這可能會影響長期的電池消耗。
SSE概述
SSE連接配接通常在用戶端-伺服器配置之間的連結的用戶端開始。用戶端通過在JavaScript中建立新的EventSource對象來啟動并打開連接配接。它通過HTTP請求發送相關的URL。
建立連接配接後,用戶端将期待并尋找事件消息流。隻要傳輸資料,HTTP請求就保持打開狀态。一段時間後,當用戶端認為傳輸過時時,連接配接将關閉。如果取消了初始請求,則用戶端也可以直接關閉連接配接。
如您所見,SSE比MQTT更簡單,并且不涉及代理。
SSE:優點和缺點
1)資料通過簡單且廣泛使用的HTTP協定而不是專有協定進行同步。
2)包括對重建立立連接配接和事件ID功能的内置支援。
3)對于利用單向通信的應用程式和服務非常有用。
1)不幸的是,SSE隻支援UTF-8編碼,不支援二進制資料。
2)對最大打開連接配接數的嚴格限制可能使事情變得困難,每個浏覽器都設定了限制。
3)SSE是單向的。
MQTT與SSE
比較MQTT和SSE時要考慮的最重要的事情是它們的連接配接能力。例如,SSE是單向的,專門為需要從伺服器提取資訊的服務或應用程式而設計。另一方面,MQTT是一種健壯的雙向通信選項,可以促進伺服器與用戶端之間來回的資料傳輸。
這意味着SSE非常适合将資訊存儲在伺服器上并推送到用戶端的應用程式,例如實時股票應用程式或基于新聞的服務。從本質上講,不需要從用戶端以相反的方向傳遞資料。
這也解釋了為什麼開發人員在物聯網應用程式,傳感器和裝置中首選MQTT的原因,當然還有其他優點。由于資訊具有雙向結構,是以可以雙向傳遞。
SSE開源解決方案
了解SSE之後,您可能已經準備好尋找可以幫助您入門的開源SSE軟體。Gossed就是一個例子。它允許您将任何程式的标準輸出作為伺服器發送的事件推送到浏覽器。
還有SSE Channel,可以将消息廣播到所有連接配接的用戶端。另外,此工具會自動維護曆史記錄。它的另一個功能是能夠根據需要向用戶端發送自動“保持活動(keep-alive)”資料包的功能。
MQTT開源解決方案
也有開放源碼MQTT選項。Eclipse Mosquitto是輕量級的,适用于所有裝置。它可以處理從智能手機到連接配接傳感器的各種裝置的消息傳遞需求。還有一個測試伺服器,它允許您使用幾個與MQTT相關的場景檢視客戶機的功能。
HiveMQ是MQTT的另一個代理,它在2019年4月成為一種開源軟體。它專門用于處理與物聯網裝置相關的資訊。該工具提供了一個實時監視界面,以及用于故障診斷的進階端到端MQTT分析。
實施中的困難
首先,為MQTT或SSE實作内部解決方案可能聽起來可行。但是,有一些常見的問題需要克服,比如與消息順序和有保障的傳遞相關的問題。您還必須牢記安全性,包括通路控制和配置。2019年,安全研究人員較長的描述了至少3200個擁有智能家居技術的家庭是如何由于MQTT的不安全錯誤配置而可能受到黑客攻擊的。
再加上其他必需的東西,比如建立開發人員文檔,就很容易了解為什麼您最終會認為,從操作和工程的角度來看,使用内部解決方案過于耗費人力和成本。随着最終使用者數量的增長,你很可能會得出這樣的結論。在加大努力的同時,這裡列出的所有挑戰可能會變得更成問題。
盡管如前所述,MQTT和SSE都具有開源選項,但更明智的選擇是投資于商用的實時消息傳遞平台。 即使您擴大規模,它也可以幫助您始終獲得較高的性能和可靠性。
原文連結