訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。透過訊息佇列,應用程式可獨立地執行–它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。
整體來說,訊息中間件有以下作用:降低耦合、流量消峰、非同步通訊、可靠性傳輸
1.降低耦合:透過發布訂閱的方式鬆散耦合
我們以註冊業務為例,註冊成功會發送簡訊、郵件給用戶來確認,傳統架構模型是這樣:
郵件業務和簡訊業務的程式碼是寫在使用者註冊的流程裡,無論是透過介面的方式來實現,還是遠端呼叫的方式來實現,耦合度都很高,現在,新增一個需求,使用者註冊完成以後不發送郵件了,而是給用戶“增加積分”,我們來分析這幾種情況:第一、都在一個業務系統內通過代碼堆積、接口調用的方式來實現註冊成功後的業務處理,我們需要改變註冊代碼,上線時需要啟動停止應用,這種方式耦合度最高。 第二、透過遠端呼叫的方式,當我們要新增業務處理時,還是要改變主流程程式碼,避免不了啟動停止應用程式。 如果我們引入訊息中間件,如下:透過發布訂閱的方式,用戶註冊成功後,給訊息中間件發送一個訊息,各個業務端訂閱同一個頻道的訊息,接收到註冊成功的訊息後就執行對應業務。新增“增加積分”,就讓積分系統相關處理訂閱這個消息就夠了,不用改動用戶業務代碼,不用啟停應用,就可以實現業務的平滑擴展。 2.非同步通訊還拿上面舉例,傳統架構中當使用者註冊完成,並發送完簡訊郵件後才傳回客戶端通知使用者註冊成功。而使用訊息中間件後用戶提交完註冊資訊處理完成後即可提示用戶註冊成功,後續簡訊服務、郵件服務得到訂閱的頻道中的用戶註冊成功訊息後再去發送簡訊和郵件,業務之間不再相互制約。
3.流量消峰、防浪湧
訊息中間件可以在峰值時堆積訊息,而在峰值過去後下游系統慢慢消費訊息解決流量洪峰的問題。並發量達到高峰時,後端系統壓力通常會很大,無論是應用伺服器還是資料庫伺服器,這個時候可以將類似請求放到訊息中介軟體的訊息佇列中堆積起來慢慢處理,也可以設定訊息佇列的大小達到控制並發量的目的,商品秒殺的業務場景比較典型。
4.可靠性傳輸基於訊息的通訊是可靠的,訊息不會遺失。大多數訊息中間件都提供將訊息持久化到磁碟的功能。在開篇的第一個場景中,訊息中間件可以將生產者生產的訊息持久化到磁碟,後端應用宕機,但訊息不會遺失,應用重啟繼續處理。 你可能會有這樣的疑問,那訊息中間件宕機了,接收不到訊息怎麼持久化?沒關係,訊息中間件提供了多種訊息複製策略、持久化策略,叢集部署策略等都可以保證訊息的可靠性傳輸。
二、訊息中間件模式
############# ####三、常用訊息中間件###############RabbitMQ#########1.RabbitMQ特性:######RabbitMQ是一個由Erlang語言開發的基於AMQP標準的開源實作。 RabbitMQ最初起源於金融系統,用於在分散式系統中儲存轉發訊息,在易用性、擴展性、高可用性等方面表現不俗。其具體特點包括:######可靠性######靈活的路由###支援訊息群集
高可用性
支援多種協定 (除支援AMQP協定之外,也透過插件的方式支援其他訊息佇列協議,如STOMP、MQTT)
支援多語言客戶端
提供管理介面
提供追蹤機制
提供插件機制 (RabbitMQ提供了許多插件,也可以編寫自己的插件)
總結:
RabbitMQ最大的優勢在於提供了比較靈活的訊息路由策略、高可用性、可靠性以及豐富的插件、多種平台支援和完善的文件。不過,由於AMQP協定本身導致它的實現比較重量,從而使得與其他MQ (例如Kafka) 對比其吞吐量處於下風。
ActiveMQ
1.ActiveMQ 特點:
ActiveMQ是由Apache出品的開源訊息中間件,旨在為應用程式提供高效、可擴展、穩定、安全的企業級訊息通訊。 ActiveMQ實現了JMS 1.1 並提供了許多附加的特性,例如JMX管理、主從管理、訊息群組通訊、訊息優先權、延遲接收訊息、虛擬接收者、訊息持久化、訊息佇列監控等。主要特性如下:
支援Java、C、C 、C#、Ruby、Perl、Python、PHP等多種語言的用戶端和協議,如OpenWire、STOMP、AMQP、MQTT協定。
提供了像是訊息群組通訊、訊息優先權、延遲接收訊息、虛擬接收者、訊息持久化之類的高階特性。
完全支援JMS 1.1 和J2EE 1.4 規範(包括持久化、分散式事務訊息、事務)
支援Spring框架,ActiveMQ 可以透過Spring 的設定檔方式很容易嵌入Spring應用中。
通過了常見的J2EE伺服器測試,例如TomEE、Geronimo、JBoss、GlassFish、WebLogic。
連接方式多樣化,ActiveMQ 提供了多種連接方式,例如 in-VM、TCP、SSL、NIO、UDP、多播、JGroups、JXTA。
支援透過使用JDBC 和 Journal 實作訊息的快速持久化。
為高效能叢集、客戶端-伺服器、點對點通訊等場景而設計。
提供了一個技術和語言中立的REST API 介面。
支援以AJAX 方式呼叫 ActiveMQ。
ActiveMQ 可以輕鬆地與CXF、Axis 等 WebService 技術整合,以提供可靠的訊息傳遞。
可以作為記憶體中的JMS 提供者,非常適合 JMS 單元測試。
Kafka
1.Kafka 特點:
Kafka 最早是由LinkedIn 公司開發的一種分散式的基於發布/訂閱的訊息系統,後來成為Apache 的頂級專案。其主要特點如下:
同時為發布和訂閱提供高吞吐量。 (Kafka 的設計目標是以時間複雜度為O(1) 的方式提供訊息持久化能力的,即使對TB級別以上資料也能保證常數時間的存取性能,即使在非常廉價的商用機器上也能做到單機支援每秒100K 訊息的傳輸)
訊息持久化。 (將訊息持久化到磁碟,因此可用於批量消費,例如 ETL 以及即時應用程式。透過將資料持久化到硬碟以及複製可以防止資料遺失。)
分散式。 (支援伺服器間的訊息分區及分散式消費,同時確保每個Partition 內的訊息順序傳輸。其內部的Producer、Broker 和Consumer 都是分散式架構,這更容易向外擴展。)
消費訊息採用Pull 模式。 (訊息被處理的狀態是在Consumer 端維護的,而不是由伺服器端維護,Broker 無狀態,Consumer 自己保存offet。)
支援Online 和Offline 場景,同時支援離線資料處理和即時數據處理。
RocketMQ
1.RocketMQ 特色:
RocketMQ是阿里巴巴於2012年開源的分散式訊息中介軟體,後來捐贈給Apache軟體基金會,並於2017年9月25日成為Apache的頂級計畫。作為經歷過多次阿里巴巴「雙11」 這種「超級工程」的洗禮並有穩定出色表現的國產中間件,以其高性能、低延遲和高可靠等特性近年來被越來越多的國內企業所使用。其主要特點如下:
具有靈活的可擴展性。 (RocketMQ 天然支援集群,其核心四大元件(NameServer、Broker、Producer、Consumer)的每一個都可以在沒有單點故障的情況下進行水平擴展。)
具有海量訊息堆積能力。 (RocketMQ 採用零拷貝原理實現了超大量消息的堆積能力,據說單機已經可以支持億級消息堆積,而且在堆積了這麼多消息後依然保持寫入低延遲)
支持順序消息。 (RocketMQ 可以保證訊息消費者按照訊息發送的順序對訊息進行消費。順序訊息分為全域有序訊息和局部有序訊息,一般建議使用局部有序訊息,即生產者透過將某一類訊息按順序發送至同一個佇列中來實作。)
支援多種訊息過濾方式。 (訊息過濾分為在伺服器端過濾和在消費端過濾。在伺服器端過濾時可以按照訊息消費者的要求進行過濾,優點是減少了不必要的訊息傳輸,缺點是增加了訊息伺服器的負擔,實現相對複雜。消費端過濾則完全由具體應用自訂實現,這種方式更加靈活,缺點是很多無用的消息會被傳輸給消息消費者。)
#支援事務訊息。 (RocketMQ 除支援普通訊息、順序訊息之外,也支援事務訊息,這個特性對於分散式事務來說提供了另一種解決思路。)
#支援回溯消費。 (回溯消費是指對於消費者已經消費成功的消息,由於業務需求需要重新消費。RocketMQ 支援按照時間回溯消費,時間維度精確到毫秒,可以向前回溯,也可以向後回溯。)
#更多常見問題,敬請造訪PHP中文網。
以上是rpc中間件有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!