當前位置:
首頁 > 最新 > RabbitMQ實戰:插件介紹與系列總結

RabbitMQ實戰:插件介紹與系列總結

本系列是「RabbitMQ實戰:高效部署分散式消息隊列」書籍的總結筆記。

本篇是「RabbitMQ實戰」系列的最後一篇,主要介紹RabbitMQ插件,了解如何安裝和啟用它,列舉一些常用的插件,以及如何自定義。

在介紹之前,先總結下本系列的主要內容,把它們串起來。

系列總結

開篇時,這樣定義過RabbitMQ:它是一個開源的消息代理和隊列伺服器,可以通過基本協議在完全不同的應用之間共享數據,可以將作業排隊以便讓分散式服務進行處理。

這句話有幾個關鍵詞:消息代理、隊列伺服器、共享數據、分散式處理,分別來說明下,以加深理解。

消息代理:可以把RabbitMQ看成一個代理伺服器,一方面把消息生產者和消費者進行了解耦,更靈活;一方面,消息如何分發不用生產者考慮了,RabbitMQ提供多種分發策略。

隊列伺服器:消息最終是緩存在隊列中的,消費者從指定的隊列中消費消息,所以需要管理隊列和隊列中的消息。

共享數據:主要是說消息可以在不同應用間傳輸數據,通過AMQP協議進行規範,達到共享數據的目的。

分散式處理:多個消費者可以訂閱同一個隊列,這樣,多台機器就可以同時處理同一批數據,達到分散式處理的效果。

如果理解AMQP基本元素和消息模型,上面的概念會很好理解,有2篇文章重點介紹了這塊。

有些場景,對RabbitMQ可用性要求比較高,不容許有消息的丟失,需要了解RabbitMQ的可用性保障和實現。另外, 要能夠實時監控RabbitMQ的本身及各個組件的運行情況,有問題時及時報警,快速進行處理。

如果消息量和並發量比較高,需要根據不同的業務場景,在可用性和性能上進行平衡,以滿足業務的需要。

有些消息比較敏感,在傳輸的過程中要進行加密處理,通過ssl協議可以很好的解決。

最後,RabbitMQ提供了一些列的插件,為我們提供了很多有用的功能,比如Web管理界面插件、Shovel跨機房複製插件等,還允許我們自定義插件,擴展需要的功能。

插件介紹

當需要某些功能而伺服器沒有時,可以通過添加插件的方式來進行增強,可以從網路上找,也可以自己編寫插件。

用插件可以做什麼

先舉幾個例子,這些可以通過安裝插件來解決:

支持AMQP以外的協議;

不同的認證機制(LDAP、自定義資料庫);

消息複製;

新的交換器和路由演算法;

消息日誌和審計;

STOMP是一個簡單的基於文本的協議,用於在應用之間傳輸數據,它可以與ActiveMQ伺服器一起工作,如果你的代碼基於ActiveMQ和STOMP,但想使用RabbitMQ,就可以使用STOMP插件進行適配。

假設你的系統中所有的用戶管理均通過LDAP,想在RabbitMQ中使用它進行認證,可以使用rabbitmq-auth-backend-ldap插件進行集成。

LDAP是輕量目錄訪問協議,一個為查詢、瀏覽和搜索而優化的專業分散式資料庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件目錄一樣。目錄資料庫和關係資料庫不同,它有優異的讀性能,但寫性能差,並且沒有事務處理、回滾等複雜功能,不適於存儲修改頻繁的數據。所以目錄天生是用來查詢的,就好象它的名字一樣。

還可以自定義路由規則的交換器,下面會詳細介紹。

查找和管理插件

可以查看 官網頁面,查找到維護和實驗階段的插件。

再來看看插件的一些管理命令:

開啟插件,插件開啟後,需要重啟RabbitMQ伺服器:

禁用插件,禁用插件後,需要重啟RabbitMQ伺服器:

查看啟用的插件:

自定義插件

使用一個具體的例子來介紹自定義插件的開發,有這樣一個場景:使用RabbitMQ為聊天應用建模,該模型中有一個全局聊天室,所有的用戶都連接到這裡,每位用戶擁有自己的隊列,綁定到全局fanout交換器上。

每次發消息到該交換器上時,該消息會群發給所有綁定的隊列上,但如果有一個新的客戶端連接到這個聊天室,只會得到發送給聊天室的新消息,無法了解在加入之前會話的上下文。

如果能將最近的消息發送給新來的客戶,用戶體驗更更好點,可以通過自定義交換器實現這個功能。

插件開發環境和說明

RabbitMQ開發者制定了開發環境,即RabbitMQ Public Umbrella,通過把它從代碼庫中籤出,然後把自己的插件添加到項目結構中。

RabbitMQ是用Erlang語言開發的,Erlang源代碼是以模塊的方式組織起來的,模塊內的函數實現了應用程序需要提供的功能,插件只需要一個模塊來包含自定義交互器的實現。

在面向對象編程中,擁有介面的概念,在Erlang中有相同的概念:behavious(行為)。

Erlang behavior 確定了模塊需要實現和導出哪些函數,這樣調用該模塊的代碼才知道該如何使用它。

另一個不同的地方在於,Erlang沒有java那樣可見性概念,擁有的就是一個模塊導出列表,如果模塊實現了函數fun1、fun2和fun3,但只導出fun1的話,fun2和fun3將無法被外界調用。

另外,還有一個函數參數數量的概念,可以接受名字相同、參數數量不同的函數,因此behavious可以確定函數fun1/1和fun1/2是兩個不同的函數。

一般步驟

首先,確認要擴展的behavios,RabbitMQ暴露了一個交換器behavious,名為rabbit_exchange_type,它會明確需要實現哪些函數來成為一個符合要求的交換器。

然後,梳理實現思路:我們要實現的是一個加強版的fanout類型交換器,緩存最近20條消息,可以基於RabbitMQ上的fanout交換器進行實現:

需要緩存已路由的消息,每當交換器路由消息的時候,就將該消息存儲到某個資料庫中,該功能可在函數route/2中實現;

當隊列綁定到交換器時,需要把緩存的消息投遞過去,該功能可在函數add_binding/3中實現;

當交換器刪除的時候,需要丟棄緩存的消息,該功能可在函數delete/3中實現;

然後,實現交換器behavious,我沒有看相關實現細節,感興趣的可以查看實現代碼:傳送門。

最後,將交換器註冊到RabbitMQ,RabbitMQ維護了一個註冊表,用這張表來跟蹤所有的交換器類型及其模塊名稱,假設將消息發布到fanout交換器上,RabbitMQ會進入註冊表,檢查由哪個模塊來實現fanout交換器,找到後,會繼續調用該模塊的路由函數。

所以,需要找到一個方法將自定義交換器添加到註冊表中,RabbitMQ支持啟動步驟的概念,當伺服器啟動時會調用一系列步驟,可以在模塊中添加一個啟動步驟,RabbitMQ啟動是,會將自定義交換器添加到rabbit_registry註冊表中:

以上,自定義交換器就完成了,可以編寫程序進行驗證:

五一假期第一天,窩在家裡,羨慕朋友圈


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 情情說 的精彩文章:

深入淺出MyBatis:「映射器」全了解
單點登錄與許可權管理本質:許可權管理介紹

TAG:情情說 |