1. 程式人生 > >Rabbit MQ基礎概念

Rabbit MQ基礎概念

 生產者(producer)建立訊息,然後釋出到代理伺服器(RabbitMQ)。訊息包含兩部分內容:有效載荷(payload)和標籤(label)。有效載荷就是你想要傳輸的資料,它可以是任何內容,標籤描述了有效載荷,並且RabbitMQ用它來決定誰將獲得訊息的拷貝。

  在應用程式和Rabbit代理伺服器之間建立一條TCP連線,一旦TCP連線開啟,應用程式就可以建立一條AMQP通道。通道是建立在“真實的”TCP連線內的虛擬連線。AMQP命令都是通過通道傳送出去的。每條通道都會被指派一個唯一的ID。不論是傳送訊息,訂閱佇列貨接收訊息,這些動作都是通過通道完成的。

  AMQP訊息路由有三部分組成:交換器,佇列和繫結。生產者把訊息釋出到交換器上;訊息最終到達佇列,並被消費者接收;繫結決定了訊息如何從路由器到特定的佇列。消費者通過以下兩種方式從特定的佇列中接收訊息:

    通過AMQP的baisc.consume命令訂閱。這樣會將通道置為接收模式,直到取消對佇列的訂閱為止。

    向佇列請求單條訊息是通過AMQP的basic.get命令實現的。這樣可以讓消費者接收佇列中的下一條訊息。basic.get會訂閱訊息,獲得單條訊息,然後取消訂閱。消費者應該使用basic.consume來實現高吞吐量。

  當Rabbit佇列擁有多個消費者時,佇列收到的訊息將以迴圈(round-robin)的方式傳送給消費者。每條訊息只會傳送一個訂閱的消費者。訊息者通過AMQP的basic.ack命令顯式地向RabbitMQ傳送一個確認,或在訂閱到佇列的時候將auto_ack引數設定為true。當設值了auto_ack時,一旦訊息者接收訊息時,RabbitMQ會自動視為其確認了訊息。

  若處理訊息的時候遇到了不可恢復的錯誤,但由於硬體問題,隻影響到當前的消費者。只要訊息尚未確認,則有兩個選擇:

    把消費者從RabbitMQ伺服器斷開連線,此時RabbitMQ自動重新把訊息入隊併發送給另一消費者。缺點時連線/斷開的方式會增加RabbitMQ的負擔

    使用AMQP的basic.reject命令。若把reject命令的requeue引數設定為true,RabbitMQ會將訊息重新發送給下一個訂閱的消費者。

  消費者和生產者都可以使用AMQP的queue.declare命令來建立佇列。若消費者在同一條通道上訂閱了另一個佇列的話,則無法在宣告隊列了,必須先取消訂閱,將通道置為“傳輸”模式。當建立佇列時,需要制定佇列名稱。消費者訂閱佇列時需要佇列名稱,並在繫結時也需要指定佇列名稱。若不指定佇列名稱,Rabbit會分配一個隨機名稱並在queue.declare命令的響應中返回。在建立佇列時設定exclusive為true時,佇列將變為私有的。當最後一個消費者取消訂閱時,使用auto-delete引數可以讓佇列自動移除。當想檢測佇列是否存在時,可以設定queue.declare的passive選項為true。在該設定下,若該佇列存在,queue.declare命令會返回成功,否則命令不會建立一個佇列而返回一個錯誤。

  佇列是AMQP訊息通訊的基礎模組:為訊息提供了住處,訊息在此等待消費;對負載均衡來說,只需附加消費者,並讓RabbitMQ以迴圈的方式均勻地分配發來的訊息;佇列是Rabbit中訊息的最後的終點。

  當你想要將訊息投遞到佇列時,通過把訊息傳送給交換器來完成。然後根據確定的規則,RabbitMQ將會決定訊息該投遞到哪個佇列。這些規則被稱為路由鍵(routing key)。佇列通過路由鍵繫結到交換器。當你把訊息傳送到代理伺服器時,訊息將擁有一個路由鍵,即使路由鍵時空的,RabbitMQ也會將其和繫結使用的路由鍵進行匹配。若匹配,則該訊息將投遞到佇列,若不匹配,訊息將進入“黑洞”。

  協議中定義了四種不同型別交換器:direct,fanout,topic和headers。

  headers交換器:允許你匹配AMQP訊息的header而非路由鍵。

  direct交換器:如果路由鍵匹配,訊息就被投遞到對應的佇列。伺服器必須實現direct型別交換器,包含一個空白字串名稱的預設交換器,當宣告一個佇列時,它會自動繫結到預設交換器,並以佇列名稱作為路由鍵。

    channel>basicpublish(msg, ”, ‘queue-name’);//第一個引數是傳送資訊;第二個引數exchange,此處是空的字串,指定了預設交換器;第三個參事是路由鍵。

  fanout交換器:將收到的訊息廣播到繫結的佇列上。當傳送一條訊息到fanout交換器時,它會把訊息投遞到所有附加在此交換器上的佇列。

  topic交換器:使來自不同源頭的訊息能夠到達同一個佇列。

    channel>basicpublish(msg, ‘logs-exchange’, ‘error.msg-index’);

    $channel->basic_bind(‘msg-inbox-errors’, ‘logs-exchange’, ‘error.msg-index’);

    $channel->basic_bind(‘msg-index-logs’, ‘logs-exchange’, ‘*.msg-inbox’);

  每一個RabbitMQ伺服器都能建立虛擬訊息伺服器,我們稱之為虛擬主機(vhost)。每一個vhost本質上是一個mini版的RabbitMQ伺服器,擁有自己的佇列,交換器和繫結。它有自己的許可權機制,這使得你能夠安全地使用一個RabbitMQ伺服器來服務眾多應用程式。vhost通過在各個例項間提供邏輯上的分離,允許為不同應用程式安全保密地執行資料。當在RabbitMQ建立一個使用者時,使用者通常會被指派給至少一個vhost,並且只能訪問vhost內的佇列,交換器和繫結。當在RabbitMQ叢集上建立vhost時,整個叢集上都會建立該vhost。vhost不僅消除了為基礎架構中的每一層執行一個RabbitMQ伺服器的需要,同樣也避免了為每一層建立不同叢集。通過使用rabbitmqctl add_vhost vhost_name來建立一個vhost。通過rabbitmqctl delete_vhost vhost-name來刪除vhost。通過rabbitmqctl list_vhosts來顯式所有的vhost。

  佇列和交換器的durable屬性預設為false。當RabbitMQ崩潰或重啟後所有資料將會丟失。因此應該將佇列和交換器設定為true。能從AMQP伺服器崩潰中恢復的訊息稱之為持久化訊息。在訊息釋出前,通過把它的“投遞模式(delivery mode)”設定為2來把訊息標記成持久化。因此,若訊息要從Rabbit崩潰中恢復,需要把它的投遞模式選項設定為2;傳送到持久化的交換器;到達持久化的佇列。RabbitMQ確保永續性訊息能從伺服器重啟中恢復的方式是,將它們寫入磁碟上的一個持久化日誌檔案。當釋出一條永續性資訊導持久交換器上時,Rabbit會在訊息提交到日誌檔案後才傳送響應。使用持久化機制會導致效能的下降,因為要不斷將訊息寫入磁碟同時會極大減少RabbitMQ伺服器每秒可處理的訊息總數。永續性訊息在RabbitMQ內建叢集環境下工作得並不好,若叢集中某個節點崩潰了,則這個佇列也就從整個叢集中消失了。若節點宕機,則其他佇列也無法使用了。若要求單臺Rabbit伺服器每秒處理10w訊息,生產者可以在單獨的通道上監聽應答佇列。若訊息應答未在合理時間範圍內到達,生產者可以重新發送訊息。即要保證訊息的投遞決定了相對於其他型別的訊息會有更低的吞吐量。

  在AMQP中,在把通道設定成事務模式後,通過通道傳送那些想要確認的訊息之後還有很多其他AMQP命令,這些命令的執行與否取決於第一條訊息傳送是否成功。一旦傳送完所有命令,就可以提交事務了。若事務中的首次釋出成功了,那麼通道會在事務中完成其他AMQP命令,若失敗,則其他AMQP命令將不會執行。使用事務會造成嚴重的效能下降,降低2~10倍的訊息吞吐量並且使生產者應用程式產生同步。因此,RabbitMQ提出了傳送方確認模式,即將通道設定為confirm模式。一旦通道進入confirm模式,所有在通道上釋出的訊息會被指派唯一一個ID號(由於一條通道只能被耽單個程使用,因而可以確保通道上釋出的訊息是連續的。因此RabbitMQ做了個簡單的假設:任一通道上釋出的訊息將獲得ID1,並且通道接下來的每一條訊息的ID都將步進1。每次應用程式通道釋出訊息時,需要把計數器加1)。一旦訊息被投遞給所有匹配的佇列後,通道會發送一個傳送方確認模式給生產者應用程式使得生產者知曉訊息已經到達隊列了。傳送方確認的好處是移步,生產者可以在等待確認的同時繼續傳送下一條。當確認訊息最終受到時,生產者應用的回撥方法會被觸發來處理確認資訊。若Rabbit發生了內部錯誤而導致資訊丟失,Rabbit會發送nack訊息。由於沒有回滾,傳送方確認模式更加輕量級,同時對Rabbit代理伺服器的效能影響幾乎可以忽略不計。

