国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

這篇具有很好參考價值的文章主要介紹了【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

???????????????????????????????????????????????????????????????????? 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q ? 發(fā)布確認(rèn) \color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)} RabbitMQ教程】第三章——RabbitMQ?發(fā)布確認(rèn)?? ?????????


?? 仰望天空,妳我亦是行人.?
?? 個人主頁——微風(fēng)撞見云的博客??
?? 《數(shù)據(jù)結(jié)構(gòu)與算法》專欄的文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~??
?? 《Java學(xué)習(xí)筆記》專欄的文章是本人在Java學(xué)習(xí)中總結(jié)的一些知識點~ ??
?? 《每天一點小知識》專欄的文章可以豐富你的知識庫,滴水成河~ ??
?? 《RabbitMQ》專欄的文章是在學(xué)習(xí)尚硅谷課程時整理的筆記,方便復(fù)習(xí)鞏固~ ??
?? 希望本文能夠給讀者帶來一定的幫助~??文章粗淺,敬請批評指正!??



??RabbitMQ - 發(fā)布確認(rèn)

發(fā)布確認(rèn)邏輯

生產(chǎn)者將信道設(shè)置成 confirm 模式,一旦信道進入 confirm 模式,所有在該信道上面發(fā)布的消息都將會被指派一個唯一的 ID(從 1 開始),一旦消息被投遞到所有匹配的隊列之后,broker 就會發(fā)送一個確認(rèn)給生產(chǎn)者(包含消息的唯一 ID),這就使得生產(chǎn)者知道消息已經(jīng)正確到達目的隊列了,如果消息和隊列是可持久化的,那么確認(rèn)消息會在將消息寫入磁盤之后發(fā)出,broker 回傳給生產(chǎn)者的確認(rèn)消息中 delivery-tag 域包含了確認(rèn)消息的序列號,此外 broker 也可以設(shè)置basic.ack 的 multiple 域,表示到這個序列號之前的所有消息都已經(jīng)得到了處理。

confirm 模式最大的好處在于他是異步的,一旦發(fā)布一條消息,生產(chǎn)者應(yīng)用程序就可以在等信道返回確認(rèn)的同時繼續(xù)發(fā)送下一條消息,當(dāng)消息最終得到確認(rèn)之后,生產(chǎn)者應(yīng)用便可以通過回調(diào)方法來處理該確認(rèn)消息,如果RabbitMQ 因為自身內(nèi)部錯誤導(dǎo)致消息丟失,就會發(fā)送一條 nack 消息, 生產(chǎn)者應(yīng)用程序同樣可以在回調(diào)方法中處理該 nack 消息。

發(fā)布確認(rèn)的策略

開啟發(fā)布確認(rèn)的方法:

發(fā)布確認(rèn)默認(rèn)是沒有開啟的,如果要開啟需要調(diào)用方法 confirmSelect,每當(dāng)你要想使用發(fā)布確認(rèn),都需要在 channel 上調(diào)用該方法

//開啟發(fā)布確認(rèn)
channel.confirmSelect();

單個確認(rèn)發(fā)布

這是一種簡單的確認(rèn)方式,它是一種同步確認(rèn)發(fā)布的方式,也就是發(fā)布一個消息之后只有它被確認(rèn)發(fā)布,后續(xù)的消息才能繼續(xù)發(fā)布,waitForConfirmsOrDie(long) 這個方法只有在消息被確認(rèn)的時候才返回,如果在指定時間范圍內(nèi)這個消息沒有被確認(rèn)那么它將拋出異常。

這種確認(rèn)方式有一個最大的缺點就是:發(fā)布速度特別的慢,因為如果沒有確認(rèn)發(fā)布的消息就會阻塞所有后續(xù)消息的發(fā)布,這種方式最多提供每秒不超過數(shù)百條發(fā)布消息的吞吐量。當(dāng)然對于某些應(yīng)用程序來說這可能已經(jīng)足夠了。

/**
 * 單個發(fā)送
 */
public static void publishMessageIndividually() throws Exception {
    Channel channel = RabbitMqUtils.getChannel();
    //隊列聲明
    String queueName = UUID.randomUUID().toString();
    channel.queueDeclare(queueName, true, false, false, null);
    //開啟發(fā)布確認(rèn)
    channel.confirmSelect();

    long begin = System.currentTimeMillis();

    for (int i = 0; i < MESSAGE_COUNT; i++) {
        String message = i + "";
        channel.basicPublish("", queueName, null, message.getBytes());
        //服務(wù)端返回 false 或超時時間內(nèi)未返回,生產(chǎn)者可以消息重發(fā)
        boolean flag = channel.waitForConfirms();
        if (flag) {
            System.out.println("消息發(fā)送成功");
        }
    }

    long end = System.currentTimeMillis();
    System.out.println("發(fā)布" + MESSAGE_COUNT + "個單獨確認(rèn)消息,耗時" + (end - begin) + "ms");

}

