1. 程式人生 > >AMQP協議的路由機制

AMQP協議的路由機制

原文連結:Routing Mechanisms For AMQP Protocol
作者:Paolo Patierno,紅帽高階軟體工程師
譯者:趙屹華 審校:劉翔宇
責編:周建丁([email protected]
未經許可,請勿轉載!

上一篇文章裡,我們安裝了Qpid Dispatch Router,並且快速地瀏覽了安裝包提供的路由管理和監控工具。

本文將介紹幾個路由器的使用例子,從簡單的配置和網路拓撲到複雜的結構,包括AMQP傳送端、接收端和代理者。代理部分並不是必須的,因為AMQP協議是一種“對等”協議,它可以直接連線兩個客戶端,不需要代理提供的“儲存再轉發”機制。關於這方面的介紹,可以閱讀本系列的

第一篇文章

在本文中,我將使用預設配置的路由器來演示傳送端和接收端是如何與它連線的,以及如何通過路由器來交換訊息。

路由機制

首先,值得一提的一點是路由器支援兩種不同的路由機制。

訊息路由

當路由器從鏈路上收到一條訊息,它使用傳送端發到路由器時所指定的目的地址;如果這一地址沒有被指定,則目的地址從訊息的“to”屬性中獲取。基於這個資訊,路由器查詢路由表從而決定訊息傳遞的路徑。它可能是直接相連的接收端,也可能是網路中的另一個路由器來作為下一塊跳板。當然,訊息也可以被送達地址相同的多個不同的接收端。這裡的關鍵點是針對每一條接受到的訊息都做一次路由決策,而且路由器內部節點之間和外部客戶端往往還有很多通訊。

圖片描述

從上圖中可以看出,鏈路是建立在傳送端和路由器以及接收端和路由器之間的。在基於訊息的路由機制下,路由器和傳送端以及接收端的訊息交換是兩條截然不同的鏈路。

這也意味著路由器(內部的接收端)與傳送端、路由器(內部的傳送端)與接收端有著不同的流量控制策略。當然,如果接收端獲得的分值很低(比如10),但是路由器(內部接收端)給了傳送端很大的分值(預設是250),這個差值需要被考慮到。如果接收端由於某些原因(收到10條訊息後)關閉了連線,而傳送端傳送的訊息已經超過10條(根據“accepted”標誌),因為路由器無法向已經關閉的接收端繼續傳送訊息,它會回覆一個“released”標誌。

另一個有趣的地方在於訊息的“處置”。路由器總是在網路中傳播遞送和處置。當接收一條“預處置”訊息時,它的屬性被傳播到了目的地址。“未處置”訊息也是如此:在這種情況下,路由器需要跟蹤傳入的遞送,並將未處置訊息發往目的地址;當它從最終的接收端收到已處置標誌時,它將以同樣的方式回覆原始傳送端。

訊息路由的最後一點有趣之處在於其路由模式,定義了訊息在網路中的遊走路徑:

  • 最近路線:即使有許多接收端的地址相同,訊息還是按照最短路徑送往目的地址。這也意味著只有一個接收端能夠收到訊息。

  • 平衡路線:當有多個接收端的地址相同時,發往該地址的訊息將分佈在各個接收端上。意思是說各個接收端以類似“競爭消費者”的形式每次接收不同的訊息。

  • 多路傳送:這有點類似“釋出/訂閱”模式,即附著在同一個地址的所有接收端都能收到同樣的訊息。

當某個地址上的所有接收者都與同一個路由器相連,我們可以近似認為“最近路線”和“平衡路線”的效果是一樣的,因為所有的路徑長度都相等,接收端與路由器的距離等級都相同。事實上並不完全這樣,因為在“最近路線”模式下路由器對各個接收端使用嚴格的迴圈分佈,而在“平衡路線”模式下它考慮了各個接收端未處置遞送的個數,選擇其中“更快”的一個(即處置訊息更快)。

舉個例子,假設有一個傳送端S、兩個接收端R1和R2和一個路由器網路,R1與S連線在同一個路由器上,R2連在了另一個路由器(連到前一個)。我們認為R1到S的距離是1級,R2到S的距離是2級。

在下面的場景中,按照“最近路線”模式S傳送的所有訊息都將被傳遞到R1。

圖片描述

按照“平衡路線”模式,訊息分佈在兩個接收端上,且與路徑長度無關。

圖片描述

最後,在“多路傳送”模式下所有的訊息被髮送到所有的接收端。

圖片描述

鏈路路由

當路由器收到一條附加請求時,它被傳播於整個網路,以至於找到目的地節點,建立起一條真正的鏈路。當傳送端開始給路由器傳送訊息,在訊息層面上不需要任何決策過程,直接通過建立起的鏈路送達目的地址。你可以認為它是一種虛擬連線或是一條連同傳送端和接收端的隧道。

圖片描述

如你在上述圖片中所見,鏈路直接建在兩個端點之間,所有的活動都是通過它來進行。

從流量控制的角度來看,它直接由傳送端和接收端控制;傳送端給予的任何分值直接到達接收端,無需路由器的中間干擾。穿越路由器的鏈路就像一條“隧道”,兩個端點就像是直接相連的。

對於“未處置”訊息的標誌也是一樣的,傳送端直接收到來自接收端的標誌。

不同路由模式的概念在這裡沒有意義,因為在這種情況下有一條連線傳送端和接收端的直接路徑,因此路由器對單條訊息不做任何決策,只需要沿著鏈路傳遞每一幀資料。

我們開始吧……超級簡單!

現在,我們用一個預設配置的路由器做一個簡單的例子,只有一個傳送端和一個接收端與其相連,掛載在/my_address的地址上。

我使用了simple_recv和simple_send的C++客戶端例子,它們在Quid Proton安裝資料夾裡都能找到。

首先,我們定義接收端的地址和接收訊息的條數,比如10條訊息,啟動接收端。

圖片描述

我們使用qdstat管理工具可以發現my_address被定義為“輸出”(從路由器到接收端)的端點,還沒有傳送過訊息。

圖片描述

之後,我們開啟發送端來發送一些自動生成的訊息,比如5條訊息。

圖片描述

如你所見,所有的訊息被處置且得到確認。在接收端一側的情況如何呢?

圖片描述

傳送端傳送的所有訊息都已經接收,但應用並未關閉,因為它在等待另外5條訊息(當然,這只是應用本身的行為,與路由機制無關)。

使用qdstat管理工具,我們可以看到在my_address的輸出端點有5條已傳送訊息。我們無法檢視的是同一個地址下的“輸入”端點(從傳送端到路由器),因為訊息傳送之後,傳送端關閉了與路由器的連線,這個端點也隨之被刪除。相信我,傳送端在傳送訊息時這個端點確確實實是存在的!

圖片描述

你應該發現了我們直接將傳送端和接收端相連,不需要代理者在中間儲存和轉發訊息。在上述場景中,當訊息被處置並且給傳送端確認之後,就意味著訊息真正的被接收端所接收了。

總結

在本文中,我介紹了Qpid Dispatch Router提供的訊息路由的不同機制。我們可以針對不同的場景選擇最佳的方式,使得我們的分散式應用能更有效地傳遞訊息。我們演示了一個簡單的例子,它不需要代理者參與,而是直接將傳送端和接收端與路由器相連。在下一篇文章裡,我將不再使用預設的配置檔案,探索連線路由器與客戶端和代理者的不同方式,增加系統的複雜性。

相關推薦

AMQP協議路由機制

原文連結:Routing Mechanisms For AMQP Protocol 作者:Paolo Patierno,紅帽高階軟體工程師 譯者:趙屹華 審校:劉翔宇 責編:周建丁([email protected]) 未經許

RPC機制AMQP協議

引用 inter nsf -a pointer sdn 提交 中間件 發送消息 openstack RPC通信Openstack 的主要組件有 Nova、Cinder、Neutron、Glance 等,分別負責雲平臺的計算、存儲、網絡資源管理。OpenStack 各組件之間

Linux 核心網路協議棧 ----- Linux 核心路由機制(一) (2.6.25)

       核心的路由部分是是網路中重要部分,目前在Linux核心中預設的路由查詢演算法使用的是Hash查詢,所以你會看到很多的資料結構是XXX_hash什麼之類(例如fn_hash)。Linux核心從2.1開始就支援基於策略的路由,那麼什麼是基於策略的路由呢?我們一般

C#進階系列——WebApi 路由機制剖析:你準備好了嗎?

事先 blank path can tex 全局配置 dex 找不到 save 前言:從MVC到WebApi,路由機制一直是伴隨著這些技術的一個重要組成部分。 它可以很簡單:如果你僅僅只需要會用一些簡單的路由,如/Home/Index,那麽你只需要配置一個默認路由就能簡

History路由機制

出棧 歷史 json del page add 路由 itl location 用戶訪問網頁的歷史記錄通常會被保存在一個類似於棧對象中,即history對象,點擊返回就出棧,跳下一頁就入棧。 它提供了一些方法來操作頁面的前進和後退: window.history.bac

Django2.0中URL的路由機制

式表 錯誤處理 body 個數字 格式化 兩種 ear 映射 IT Django2.0中URL的路由機制 路由是關聯url及其處理函數關系的過程。Django的url路由配置在settings.py文件中ROOT_URLCONF變量指定全局路由文件名稱。 Django的

.Net MVC5路由機制與擴展

home webform LV 定義 write ner 直接 closed alt 新建一個MVC項目啟動後,首先訪問的地址是http://localhost:xxx/Home/Index,這時候我們也明白因為在程序中有個叫做Home的控制器,並且在這個控制器下面有個叫做

AMQP協議介紹

可用 windows 中介 -m 通道 過程 我們 htm outer AMQP協議介紹 AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。 AMQP的主要特征是面向消息

(轉)SSL/TLS協議執行機制的概述

原文:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 網際網路的通訊安全,建立在SSL/TLS協議之上。 本文簡要介紹SSL/TLS協議的執行機制。文章的重點是設計思想和執行過程,不涉及具體的實現細節。如果想了解這方面的內容,請參閱RF

深入理解AMQP協議

文章目錄 一、AMQP 是什麼 二、AMQP模型 工作過程 深入理解 三、Exchange交換機 預設交換機 直

「訊息佇列」訊息佇列概述與AMQP協議

轉載請註明出處:https://blog.csdn.net/jinixin/article/details/83552185     前面幾篇文章中談了rpc服務, rpc可用於程序間通訊, 使應用得以解耦, 而程序間通訊還可使用訊息佇列來完成. 本篇文章就簡

SPA路由機制詳解(看不懂不要錢~~)

前言 總所周知,隨著前端應用的業務功能起來越複雜,使用者對於使用體驗的要求越來越高,單面(SPA)成為前端應用的主流形式。而大型單頁應用最顯著特點之一就是採用的前端路由跳轉子頁面系統,通過改變頁面的URL,在不重新請求頁面的情況下,更新頁面檢視。 更新檢視但是瀏覽器不重新渲染整個頁面,只是重新渲染部分子頁

Vue基礎篇-路由機制

1.模式原理 不向伺服器發請求而是找到匹配元件或物件,並將其渲染。即為“前端路由”準則。vue實現路由需引入vue-router,其使用的有兩種模式,即:hash模式&history模式,下邊來簡單介紹一下。 (1)hash模式       &nbs

談談 HTTP/2 的協議協商機制

提醒:本文最後更新於 951 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 在過去的幾個月裡,我寫了很多有關 HTTP/2 的文章,也做過好幾場相關分享。我在向大家介紹 HTTP/2 的過程中,有一些問題經常會被問到。例如要部署 HTTP/2 一定要先升級到 HTTPS 麼?升級到 HTT

SSL/TLS協議執行機制的概述

網際網路的通訊安全,建立在SSL/TLS協議之上。 本文簡要介紹SSL/TLS協議的執行機制。文章的重點是設計思想和執行過程,不涉及具體的實現細節。如果想了解這方面的內容,請參閱RFC文件。 一、作用 不使用SSL/TLS的HTTP通訊,就是不加密的通訊。所有資

MFC原始碼實戰分析(三)——訊息對映原理與訊息路由機制初探

如果在看完上一篇文章後覺得有點暈,不要害怕。本節我們就不用這些巨集,而是用其中的內容重新完成開頭那個程式,進而探究MFC訊息對映的本來面目。 MFC訊息對映機制初探 還我本來面目 class CMyWnd : public CFrameWnd

Beego原始碼解析(二)-路由機制

上一篇文章介紹了 Beego關於配置項初始化的流程。那麼今天就來說說在 Beego中非常重要的路由機制. Beego到現在 v1.6.1版本為止支援了:固定路由、正則路由、自動路由這三種路由方法. 關於這三種路由的詳細用法可以參考官方給

SSL&TLS協議執行機制概述

不使用SSL/TLS的HTTP通訊,就是不加密的通訊, 所有資訊明文傳播,帶來了三大風險。 (1) 竊聽風險(eavesdropping):第三方可以獲知通訊內容。 (2) 篡改風險(tampering):第三方可以修改通訊內容。 (3) 冒充風險(pretending

RabbitMQ的核心概念以及AMQP協議

前言 上一節從各個常用的mq的對比,拓撲圖以及叢集方案來做了對比,本節就針對rabbitMQ的基本的概念再深入的探討以及鞏固,為後續搭建多活架構做準備,本系列課程將同步慕課網,如果有需求的讀者,可以自行慕課網學習,探討。 RabbitMQ是基於AMQP協議 根據之前的人工智慧的專

AMQP 協議詳解

一、AMQP 歷史 ​ 訊息佇列(Message Queue)起源於一位來自 MIT 的硬體設計教育工作者 Vivek Ranadivé 設想了一種通用軟體匯流排,就像主機板上的匯流排那樣,供其他應用程式接入。Vivek在1983年成立了 Teknekro