相關推薦

Rabbit MQ基礎概念

 生產者(producer)建立訊息,然後釋出到代理伺服器(RabbitMQ)。訊息包含兩部分內容:有效載荷(payload)和標籤(label)。有效載荷就是你想要傳輸的資料,它可以是任何內容,標籤描述了有效載荷,並且RabbitMQ用它來決定誰將獲得訊息的拷

Rabbit MQ基本概念介紹

RabbitMQ介紹 RabbitMQ是一個訊息中介軟體,是一個很好用的訊息佇列框架,這裡有幾個關鍵的名詞: ConnectionFactory、Connection、Channel ConnectionFactory、Connection、Channel都是Rab

RabbitMQ基礎概念詳細介紹

可用性 將不 tar connect 相互 abi 封裝 編寫 綁定 原文地址:http://www.diggerplus.org/archives/3110 引言 你是否遇到過兩個(多個)系統間需要通過定時任務來同步某些數據?你是否在為異構系統的不同進程間相互調用、通

JS基礎概念

文件 數字 true while語句 第一個 加載 截取 pre js基礎 JS基礎概念 1. 算法及流程圖 算法類型:1.算數算法;2.事務性算法(解決某個問題的方法和先後順序)。 JS語法概述 1. 引入JS的方法 1.用<script src=""><

