文章目錄
RabbitMQ是一個開源的消息代理和隊列服務器,用來通過普通協議在完全不同的應用之間共享數據,RabbitMQ是適用Erlang語言來編寫的,並且RabbitMQ是基於AMQP協議的。
1. 爲什麼選擇RabbitMQ
- 開源,性能優秀,穩定性好
- 提供可靠的消息投遞模式(confirm)、返回模式(return)
- 保證數據不丟失的前提做到高可用性、可靠性
- 集羣模式豐富:表達式配置、HA模式、鏡像隊列模式
- 與springAMQP完美結合,API豐富
1.1 RabbitMQ高性能的原因
- Erlang語言最初用戶交換機領域的架構模式,這樣使得RabbitMQ在Brocker之間進行數據交互的性能非常優秀
- Erlang有着和原生socket一樣的延遲
2. AMQP協議
2.1 什麼是AMQP協議
高級消息隊列協議(Advanced Message Queueing Protocol),是具有現代特徵的二進制協議,是一個是一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開發標準,爲面向消息的中間件設計
2.2 AMQP協議模型
3. RabbitMQ架構圖
4. RabbitMQ消息流轉過程
5. RabbitMQ消息從生產到消費的過程
- 生產者,消費者創建連接
- 生產者通過channel發送消息到exchange交換機
- 交換機通過綁定的routingKey路由到Queue隊列
- 消費者從queue取出消息進行消費
6. RabbitMQ 4種交換機Exchange類型
RabbitMQ交換機一共有4種類型:分別是Direct Exchange、Topic Exchange、Fanout Exchange、Headers Exchange
6.1 Direct Exchange
所有發送到Direct Exchange的消息被轉發到RouteKey中指定的Queue(Direct模式可以使用RabbitMQ自動的Exchange:Default Exchange,所以不需要將Exchange進行任何綁定bing操作,消息傳遞時,RouteKey必須完全匹配纔會被隊列接收即Exchange和RouteKey名稱一致,否則該消息會被拋棄)
6.2 Topic Exchange
所有發送到Topic Exchange的消息被轉發到所有關心RouteKey中指定Topic的Queue上。Exchange將RouteKey和某Topic進行模糊匹配,此時隊列需要綁定一個Topic(#:匹配一個或多個單詞;*:匹配一個詞)
6.3 Fanout Exchange
- 不處理路由鍵,只需要簡單的將隊列綁定到交換機上
- 發送到交換機的消息會被轉發到該交換機綁定的所有隊列上
- Fanout交換機轉發消息是最快的
6.4 Headers Exchanges
不處理路由鍵。而是根據發送的消息內容中的headers屬性進行匹配。在綁定Queue與Exchange時指定一組鍵值對;當消息發送到RabbitMQ時會取到該消息的headers與Exchange綁定時指定的鍵值對進行匹配;如果完全匹配則消息會路由到該隊列,否則不會路由到該隊列。headers屬性是一個鍵值對,可以是Hashtable,鍵值對的值可以是任何類型。而fanout,direct,topic 的路由鍵都需要要字符串形式的(一般不適用此種方法)