批量確認(rèn)發(fā)布

上面那種方式非常慢,與單個等待確認(rèn)消息相比,先發(fā)布一批消息然后一起確認(rèn)可以極大地提高吞吐量,當(dāng)然這種方式的缺點就是:當(dāng)發(fā)生故障導(dǎo)致發(fā)布出現(xiàn)問題時,不知道是哪個消息出 問題了,我們必須將整個批處理保存在內(nèi)存中,以記錄重要的信息而后重新發(fā)布消息。當(dāng)然這種方案仍然是同步的,也一樣阻塞消息的發(fā)布。

/**
 * 批量
 */
public static void publishMessageBatch() throws Exception {
    Channel channel = RabbitMqUtils.getChannel();
    //隊列聲明
    String queueName = UUID.randomUUID().toString();
    channel.queueDeclare(queueName, true, false, false, null);
    //開啟發(fā)布確認(rèn)
    channel.confirmSelect();
    //批量確認(rèn)消息大小
    int batchSize = 100;
    //未確認(rèn)消息個數(shù)
    int outstandingMessageCount = 0;
    long begin = System.currentTimeMillis();

    for (int i = 0; i < MESSAGE_COUNT; i++) {
        String message = i + "";
        channel.basicPublish("", queueName, null, message.getBytes());
        outstandingMessageCount++;
        if (outstandingMessageCount == batchSize) {
            channel.waitForConfirms();
            outstandingMessageCount = 0;
        }
    }
    //為了確保還有剩余沒有確認(rèn)消息 再次確認(rèn)
    if (outstandingMessageCount > 0) {
        channel.waitForConfirms();
    }
    long end = System.currentTimeMillis();
    System.out.println("發(fā)布" + MESSAGE_COUNT + "個批量確認(rèn)消息,耗時" + (end - begin) + "ms");
}

異步確認(rèn)發(fā)布

異步確認(rèn)雖然編程邏輯比上兩個要復(fù)雜,但是性價比最高,無論是可靠性還是效率都沒得說, 他是利用回調(diào)函數(shù)來達到消息可靠性傳遞的,這個中間件也是通過函數(shù)回調(diào)來保證是否投遞成功, 下面就讓我們來詳細(xì)講解異步確認(rèn)是怎么實現(xiàn)的。
【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)
如何處理異步未確認(rèn)消息?

最好的解決的解決方案就是把未確認(rèn)的消息放到一個基于內(nèi)存的能被發(fā)布線程訪問的隊列, 比如說用 ConcurrentLinkedQueue 這個隊列在 confirm callbacks 與發(fā)布線程之間進行消息的傳遞。

以上 3 種發(fā)布確認(rèn)速度對比 :

  • 單獨發(fā)布消息

    同步等待確認(rèn),簡單,但吞吐量非常有限。

  • 批量發(fā)布消息

    批量同步等待確認(rèn),簡單,合理的吞吐量,一旦出現(xiàn)問題但很難推斷出是那條消息出現(xiàn)了問題。

  • 異步處理

    最佳性能和資源使用,在出現(xiàn)錯誤的情況下可以很好地控制,但是實現(xiàn)起來稍微難些


【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)


??結(jié)語

??初學(xué)一門技術(shù)時,總有些許的疑惑,別怕,它們是我們學(xué)習(xí)路上的點點繁星,幫助我們不斷成長。

??文章粗淺,希望對大家有幫助!

??下一篇 -->【RabbitMQ教程】第四章 —— RabbitMQ - 交換機文章來源地址http://www.zghlxwxcb.cn/news/detail-482892.html

