分散式佇列如何運作
常見問題 > 使用 Apache ActiveMQ Classic > 分散式佇列如何運作
您可以使用 ActiveMQ Classic 部署各種拓撲,其中用戶端以各種方式連接到訊息代理,例如
- 基於對等
- 用戶端伺服器
- 集線器和輻射式
每個用戶端都使用某種用戶端程式庫和網路協定與代理通訊。
為了建立分散式佇列或主題,我們需要讓訊息代理彼此通訊。有兩種不同的代理對代理通訊類型...
用於高可用性的主/從
主/從叢集用於高可用性。基本上,這意味著所有訊息都會在主/從叢集中的每個代理之間複製。如果主節點關閉,用戶端可以自動故障轉移到從節點,該從節點已經擁有所有訊息,因此每個訊息都具有高度可用性。從節點提供一個熱備用代理,如果主節點由於硬體故障等原因而關閉,它將始終同步並準備接管。
主/從運作方式是具有某種形式的複製;每個訊息都由邏輯叢集中的每個代理擁有。然後,主/從叢集充當一個邏輯訊息代理,然後可以透過儲存和轉發連接到其他代理(我們將在下一節中看到)。
分散式佇列和主題
在主/從中,佇列和主題都在叢集中的每個代理之間複製(因此通常複製到主節點,也可能複製到單個從節點)。因此,叢集中的每個代理隨時都具有完全相同的可用訊息,因此如果主節點失敗,用戶端會故障轉移到從節點,而您不會遺失訊息。
代理的儲存和轉發網路
代理的儲存和轉發網路表示訊息從代理傳輸到代理,直到它們到達消費者;在任何時間點,每個訊息都由單個代理擁有。當 JMS 生產者向 JMS 消費者傳送訊息時,它可能會通過多個代理才能到達最終目的地。ActiveMQ Classic 使用 消費者優先權,因此本地 JMS 消費者的優先權始終高於儲存和轉發網路中的遠端代理。
但請注意,儲存和轉發網路並不是訊息高可用性的解決方案;如果儲存和轉發網路中的代理失敗,則該代理擁有的訊息將保留在代理的持久儲存中,直到該代理重新上線。如果您需要訊息的高可用性,則需要使用上述的主/從。
儲存和轉發通常用於大型網路中,其中生產者位於一個 LAN 上,而消費者位於另一個 LAN 上,並且您希望在每個 LAN 上使用一個代理作為一種網路集中器,以最大限度地減少它們之間 WAN 上的閒聊(並最大限度地減少跨 WAN 所需的連線數)。當在某些網路中使用防火牆或 SSL 時,也可以找到類似的儲存和轉發用途。儲存和轉發網路的另一個使用案例是,如果您的作業系統不支援許多套接字(且您無法重新配置它),則可以使用儲存和轉發網路將大量用戶端連接到一個邏輯網路中。
儲存/轉發中的分散式佇列
當我們在佇列上發布訊息時,它會儲存在發布者正在通訊的代理的持久儲存中。然後,如果該代理配置為儲存/轉發到其他代理和用戶端,則該代理會將其傳送到其中一個用戶端(具體取決於調度演算法,它可能是節點或代理)。此調度演算法會持續進行,直到訊息最終被調度並由用戶端使用。
在任何時間點,訊息僅存在於一個代理的儲存中,直到它被使用。請注意,只有在這些代理上有消費者的情況下,訊息才會分發到其他代理。
例如,如果我們有代理 A、B、C,且 A 的佇列上有發布者。如果我們在 A 和 B 的佇列上有消費者,則該佇列的訊息將分散在 A 和 B 這兩個代理之間;一些訊息會發送到 B,一些訊息會在 A 上使用,而沒有訊息會發送到 C。如果 C 上開始出現佇列上的消費者,則訊息也會流向那裡。如果消費者停止,則不會再有訊息調度到 C。
儲存/轉發中的分散式主題
對於主題,會遵循上述演算法,但每個感興趣的用戶端都會收到一份訊息副本 - 此外,ActiveMQ Classic 會檢查迴圈(以避免訊息在代理環中無限流動)。