首先思考幾個問題:
- 什麼是消息隊列?消息隊列可以解決什麼問題?
- RabbitMQ可以做什麼?
- RabbitMQ可以實現消息的過期失效嗎?
- RabbitMQ可以實現延遲隊列嗎?
- RabbitMQ爲何消息堆積越多,性能越大幅度下降?
- RabbitMQ的可靠性體現在哪幾方面?分別是如何實現的?
什麼是消息隊列
提供了以鬆散耦合的靈活方式集成應用程序的一種機制,爲我們提供了基於存儲和轉發的應用程序之間的異步發送,用於異步、解耦、削峯。
- 生產者:投遞消息的一方
- 消費者:接收消息的一方
- 虛擬機:用於權限控制
- 隊列:消息的存儲容器
- 交換機:用於將消息路由到一個或多個隊列中
- 路由鍵:用於規定消息的路由規則,和交換機類型聯合使用實現消息的分發
- 信道:建立在連接上的虛擬鏈接,每條指令都通過信道來完成(這裏的連接爲TCP連接,多個信道使用同一個TCP連接,多路複用)
AMQP協議
RabbitMQ就是AMQP協議的Erlang實現,我們使用 php-amqplib 擴展和RabbitMQ服務端交互都是靠發送AMQP命令實現的。AMQP協議分爲三層:
- Module Layer:位於協議的最高層,定義供客戶端調用的命令,比如:聲明交換機(Exchange.Declare)、聲明隊列(Queue.Declare)、發送消息(Basic.Publish)
- Session Layer:位於中間層,主要負責將客戶端的命令發送給服務器,再將服務端的響應返回給客戶端,主要爲客戶端和服務器之間通信提供可靠的同步機制和錯誤處理
- Transport Layer:位於最底層,主要傳輸二進制數據
三種常用交換機原理和實現
RabbitMQ的消息有效期(TTL)和隊列有效期(expires)
RabbitMQ死信隊列原理並實現延遲隊列
通過存儲機制和隊列結構理解爲什麼RabbitMQ會隨着隊列堆積吞吐量降低
RabbitMQ消息隊列的可靠性