到了這里,關(guān)于【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 第三章 decimal模塊

    第三章 decimal模塊

    decimal 模塊是 Python 提供的用于進行十進制定點和浮點運算的內(nèi)置模塊。使用它可以快速正確地進行十進制定點和浮點數(shù)的舍入運算,并且可以控制有效數(shù)字的個數(shù)。 使用 decimal 模塊主要是因為它與 Python 自帶的浮點數(shù)相比,有以下優(yōu)點 : 基于浮點模型,提供與數(shù)字計算相同

    2024年02月09日
    瀏覽(16)
  • 第三章:函數(shù)

    1.定義 設(shè) x , y 是兩個變量,x的變化范圍是實數(shù)集D,如果對于任何的x∈D,按照一定的法則都有唯一確定的y值與之對應(yīng)。則稱變量y是變量x的函數(shù)。記為 y = f(x) 。稱D為函數(shù)的 定義域 ,x為自變量,y為因變量。全體函數(shù)值的集合稱為函數(shù)y的 值域 。 2.函數(shù)的表示方法 1. 公式

    2024年02月01日
    瀏覽(29)
  • 第三章 選擇與循環(huán)

    第三章 選擇與循環(huán)

    程序員必備技能(思想):增量編寫法。每寫一部分代碼要及時運行看結(jié)果是否正確,對于復(fù)雜程序很重要。 常用的運算符優(yōu)先級: 邏輯非 ! 算術(shù)運算符 關(guān)系運算符 || 賦值運算符 單目運算符 邏輯非 ! 算術(shù)運算符 +、-、×、/、% 關(guān)系運算符 、、=、=、==、!= 邏輯運算符 、|

    2024年02月09日
    瀏覽(32)
  • 第三章-上網(wǎng)行為安全

    第三章-上網(wǎng)行為安全

    1)寬帶濫用 2)上網(wǎng)難監(jiān)管 3)信息泄露 4)網(wǎng)絡(luò)違法 5)安全威脅 1)上網(wǎng)行為三要素:用戶、流量、行為 2)功能需求 (AC的功能)-- 重點 用戶認(rèn)證 應(yīng)用控制 網(wǎng)頁過濾 行為審計 流量管理 應(yīng)用選路 互聯(lián)網(wǎng)上網(wǎng)行為管控 一體化網(wǎng)關(guān) 無線Wi-Fi管控營銷 無線防共享上網(wǎng) 全網(wǎng)上

    2024年01月23日
    瀏覽(32)
  • Linux第三章

    Linux第三章

    無論是Windows、MacOS、Linux均采用多用戶的管理模式進行權(quán)限管理。在Linux系統(tǒng)中,擁有最大權(quán)限的賬戶名為:root(超級管理員) root用戶擁有最大的系統(tǒng)操作權(quán)限,而普通用戶在許多地方的權(quán)限是受限的(普通用戶的權(quán)限,一般在其HOME目錄內(nèi)是不受限的,一旦出了HOME目錄,大

    2023年04月26日
    瀏覽(32)
  • 【計組】第三章練習(xí)

    【計組】第三章練習(xí)

    4、設(shè)有一個具有20位地址和32位字長的存儲器,問: (1)該存儲器能存儲多少個字節(jié)的信息? 220 × 32 bits = 1M × 4B = 4MB (220是2的20次方,上標(biāo)打不出來…) (2)如果存儲器由512K * 8位SRAM芯片組成,需要多少片? (1024K * 32)/(512K * 8) = 8 片 (3)需要多少位地址做芯片選擇? 存

    2024年02月04日
    瀏覽(55)
  • 第三章nginx詳解

    第三章nginx詳解

    特點: 1,穩(wěn)定性高。(沒有apache穩(wěn)定) 2,系統(tǒng)資源消耗地較低。(處理http請求的并發(fā)能力非常高,單臺物理服務(wù)器可以處理30000-50000個并發(fā)請求) 穩(wěn)定:一般在企業(yè)中,為了保持服務(wù)器的穩(wěn)定,并發(fā)量的設(shè)置在20000個左右。占用內(nèi)存2M左右。 nginx主要功能: 1,靜態(tài)文件服

    2024年02月12日
    瀏覽(23)
  • 第三章-運輸層

    第三章-運輸層

    運輸層協(xié)議為運行在不同主機上的進程之間提供邏輯通信,即從應(yīng)用程序角度看兩個主機好像直連一樣,實際可能相隔萬里 運輸層協(xié)議是在端系統(tǒng)上實現(xiàn)的,而不是路由器,為什么這么強調(diào),因為運輸層會將應(yīng)用報文劃分為較小的塊然后加上一個運輸層首部來生成運輸層報文

    2024年02月14日
    瀏覽(23)
  • 第三章 Elasticsearch簡介

    第三章 Elasticsearch簡介

    Elasticsearch (后稱為 ES )是一個天生支持分布式的搜索、聚合分析和存儲引擎。 搜索引擎 全文檢索引擎 分布式文檔系統(tǒng) 分布式數(shù)據(jù)庫 OLAP系統(tǒng) 分布式搜索中間件 不要去死背概念,概念應(yīng)該作為一種輔助的手段幫助我們?nèi)ダ斫庖豁椉夹g(shù)或知識,總之,等你真正會用了,你就

    2024年02月06日
    瀏覽(26)
  • 408數(shù)據(jù)結(jié)構(gòu)第三章

    特性后進先出 只允許在 一端 進行插入或刪除操作的線性表 每接觸一種新的數(shù)據(jù)結(jié)構(gòu)類型,都應(yīng)該分別從邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)和對數(shù)據(jù)的運算三方面入手 操作 initstack(s)初始化一個空棧s stackempty(s)判斷一個棧是否為空 push(s,x)進棧,未滿成為新棧頂 pop(s,x)出棧,非空彈出棧頂元

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包