RabbitMQ筆記

RabbitMQ筆記

  • rabbitmq中的角色可以抽象爲生產者,消費者,broker,以及兩條channel。三者之間通過channel進行交互。獲取channel需要登陸授權的Connector。生產者的channel需要配置交換器標籤和路由鍵標籤,路由鍵標籤最終代替queue標籤,之後Producer不再與queue直接接觸。而consumer的channel則需要配置好接收滑動窗口的大小,以及queue的名稱,還有消息處理handler。
  • RabbitMQ的queue不支持廣播消費(沒有topic概念,如需要,需要自己封裝),但是exchanger可以做到廣播消息給多個隊列。
  • RabbitMQ的架構依據是AMQP,所以最好有所瞭解。
  • Exchanger可以理解爲Producer的代理,它可以把消息投遞給一個或者多個隊列
  • BindingKey的官方解釋“the RoutingKey to use for Binding”, 從這句話可以理解爲綁定鍵就是用來綁定的路由鍵,也就是說路有鍵可以分爲未綁定的,和綁定過的(將exchanger和queue綁定)。之後producer就是面向bindingkey發佈消息。
  • topic交換器可以使得bindingkey支持模糊匹配的能力,從某種意義上看,topic類型是direct類型的增強版。
  • exchanger由四種類型的direct,topic,fanout,headers。其中fanout就是全量廣播,而topic支持模糊廣播,而direct可以支持確定性廣播。實際上用的最多的應該是topic,因爲它的自定義功能最強大。
  • channel實現了對tcp連接connector的複用。減少了網絡IO的開銷。它是AMQP提出的概念。
  • AMQP協議是基於TCP協議之上的應用層協議,它的握手和關閉頁TCP一樣是穩定可靠保守的通訊協議,性能也相對低。(比如一樣擁有滑動窗口機制)
  • AMQP協議中每次deliver都需要一個ack
#### 學習完AMQP的總結:
它是一個穩定可以靠的同學協議,它的角色是客戶端和broker服務器,它的操作對象是消息,隊列,交換器,連接,channel配置,事務,confirm機制配置。事務是同步耗性能的,confirm是異步高性能的。
  • channel是非線程安全的,但是它的isopen()方法是同步安全的,不過代價很大,它使用了syntronized關鍵字。

  • 交換器可以自由組合

  • 聲明隊列排他性是關鍵詞:首次創建的連接可見,關閉連接後自動刪除。

  • 自動刪除的定義是,至少被消費者連接過一次,之後不再有任何client連接,就會被刪除。

  • basic.consume是異步的比basic.get的吞吐量高很多。

  • 如果消費者沒有ack時掛掉,消息會馬上回到重新分發隊列,如果消費者連接沒有斷開,這個消息會一直處於待確認狀態。

  • basic.recover默認會重新分發消息給與之前不同的消費者處理。

  • mandatory 爲true,無隊列的消息會返回給producer的returnlistener處理。

  • 如果沒有隊列接受的消息,不想丟失,也不想返回,可以交給備胎交換器alternate-exchanger處理。

  • 備胎交換器的優先級 > mandatory > policy(rabbitmqctl set_policy )

  • 備胎交換器丟失的信息無任何異常日誌。

  • 可以給隊列所有方法設置相同的秒級過期時間TTL,過期的消息會定義被清除。也可以對單個消息設置毫秒級TTL,過期時延遲到即將投遞之前判斷是否過期拋棄(這種延遲刪除有點類似delayQueue的實現),如果兩種都設置了,則取最短的TTL爲準。

  • ttl爲0則表示消息馬上投遞給消費者,無消費者則給備胎exchanger或returnlistener或policy(過期)。

  • 隊列的生命也可以設置TTL,不過rabbitmq重啓後隊列過期時間重新計算。

  • 死信郵箱DLX可以接受被拒絕,過期,隊滿時拋棄的消息。是重要的優化工具。(TTL+DLX)

  • 可以利用TTL+DLX死信郵箱機制模擬實現延遲隊列,延遲隊列是調度器線程池的核心工具。但是死信隊列沒有優先級,所以不同TTL的消息要放到不同的隊列,又或者給隊列和消息設置優先級。

  • 生產者的可靠發佈,可以通過同步事務和異步確認來實現,如果異步確認採用waitforconfirm性能會退化接近同步事務。而較爲常見的手段有批量同步confirm,和異步批量confirm.

  • 如果rabbitmq服務器在接受消息時出現異常就會返回給客戶端basic.nack命令要求重發。

  • 在批量模式下,出現nack是很耗性能的事,因爲它會要求這批消息重發。這個模式下批量發生的條數是由rabbitmq服務器設置的。

  • 在rabbitmq當中,Qos的滑動窗口大小中的global參數的含義:false表示,對針對每個接下來創建的consumer設置窗口,true表示該針對channel設置窗口大小。

  • 任何一個環境都可能會導致消息亂序,要確保有序只有一個方案,就是要求消息到處理前重排序,獲取只處理期望得到的需要的消息,類似新增自定義滑動窗口。

  • Rabbitmq確保消息至少被消費一次的方法是:
    1.生產者採用confirm模式(或者事務模式)
    2.採用死信隊列和備胎交換器
    3.broker持久化
    4.consumer採用手動確認

  • 目前所有MQ都無法保證消息能去重,最多隻能確保不丟失。

  • 一臺服務器上的rabbitmq應用程序是支持多租戶vhost的,默認是/

  • connector共享和queue的輪訓是rabbitmq的性能瓶頸之一

CAP

網絡分區是否具備容錯性決定了可用性和一致性

一個網絡分區發生後如果具有容錯算法或者同步冗餘數據算法,比自動把故障節點剔除或者同步數據,那麼網絡在剔除或同步數據期間就不可用了(並非一直可用)。但是對外的服務數據一直保持着一致性,這種就是CP原則。

如果網絡發生分區後,繼續服務即一直可用,就會出現數據不一致。那麼網絡就是AP原則。

如果網絡發生分區後直接掛掉,那麼網絡從掛掉之前網絡一直可用且數據一致,那麼就是CA。這跟單機沒什麼區別了。

  • rabbit垃圾會緩存後集中回收,內存報警的閾值是40%,超過這個值就會禁止生產者加入消息,最壞的情況下垃圾回收會導致內存使用率達到80%
  • 硬盤的告警閾值爲可用剩下50M
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章