kafka-通俗易懂基礎概念

kafka python topic 一些大的網站如果想統計用戶的訪問情況,如果每個用戶的訪問,都在後端經過一系列的用戶行為分析,然後再給客戶返回結果這顯然不現實,直接寫入數據庫,數據庫也扛不住,這時候就需要一個消息系統,在用戶一個請求過來後,服務器只需要把這次操作扔到後端,不用管後

【extjs6學習筆記】0.1 準備:基礎概念(02)

json over cal 類的屬性 tab 常用事件 data 微軟 基於 Ext 類 Ext 是一個全局單例的對象,在 Sencha library 中它封裝了所有的類和許多實用的方法。許多常用的函數都定義在 Ext 對象裏。它還提供了像其他類中一些頻繁使用的方法

2017-5-19 rabbit-mq

bold www family ext erlang play 通過 spa baseline 2017-5-19 rabbit-mq新建模板小書匠歡迎使用 小書匠(xiaoshujiang)編輯器,您可以通過設置裏的修改模板來改變新建文章的內容。 rabbitmq的各

nodejs零基礎詳細教程1:安裝+基礎概念

img res 安裝過程 pkg 實時 linkedin 圖標 過程 好的 第一章 建議學習時間2小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏輯

java 基礎概念 -- 數組與內存控制

