深入解讀RabbitMQ工作原理


RabbitMQ簡介
  在介紹RabbitMQ之前首先要介紹一下MQ,MQ是什么?MQ全稱是Message Queue,可以理解為消息隊列的意思。
  RabbitMQ是一個實現了AMQP(Advanced Message Queuing Protocol)高級消息隊列協議的消息隊列服務,用Erlang語言的。

為什么選擇RabbitMQ

   現在的市面上有很多MQ可以選擇,比如ActiveMQ、ZeroMQ、Appche Qpid,那問題來了為什么要選擇RabbitMQ?

    1.除了Qpid,RabbitMQ是唯一一個實現了AMQP標准的消息服務器;

    2.可靠性,RabbitMQ的持久化支持,保證了消息的穩定性;

    3.高並發,RabbitMQ使用了Erlang開發語言,Erlang是為電話交換機開發的語言,天生自帶高並發光環,和高可用特性;

    4.集群部署簡單,正是應為Erlang使得RabbitMQ集群部署變的超級簡單;

    5.社區活躍度高,根據網上資料來看,RabbitMQ也是首選;

工作機制

    生產者、消費者和代理

    在了解消息通訊之前首先要了解3個概念:生產者、消費者和代理。

    生產者:消息的創建者,負責創建和推送數據到消息服務器;

    消費者:消息的接收方,用於處理數據和確認消息;

    代理:就是RabbitMQ本身,用於扮演“快遞”的角色,本身不生產消息,只是扮演“快遞”的角色。

消息發送原理

    首先你必須連接到Rabbit才能發布和消費消息,那怎么連接和發送消息的呢?

    你的應用程序和Rabbit Server之間會創建一個TCP連接,一旦TCP打開,並通過了認證,認證就是你試圖連接Rabbit之前發送的Rabbit服務器連接信息和用戶名和密碼,有點像程序連接數據庫,使用Java有兩種連接認證的方式,后面代碼會詳細介紹,一旦認證通過你的應用程序和Rabbit就創建了一條AMQP信道(Channel)。

信道是創建在“真實”TCP上的虛擬連接,AMQP命令都是通過信道發送出去的,每個信道都會有一個唯一的ID,不論是發布消息,訂閱隊列或者介紹消息都是通過信道完成的。

為什么不通過TCP直接發送命令?

  對於操作系統來說創建和銷毀TCP會話是非常昂貴的開銷,假設高峰期每秒有成千上萬條連接,每個連接都要創建一條TCP會話,這就造成了TCP連接的巨大浪費,而且操作系統 每秒能創建的TCP也是有限的,因此很快就會遇到系統瓶頸。

如果我們每個請求都使用一條TCP連接,既滿足了性能的需要,又能確保每個連接的私密性,這就是引入信道概念的原因。

 

 你必須知道的RabbitMQ

  想要真正的了解Rabbit有些名詞是你必須知道的。

    包括:ConnectionFactory(連接管理器)、Channel(信道)、Exchange(交換器)、Queue(隊列)、RoutingKey(路由鍵)、BindingKey(綁定鍵)。

      ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器,程序代碼中使用;

      Channel(信道):消息推送使用的通道;

      Exchange(交換器):用於接受、分配消息;

      Queue(隊列):用於存儲生產者的消息;

      RoutingKey(路由鍵):用於把生成者的數據分配到交換器上;

      BindingKey(綁定鍵):用於把交換器的消息綁定到隊列上;

      看到上面的解釋,最難理解的路由鍵和綁定鍵了,那么他們具體怎么發揮作用的,請看下圖:

 

 消息持久化

  Rabbit隊列和交換器有一個不可告人的秘密,就是默認情況下重啟服務器會導致消息丟失,那么怎么保證Rabbit在重啟的時候不丟失呢?答案就是消息持久化。

當你把消息發送到Rabbit服務器的時候,你需要選擇你是否要進行持久化,但這並不能保證Rabbit能從崩潰中恢復,想要Rabbit消息能恢復必須滿足3個條件:

  1. 投遞消息的時候durable設置為true,消息持久化;

  2. 消息已經到達持久化交換器上;

  3. 消息已經到達持久化的隊列;

持久化工作原理

Rabbit會將你的持久化消息寫入磁盤上的持久化日志文件,等消息被消費之后,Rabbit會把這條消息標識為等待垃圾回收。

持久化的缺點

消息持久化的優點顯而易見,但缺點也很明顯,那就是性能,因為要寫入硬盤要比寫入內存性能較低很多,從而降低了服務器的吞吐量,盡管使用SSD硬盤可以使事情得到緩解,但他仍然吸干了Rabbit的性能,當消息成千上萬條要寫入磁盤的時候,性能是很低的。

所以使用者要根據自己的情況,選擇適合自己的方式。

虛擬主機

  每個Rabbit都能創建很多vhost,我們稱之為虛擬主機,每個虛擬主機其實都是mini版的RabbitMQ,擁有自己的隊列,交換器和綁定,擁有自己的權限機制。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM