RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP

下午好,哈布爾! 我想分享一本我設法收集的教科書參考書 RabbitMQ 並濃縮成簡短的建議和結論。

目錄

  • RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP 和 RPC
  • RabbitMQ。 第 2 部分:了解交換
  • RabbitMQ。 第 3 部分:了解隊列和綁定
  • RabbitMQ。 第 4 部分:了解訊息和幀是什麼
  • RabbitMQ。 第 5 部分:發布和消費消息性能
  • RabbitMQ。 第 6 部分:Federation 和 Shovel 模塊概述
  • RabbitMQ。 第 7 部分. 有關 Connection 和 Chanel 的詳細信息
  • RabbitMQ。 第 8 部分..NET 中的 RabbitMQ
  • RabbitMQ。 第 9 部分. 監控

簡單介紹一下AMQP

AMQP(高階訊息佇列協定)是一種用於在系統元件之間傳輸訊息的開放協定。 基本概念是,各個子系統(或獨立應用程式)可以透過 AMQP 代理程式以任意方式交換訊息,該代理執行路由、可能保證交付、分發資料流並訂閱所需的訊息類型。

協議 AMQP 引入三個概念:

RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP

  • exchange (交換點或交換)- 訊息被送到它。 兌換點 分發消息 在一個或多個隊列中。 她 將消息路由到隊列 基於創建的鏈接(binding)在他和隊列之間
  • queue (佇列)- 磁碟或 RAM 中的資料結構 儲存訊息連結並提供訊息副本 consumers (對消費者)
  • binding (具有約束力)- 一條規則 告訴交換點這些訊息應該進入哪個佇列

協定運行在頂層 TCP / IP協議.

簡單介紹一下Erlang

該專案的源代碼位於儲存庫中 GitHub上。 建築學 RabbitMQ 伺服器 基於 Erlang 和梁。

Erlang 公司開發的 Ericsson 在 1980 年代中期,作為分散式、容錯、即時系統,適用於需要 99,999% 正常運行時間的應用程式。 Erlang 用於各種行業和現代應用,例如 WhatsApp。 您可以在文章中閱讀更多內容 WhatsApp 架構,Facebook 以 19 億美元收購

簡單介紹一下RabbitMQ

的RabbitMQ 是一個開源訊息代理。 它按照協定的所有基本原則路由訊息 空氣質量計劃 描述於 規格. RabbitMQ 實施和補充協議 AMQP.

訊息傳遞模型的主要思想 RabbitMQ 事情是 producer (發布者)不會直接將訊息傳送到佇列。 事實上,通常情況下,發布者甚至根本不知道訊息是否會傳遞到任何佇列。

相反,發布者只能將訊息發送到交換器。 一方面,交換器接收來自發布者的消息,另一方面,它將它們發送到佇列。 交換必須確切地知道如何處理它收到的訊息。 是否應該將其添加到特定隊列中? 是否應該將其添加到多個隊列中? 或應該忽略該訊息。

RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP

簡短的工作 RabbitMQ 可以描述如下:

  1. 發布者向特定交易所發送訊息
  2. 交換器收到一條訊息後,根據它與佇列之間的綁定規則將其路由到一個或多個佇列
  3. 隊列儲存對此訊息的引用。 訊息本身儲存在 RAM 或磁碟上
  4. 一旦消費者準備好從隊列接收訊息,伺服器就會透過連結建立訊息的副本並發送
  5. 消費者收到訊息並向broker發送確認
  6. 代理收到確認後,會從佇列中刪除訊息的副本。 然後從 RAM 和磁碟中刪除

RPC

過程 RPC(遠端過程呼叫) 幾乎所有與原子核相互作用的基礎 RabbitMQ。 例如,關於客戶條款的初步討論 RabbitMQ,展示一定的過程 RPC。 一旦這個序列完成, RabbitMQ 將準備好接受客戶端的請求:

RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP

規範中也有 AMQP 客戶端和伺服器都可以發出命令。 這意味著客戶端正在等待與伺服器通訊。 命令是類別和方法。 例如, Connection.Start – 方法調用 StartConnection.

連接和頻道

對於客戶端和伺服器之間的此類資訊交換, 頻道。 頻道創建於 具體連接。 每個通道都與其他通道隔離。 在同步情況下,在收到回應之前不可能執行下一個命令。

為了能夠並行發送命令,您必須打開多個通道。 每個通道創建一個單獨的 Erlang 過程。 一個連接可以有多個通道()。 對於每個通道,記憶體中都有特定的結構和物件。 因此,連接內的通道越多, RabbitMQ 使用更多內存 來管理這樣的連結。

RabbitMQ。 第 1 部分:簡介。 Erlang、AMQP

使用建立連接和通道的簡單範例 RabbitMQ.客戶端:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

強烈建議不要為每個操作打開一個新連接,因為這樣 會導致高昂的成本。 通道也應該是持久的,但是許多協定錯誤會導致通道關閉,因此通道的生命週期可能比連接的生命週期短。

RabbitMQ用在哪裡?

在微服務的背景下,協議 AMQP 及其實施 RabbitMQ 經常用於 非同步交互 服務之間。

在上下文中 IIOT 協議 AMQP 及其實施 RabbitMQ 用於伺服器(伺服器-伺服器)之間的資料交換。 也可以使用插件 MQTT 插件 RabbitMQ 這是協議的一個實現 MQTT 用於在低速、高延遲環境中在感測器和伺服器之間傳輸資料(支援的協定的完整列表列於 項目網站).

在下一篇文章中,我們將開始更詳細地了解交易所。

引用

來源: www.habr.com

添加評論