我們很高興地宣布 StreamNative 開源了 “MoP”(MQTT on Pulsar)。MoP 將 MQTT 協議處理插件引入 Pulsar broker。這樣一來,Apache Pulsar 就可以支持原生 MQTT 協議。
與 KoP 相似,MoP 是一種可插拔的協議處理插件。將 MoP 協議處理插件添加到現有 Pulsar 集群后,用戶不用修改代碼就可以將現有的 MQTT 應用程序和服務遷移到 Pulsar。
這樣 MQTT 應用程序就可以利用 Pulsar 的特性,例如 Apache Pulsar 計算和存儲分離的架構以及 Apache BookKeeper 保存事件流和 Pulsar 分層存儲等特性。
什么是 Apache Pulsar
Apache Pulsar 是一個雲原生的分布式消息傳遞和流數據平台,每天管理數千億個事件。Pulsar 最初由 Yahoo 開發,於 2016 年底開源,並於 2018 年成為 Apache 軟件基金會的頂級項目。Pulsar 將重要的 Yahoo 應用程序(例如 Yahoo Finance、Yahoo Mail 和 Flickr)連接到數據的整合消息傳遞平台。
GitHub:https://github.com/apache/pulsar 。
Pulsar 是一種多租戶、高性能解決方案,用於在服務器之間傳遞消息。Pulsar 支持以下關鍵特性:
- Pulsar 的單個實例原生支持多個集群,支持跨地域在集群間無縫復制消息
- 極低的發布延遲和端到端延遲
- 支持擴展到數百萬個 Topic
- 通過 Apache BookKeeper 提供的持久化消息存儲機制保證消息傳遞
目前,Apache Pulsar 已經廣泛應用於多個領域。騰訊、Verizon Media、Splunk、中國移動、BIGO 等都在使用 Pulsar 來實現業務目標。
更多用戶案例,可以參考:https://streamnative.io/blog 。
什么是 MQTT
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱(pubish/subscribe)模式的"輕量級"通訊協議。
該協議構建於 TCP/IP 協議之上,由 IBM 在 1999 年發布。MQTT 最大優點在於,它可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,MQTT 在物聯網、小型設備、移動應用等方面得到廣泛應用。
為什么需要 MoP
Apache Pulsar 為隊列和流工作負載提供統一的消息模型。Apache Pulsar 支持基於 protobuf 的二進制協議,以確保高性能和低延遲。protobuf 有利於實現 Pulsar 客戶端:https://pulsar.apache.org/docs/en/client-libraries/ 。
而且,該項目也支持 Java,Go,Python 和 C ++ 語言以及社區提供的第三方客戶端:https://pulsar.apache.org/docs/en/client-libraries/#thirdparty-clients 。
Pulsar 支持多租戶,基於 Apache BookKeeper 構建持久化機制。因此,越來越多的公司正在探索使用 Pulsar 搭建其底層服務、轉變業務架構。但是,想要采用 Pulsar 的統一消息協議,用戶必須重寫使用其他消息協議編寫的現有應用程序。
為了解決這個問題,StreamNative 一直致力於開發新項目。今年,StreamNative 開源了KoP(Kafka-on-Pulsar)和AoP(AMQP-on-Pulsar)協議處理插件,方便將使用 Kafka 和 AMQP 協議的應用程序和服務遷移到 Pulsar。
- KoP 是一種可插拔的協議處理插件。將 KoP 協議處理插件添加到現有 Pulsar 集群后,用戶不用修改代碼就可以將現有的 Kafka 應用程序和服務遷移到 Pulsar
- AoP 是一種可插拔的協議處理插件。將 AoP 協議處理插件添加到現有 Pulsar 集群后,用戶不用修改代碼就可以將現有的 RabbitMQ 應用程序和服務遷移到 Pulsar
StreamNative 收到大量的用戶請求,請求幫助他們從 MQTT 遷移到 Pulsar。同時,StreamNative 也意識到在 Pulsar 上原生支持 MQTT 消息傳輸協議的必要性。所以,StreamNative 開始致力於將通用協議處理插件框架引入到 Pulsar 中。該框架允許使用 MQTT 傳輸協議的開發人員使用 Pulsar。
MoP 架構
MoP 是一個可插拔的協議處理插件。通過使用 Pulsar 的 Topic、Cursor 等特性,實現在 Pulsar 上支持原生 MQTT 協議。
下圖展示了 MoP 協議處理插件與 Pulsar 集群的結合。MQTT Proxy 服務和 MQTT 協議處理插件都與 Pulsar broker 一起運行。
MoP 概念
消息的服務質量
為了適應不同的場景需求,MQTT 協議支持以下三種QoS 等級:
-
QoS0:最多只發送一次消息,或者當網絡傳送受阻時,根本不發送消息。也不會保存發送的消息。
-
QoS1:至少發送一次消息。如果發送方沒有收到確認包,則會再次發送加上 DUP 標志的消息,直到發送方收到確認包。
-
QoS2:只成功發送一次消息。消息必須存儲在發送方和接收方的本地環境中,直到被妥善處理。該 QoS 等級最高的消息服務等級。
目前,MoP 協議處理插件只支持 QoS0 和 QoS1 級別的消息服務質量。計划在未來版本中支持 QoS2。
MoP Proxy
在 MoP 中,MoP Proxy 是一個可選組件,主要用來代理 MoP 的服務。MoP Proxy 支持將 MoP 擴展至多個節點,以實現橫向擴展服務。MoP Proxy 主要用於正確地轉發 MQTT Client 和 Pulsar Broker 之間傳遞的消息數據,因此 MQTT Client 只需連接到 MoP Proxy,發送並接收數據,而無需關注 Topic 的所屬 Pulsar Broker。
MoP Proxy 可以感知 Topic 所屬 Pulsar Broker 的變化。一旦所屬 Pulsar Broker 發生變化,MoP Proxy 可以將 MQTT Client 的網絡數據包發送至新的所屬 Pulsar Broker。
下圖說明了 MoP Proxy 的服務流程。
- MQTT 客戶端建立與 MoP Proxy 的連接。
- MoP Proxy 向 Pulsar 集群發送查找請求,確定當前 Topic 的 owner broker 的 URL 地址。
- Pulsar 集群將 owner broker 的 URL 地址返回給 MoP Proxy。
- MoP Proxy 建立與 Topic 所在的 owner broker 的連接,並開始在 MQTT 客戶端和 Topic 所在的 owner broker 之間傳輸數據。
目前,MoP Proxy 以插件的方式與 Pulsar broker 一起運行。用戶可以通過修改配置來開啟 Proxy。
有關詳細信息,可以參考:https://github.com/streamnative/mop#how-to-use-proxy 。
開始使用 MoP
MoP 是一個開源項目,采用 Apache License V2。
下載 MoP 協議處理插件最新發布版本,開始使用 MoP 協議處理插件:https://github.com/streamnative/mop/releases/ 。
關於如何使用 MoP 協議處理插件,可以參考文檔:https://github.com/streamnative/mop/blob/master/README.md 。
如果在使用中遇到任何問題,可以在 MoP 倉庫中提交 issue,我們會在第一時間回應。同時,我們也歡迎你為 MoP 貢獻特性:https://github.com/streamnative/mop/issues 。