POSTS
Messaging System 訊息發送系統
今天來聊聊 Messaging System 現今系統架構尚不可忽視的重點沒有之一。談談近年來蓬勃發展軟體產業Internet of Things (IoT), AI, machine learning, blockchainand smart contracts 這三個重點軟體產業其快速與訊息量龐大造就目前軟體架朝向事件架構所發展Event-driven Architecture(EDA)。
在EDA架構中資料與資訊傳遞成為其重點要素,訊息傳遞必須可以重複精準的傳遞。還要大量每秒應付百萬以上訊息都已經變成表準配備了,EDA能應付千變萬化的商業模式下所需的高度即時客製化因為他是以事件作為驅動運行。
Messaging System
現在來介紹幾個消息系統,主要就是負責訊息分派與發送。
RabbitMQ
Web Site:https://www.rabbitmq.com/
RabbitMQ是實現了進階訊息佇列協定(AMQP)的開源訊息代理軟體(亦稱訊息導向中介層)。RabbitMQ伺服器是用Erlang語言編寫的,而群集和故障轉移是構建在開放電信平台框架上的。所有主要的程式語言均有與代理介面通訊的客戶端函式庫。
Kafka
Web Site:https://kafka.apache.org/
Kafka是由Apache軟體基金會開發的一個開源流處理平台,由Scala和Java編寫。該專案的目標是為處理即時資料提供一個統一、高吞吐、低延遲的平台。其持久化層本質上是一個「按照分散式事務紀錄檔架構的大規模發布/訂閱訊息佇列」,這使它作為企業級基礎設施來處理串流資料非常有價值。此外,Kafka可以通過Kafka Connect連接到外部系統(用於資料輸入/輸出),並提供了Kafka Streams——一個Java串流處理庫。
Kafka儲存的訊息來自任意多被稱為「生產者」(Producer)的行程。資料從而可以被分配到不同的「分割區」(Partition)、不同的「Topic」下。在一個分割區內,這些訊息被索引並連同時間戳儲存在一起。其它被稱為「消費者」(Consumer)的行程可以從分割區查詢訊息。Kafka執行在一個由一台或多台伺服器組成的叢集上,並且分割區可以跨叢集結點分布。
Kafka高效地處理即時串流資料,可以實現與Storm、HBase和Spark的整合。作為群集部署到多台伺服器上,Kafka處理它所有的發布和訂閱訊息系統使用了四個API,即生產者API、消費者API、Stream API和Connector API。它能夠傳遞大規模串流訊息,內建容錯功能,已經取代了一些傳統訊息系統,如JMS、AMQP等。
Kafka架構的主要術語包括Topic、Record和Broker。Topic由Record組成,Record持有不同的資訊,而Broker則負責複製訊息。Kafka有四個主要API:
- 生產者API:支援應用程式發布Record流。
- 消費者API:支援應用程式訂閱Topic和處理Record流。
- Stream API:將輸入流轉換為輸出流,並產生結果。
- Connector API:執行可重用的生產者和消費者API,可將Topic連結到現有應用程式。
NSQ
Web Site:https://nsq.io/
NSQ 是以simplequeue概念所實現的,並以Golang所編寫。 主要特點:
- 支持可實現高可用性並消除SPOF的拓撲
- 解決對更強大的消息傳遞保證的需求
- 限制單個進程的內存佔用量(通過將一些消息持久保存到磁盤上)
- 大大簡化了生產者和消費者的配置要求
- 提供簡單的升級路徑
- 提高效率
NATS
Web Site:https://nats.io/
NATS 開源訊息發送系統,主要實現是以(Message Oriented Middlewar)MOM。
消息的中間件是支持在分佈式系統之間發送和接收消息的軟件或硬件基礎結構。MOM允許將應用程序模塊分佈在異構平台上,並降低了開發跨多個操作系統和網絡協議的應用程序的複雜性。中間件創建一個分佈式通信層,將應用程序開發人員與各種操作系統和網絡接口的詳細信息隔離開來。MOM通常提供跨各種平台和網絡擴展的API。
一開始由Synadia開發並為NATS提供支持。 NATS最初由Derek Collison開發,是Cloud Foundry的消息傳遞控制平面,並用Ruby編寫。 NATS後來被移植到Go效能獲的大大提昇。
NATS Streaming是一個由NATS驅動的數據流系統,用Go編程語言編寫。 NATS Streaming服務器的可執行文件名是nats-streaming-server。 NATS Streaming與核心NATS平台無縫嵌入,擴展和互操作。 NATS Streaming服務器作為Apache-2.0許可下的開源軟件提供。 Synadia積極維護和支持NATS Streaming服務器。
特點:
- 序列 - 一個全域性順序序列號為主題的通道
- 主題 - 是NATS Streaming 交付物件
- 答覆內容 - 對應”reply-to”對應的物件內容
- 資料 - 真是資料內容
- 時間戳 - 接收的時間戳,單位是納秒
- 重複傳送 - 標誌這條資料是否需要服務再次傳送
- CRC32 - 一個迴圈冗餘資料校驗選項,在資料儲存和資料通訊領域裡,為了保證資料的正確性所採用的檢錯手段,這裡使用的是 IEEE CRC32 演算法
Liftbridge
Web Site:https://liftbridge.io/
Liftbridge 也是MOM,項目是更像是Kfaka的更多功能但不是取代Kfaka。 Liftbridge 是由資深技術人員 Tyler Treat 創立的一個項目。 Treat 是 NATS 引擎的一位長期貢獻者,現在 NATS 已成為一個由 CNCF 負責的項目。在宣布項目開源的博客帖子中,Treat 指出該項目的目標是“填補基於日誌的複雜消息系統(例如Apache Kafka 和 Apache Pulsar )與更為簡單的雲原生系統之間的空白。
想法
目前想法就是會以NATS或Liftbridge,來做專案POC而考量點:
- 專案架構初期時間為其目的不考量大型的。
- 即使真的需要用大大型場景而作的調整可以混用。
- 用Go開發的就是小並且效能驚人。
- 本來想使用 RabbitMQ作為初期開發使用但發現效能不如預期。