日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rabbitmq的相关知识

發布時間:2024/4/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rabbitmq的相关知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 如何確保消息正確地發送至RabbitMQ?

RabbitMQ使用發送方確認模式,確保消息正確地發送到RabbitMQ。

?

發送方確認模式:將信道設置成confirm模式(發送方確認模式),則所有在信道上發布的消息都會被指派一個唯一的ID。一旦消息被投遞到目的隊列后,或者消息被寫入磁盤后(可持久化的消息),信道會發送一個確認給生產者(包含消息唯一ID)。如果RabbitMQ發生內部錯誤從而導致消息丟失,會發送一條nack(not acknowledged,未確認)消息。

?

發送方確認模式是異步的,生產者應用程序在等待確認的同時,可以繼續發送消息。當確認消息到達生產者應用程序,生產者應用程序的回調方法就會被觸發來處理確認消息。

?

2. 如何確保消息接收方消費了消息?

接收方消息確認機制:消費者接收每一條消息后都必須進行確認(消息接收和消息確認是兩個不同操作)。只有消費者確認了消息,RabbitMQ才能安全地把消息從隊列中刪除。

?

這里并沒有用到超時機制,RabbitMQ僅通過Consumer的連接中斷來確認是否需要重新發送消息。也就是說,只要連接不中斷,RabbitMQ給了Consumer足夠長的時間來處理消息。

?

下面羅列幾種特殊情況:

  • 如果消費者接收到消息,在確認之前斷開了連接或取消訂閱,RabbitMQ會認為消息沒有被分發,然后重新分發給下一個訂閱的消費者。(可能存在消息重復消費的隱患,需要根據bizId去重)
  • 如果消費者接收到消息卻沒有確認消息,連接也未斷開,則RabbitMQ認為該消費者繁忙,將不會給該消費者分發更多的消息。

3. 如何避免消息重復投遞或重復消費?

在消息生產時,MQ內部針對每條生產者發送的消息生成一個inner-msg-id,作為去重和冪等的依據(消息投遞失敗并重傳),避免重復的消息進入隊列;在消息消費時,要求消息體中必須要有一個bizId(對于同一業務全局唯一,如支付ID、訂單ID、帖子ID等)作為去重和冪等的依據,避免同一條消息被重復消費。

?

4. 消息基于什么傳輸?

由于TCP連接的創建和銷毀開銷較大,且并發數受系統資源限制,會造成性能瓶頸。RabbitMQ使用信道的方式來傳輸數據。信道是建立在真實的TCP連接內的虛擬連接,且每條TCP連接上的信道數量沒有限制。

?

5. 消息如何分發?

若該隊列至少有一個消費者訂閱,消息將以循環(round-robin)的方式發送給消費者。每條消息只會分發給一個訂閱的消費者(前提是消費者能夠正常處理消息并進行確認)。

?

6. 消息怎么路由?

從概念上來說,消息路由必須有三部分:交換器、路由、綁定。生產者把消息發布到交換器上;綁定決定了消息如何從路由器路由到特定的隊列;消息最終到達隊列,并被消費者接收。

?

  • 消息發布到交換器時,消息將擁有一個路由鍵(routing key),在消息創建時設定。
  • 通過隊列路由鍵,可以把隊列綁定到交換器上。
  • 消息到達交換器后,RabbitMQ會將消息的路由鍵與隊列的路由鍵進行匹配(針對不同的交換器有不同的路由規則)。如果能夠匹配到隊列,則消息會投遞到相應隊列中;如果不能匹配到任何隊列,消息將進入 “黑洞”。
  • 常用的交換器主要分為一下三種:

    • direct:如果路由鍵完全匹配,消息就被投遞到相應的隊列
    • fanout:如果交換器收到消息,將會廣播到所有綁定的隊列上
    • topic:可以使來自不同源頭的消息能夠到達同一個隊列。 使用topic交換器時,可以使用通配符,比如:“*” 匹配特定位置的任意文本, “.” 把路由鍵分為了幾部分,“#” 匹配所有規則等。特別注意:發往topic交換器的消息不能隨意的設置選擇鍵(routing_key),必須是由"."隔開的一系列的標識符組成。

    ?

    7. 如何確保消息不丟失?

    消息持久化的前提是:將交換器/隊列的durable屬性設置為true,表示交換器/隊列是持久交換器/隊列,在服務器崩潰或重啟之后不需要重新創建交換器/隊列(交換器/隊列會自動創建)。

    ?

    如果消息想要從Rabbit崩潰中恢復,那么消息必須:

    • 在消息發布前,通過把它的 “投遞模式” 選項設置為2(持久)來把消息標記成持久化
    • 將消息發送到持久交換器
    • 消息到達持久隊列

    RabbitMQ確保持久性消息能從服務器重啟中恢復的方式是,將它們寫入磁盤上的一個持久化日志文件,當發布一條持久性消息到持久交換器上時,Rabbit會在消息提交到日志文件后才發送響應(如果消息路由到了非持久隊列,它會自動從持久化日志中移除)。一旦消費者從持久隊列中消費了一條持久化消息,RabbitMQ會在持久化日志中把這條消息標記為等待垃圾收集。如果持久化消息在被消費之前RabbitMQ重啟,那么Rabbit會自動重建交換器和隊列(以及綁定),并重播持久化日志文件中的消息到合適的隊列或者交換器上。

    ?

    ?

    8. 使用RabbitMQ有什么好處?

    • 應用解耦(系統拆分)
    • 異步處理(預約掛號業務處理成功后,異步發送短信、推送消息、日志記錄等)
    • 消息分發
    • 流量削峰
    • 消息緩沖
    • ......

    ?9. 其他

    RabbitMQ是?消息投遞服務,在應用程序和服務器之間扮演路由器的角色,而應用程序或服務器可以發送和接收包裹。其通信方式是一種 “發后即忘(fire-and-forget)” 的單向方式。

    ?

    其中消息包含兩部分內容:有效載荷(payload)和標簽(label)

    ?

    有效載荷是需要傳輸的數據,可以是任意內容。

    標簽描述了有效載荷,RabbitMQ會根據標簽的描述,把消息發送給感興趣的接收方。

    轉載于:https://www.cnblogs.com/linwenbin/p/10593403.html

    總結

    以上是生活随笔為你收集整理的rabbitmq的相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。