RabbitMQ基礎概念(消息、隊列、交換機)


1、消息的確認

  RabbitMQ需要對每一條發送的消息進行確認。消費者必須通過AMQP的basic.ack命令顯式地向RabbitMQ發送一個確認,或者在訂閱到隊列的時候就將auto_ack參數設置為true。當auto_ack為true時,一旦消費者接收消息,RabbitMQ會自動視其確認了消息。需要注意的是消費者對消息的確認和告訴生產者消息已經被接收了這兩件事毫不相關。以此,消費者通過確認命令告訴RabbitMQ它已經確認地接收到消息,同時RabbitMQ才能安全的把消息從隊列中刪除。

  如果消費者受到一條消息,然后確認之前從RabbitMQ斷開連接(或者從隊列上取消訂閱),RabbitMQ會認為這條消息沒有分發,然后重新分發給下一個訂閱的消費者。如果你的應用程序崩潰了,這樣做可以確保消息會被發送給另一個消費者處理。另一方面,如果應用程序有bug而忘記確認消息的話,RabbitMQ將不會給該消費者發送更多的消息。這是因為在上一條消息被確認之前,Rabbit會認為這個消費者沒有准備好接收下一條消息。利用這一點,可以防止rabbit持續不斷的消息涌向你的應用而導致過載。

  在收到消息后,如果想要拒接而不是確認收到消息,有兩種做法:

  (1)、把消費者從RabbitMQ服務器斷開連接,這會導致RabbitMQ自動重新把消息入隊並發送給另一個消費者,這樣做的好處是所有的RabbitMQ版本都支持。缺點是,這樣的連接、斷開連接的方式會額外增加RabbitMQ的負擔。

  (2)、如果使用的是RabbitMQ2.0.0或更高版本,可以使用AMQP的basic.reject命令。顧名思義:basic.reject允許消費者拒絕RabbitMQ發送消息。如果把reject命令的requeue設置為true的話,RabbitMQ會將消息重新發送給下一個訂閱者。如果設置為false的話,RabbitMQ會立即把消息從隊列中移除,而不會把它發送給新的消費者。

2、如何創建隊列

  RabbitMQ的消費者和生產者都能創建隊列,通過queue.declare方法來創建。如果消費者在同一信道上訂閱了一個隊列,則它不能在聲明隊列,必須先取消訂閱后,將信道置為傳輸模式。消費者訂閱和綁定時都需要隊列名,如果你創建隊列時沒有設置名字,rabbit會自動聲明一個隊列名稱,並在queue.declare命令中返回。

  如果你創建一個已經存在的隊列,那么rabbit將不做任何事情。rabbit的queue.declare可以檢測隊列是否存在,如果隊列存在,則返回成功,不存在則返回錯誤。

  由生產者還是由消費者創建隊列?答案是雙向的,原因是消費者不能訂閱不存在的隊列,而發布者不能發布到消息不存在的隊列,這有可能會造成消息的丟失。當然也可以通過其它方式來控制未發布的消息,而讓消費者一端負責創建隊列。

  隊列存在的意義:

  (1)、為消息提供住所,消息再次等待消費

  (2)、對負載均衡來說,隊列是絕佳的方案。只需附加一堆消費者,並讓RabbitMQ以循環的方式均勻地分配發來的消息

  (3)、隊列是RabbitMQ中消息的最后重點(除非消息進入黑洞)

3、交換器

  路由鍵:消息綁定到交換器上的規則。

  消息根據規則由交換機將消息投遞到相對應的隊列。如果路由消息不匹配任何綁定,消息將進入黑洞。

  交換機有四種:direct、fanout、topic和header。其中headers和direct交換器完全一致,但性能比較差,很少用。

  •   direct交換器:如果路由鍵匹配,消息就會被投遞到對應的隊列。

  

 

  服務器必須實現direct類型交換器,包括一個空白字符串命名的默認交換器。當聲明一個隊列時,它會自動綁定到默認交換器,並以隊列名稱作為路由鍵.

  •   fanout交換器:當發送一套消息到fanout交換器時,它會把消息投遞給所有附加在此交換器上的隊列。

 

  •   topic交換器:這類交換器可以使來自不同源頭的消息能夠達到同一隊列。

  

 

 

  備注:圖片取網上


免責聲明!

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



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