nbsp 堆內存 數組元素 art pan popu ace article pac 問題1: Java在聲明數組的過程中,是怎樣分配內存的? 在棧內存中 建一個數組變量,再在堆內存中 建一個 數組對象。至於詳細的內存分配細節,還得看 該初始化是 數組動態初始化 還是

Linux同步與相互排斥應用(零):基礎概念

使用 line 關系 並發執行 來看 文章 必須 生產者 而且 【版權聲明:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】 當操作系統進入多道批處理

python3 基礎概念

small obj 如果 公司 不可變類 col targe 形象 height 一、3.x新特性 1、print (),打印,3.x必須加括號 2、raw_input,3.x改為input 二、簡介 Python是著名的“龜叔”Guido van Ros

2017.06.29數據挖掘基礎概念第六,八,九章

之前 屬性。 prior 選擇 處理 挖掘 允許 什麽是 單元 第六章51、關聯規則的挖掘的兩個過程1、找出所有的頻繁項集2、由頻繁項集產生強關聯規則52、頻繁項集挖掘方法 1、Apriori算法 2、挖掘頻繁項集的模式增長方法 3、使用垂直數據格式挖掘頻繁項

2017.06.29數據挖掘基礎概念第四章

構建 企業 操作 允許 包含 元數據 體系結構 當前 然而 第四章39、為什麽在進行聯機分析處理(OLAP)時,我們需要一個獨立的數據倉庫,而不是直接在日常操作的數據庫上進行 1、提高兩個系統的性能 2、操作數據庫支持多事務的並發處理,需要並發控制和恢復機制,確保一

基礎概念

們的 例如 區別 行為 事物 創建 自己 避免 要求 1、面向對象3大特點 封裝:封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。 繼承:繼承是指這樣一種能力:它可以使用現有類的

K8S基礎概念

使用 外部 清理 lac six 基本上 新的 容器 所有 一、核心概念 1、Node Node作為集群中的工作節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行著Kubernetes的Kubelet、kube-proxy

軟件測試基礎概念總結

開發 提高 運行程序 手機軟件 標準化 理論 report 計算 管理 一、軟件測試概述 (一)什麽是測試,與測試相關常見活動有哪些? 測試:與科學方法中的實驗類似,是對事物狀態、功能的測量和觀察。通過將測量結果與已知狀態或理論假設相比較,測試者得以對事物狀態、功能做出

粵嵌java培訓第一天筆記-java基礎概念

ont 類型 運算符 按位或 次循環 規則 是否 支持 har 一、二進制數   1、最高位為0,表示正數;最高位為1,表示負數。   2、相應的負數與正數之間進行轉換方式:通過補碼方式進行轉換,即:取反再加1。     例如:0000 0001 表示 +1;通過對 000

站點分析基礎概念之訪問停留時間

基礎概念 sso ack nts visit gin san faq iss 類型:計數度量 定義:訪問停留時間(Visit Duration)是指一次訪問的持續時間。典型的計算方法是在一次訪問中,用戶最後一次操作發生的時間減去第一次操作發生的時間。

機器學習基礎概念筆記

最大 什麽 mar 機器學習 決策 常見 idg 框架 評估 監督學習:分類和回歸屬於監督學習。這類算法必須知道預測什麽,即目標變量的分類信息。   常見算法:k-近鄰算法、線性回歸、樸素貝葉斯算法、支持向量機、決策樹、Lasso最小回歸系數估計、Ridge回歸、局部加權線

oracle DDL,DML,DCL, 基礎概念詳解

aud ase class con ani 概念 ddl 數據庫狀態 修改 一、SQL語言,有兩個組成部分:   DML(data manipulation language):它們是SELECT、UPDATE、INSERT、DELETE,命令是用來對數據庫裏的數據進行操作