最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文總結(jié)RabbitMQ中的消息確認(rèn)機(jī)制

 更新時(shí)間:2023年06月20日 11:34:12   作者:土豆魚_  
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過(guò)程中,發(fā)送方發(fā)送消息后,接收方需要對(duì)消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文為大家整理了RabbitMQ中的消息確認(rèn)機(jī)制,需要的可以參考一下

RabbitMQ的消息確認(rèn)機(jī)制

RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過(guò)程中,發(fā)送方發(fā)送消息后,接收方需要對(duì)消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理。RabbitMQ的消息確認(rèn)機(jī)制分為兩種:

  • 生產(chǎn)者確認(rèn)機(jī)制:生產(chǎn)者發(fā)送消息后,需要等待RabbitMQ服務(wù)器的確認(rèn)消息,以確保消息已經(jīng)被成功地發(fā)送到RabbitMQ服務(wù)器。如果RabbitMQ服務(wù)器沒(méi)有收到消息或者消息發(fā)送失敗,生產(chǎn)者會(huì)收到一個(gè)確認(rèn)消息,從而可以進(jìn)行重發(fā)或者其他處理。
  • 消費(fèi)者確認(rèn)機(jī)制:消費(fèi)者接收到消息后,需要向RabbitMQ服務(wù)器發(fā)送確認(rèn)消息,以告訴服務(wù)器已經(jīng)成功地接收并處理了該消息。如果消費(fèi)者沒(méi)有發(fā)送確認(rèn)消息,RabbitMQ服務(wù)器會(huì)認(rèn)為該消息沒(méi)有被正確地處理,從而會(huì)將該消息重新發(fā)送給其他消費(fèi)者進(jìn)行處理。

在RabbitMQ中,消息確認(rèn)機(jī)制是通過(guò)ACK機(jī)制來(lái)實(shí)現(xiàn)的。ACK代表Acknowledgement,即確認(rèn)消息。當(dāng)消息發(fā)送方發(fā)送消息后,接收方需要向消息發(fā)送方發(fā)送ACK消息,以表示已經(jīng)成功地接收和處理了該消息。如果消息發(fā)送方?jīng)]有收到ACK消息,就會(huì)認(rèn)為該消息沒(méi)有被正確地處理,從而進(jìn)行重發(fā)或者其他處理。

總之,RabbitMQ的消息確認(rèn)機(jī)制可以保證消息的可靠性,從而提高系統(tǒng)的穩(wěn)定性和可靠性。

消息可靠抵達(dá)-ConfirmCallback

RabbitMQ的消息確認(rèn)機(jī)制確保了消息的可靠抵達(dá),其中ConfirmCallback是其中一種實(shí)現(xiàn)方式。

ConfirmCallback是一個(gè)回調(diào)函數(shù),用于在消息被確認(rèn)時(shí)進(jìn)行回調(diào),以確保消息已經(jīng)被正確地發(fā)送到RabbitMQ Broker并被處理。當(dāng)生產(chǎn)者發(fā)送消息時(shí),可以通過(guò)調(diào)用channel的confirmSelect()方法將channel設(shè)置為confirm模式,然后通過(guò)添加ConfirmCallback回調(diào)函數(shù)來(lái)處理消息確認(rèn)。

當(dāng)消息被發(fā)送到Broker后,如果Broker成功地將消息路由到目標(biāo)隊(duì)列,則會(huì)調(diào)用ConfirmCallback回調(diào)函數(shù)的handleAck()方法,表示消息已被確認(rèn)。如果Broker無(wú)法將消息路由到目標(biāo)隊(duì)列,則會(huì)調(diào)用handleNack()方法,表示消息未被確認(rèn)。

使用ConfirmCallback可以確保消息已經(jīng)被正確地發(fā)送到RabbitMQ Broker并被處理,從而避免了消息丟失或重復(fù)發(fā)送的情況。同時(shí),ConfirmCallback還可以在消息未被確認(rèn)時(shí)進(jìn)行重試或記錄日志等操作,以確保消息的可靠性和穩(wěn)定性。

ConfirmCallback使用說(shuō)明: 在配置文件中配置:spring.rabbitmq.publisher-confirms=true 在創(chuàng)建 connectionFactory 的時(shí)候設(shè)置 PublisherConfirms(true) 選項(xiàng),開啟 confirmcallback 。 CorrelationData:用來(lái)表示當(dāng)前消息唯一性。 消息只要被 broker 接收到就會(huì)執(zhí)行 confirmCallback,如果是 cluster 模式,需要所有broker 接收到才會(huì)調(diào)用 confirmCallback。 被 broker 接收到只能表示 message 已經(jīng)到達(dá)服務(wù)器,并不能保證消息一定會(huì)被投遞 到目標(biāo) queue 里。所以需要用到接下來(lái)的 returnCallback 。

消息可靠抵達(dá)-ReturnCallback

RabbitMQ的ReturnCallback機(jī)制是為了解決消息無(wú)法路由到指定隊(duì)列的問(wèn)題。當(dāng)發(fā)送的消息無(wú)法被路由到指定隊(duì)列時(shí),RabbitMQ會(huì)將消息返回給生產(chǎn)者,這時(shí)候如果生產(chǎn)者設(shè)置了ReturnCallback回調(diào)函數(shù),就可以在回調(diào)函數(shù)中處理這種情況。

ReturnCallback機(jī)制的使用場(chǎng)景一般是在消息發(fā)送時(shí),指定了mandatory參數(shù)為true,表示如果消息無(wú)法被路由到指定隊(duì)列,則將消息返回給生產(chǎn)者。如果mandatory參數(shù)為false,則消息會(huì)被直接丟棄。

當(dāng)生產(chǎn)者設(shè)置了ReturnCallback回調(diào)函數(shù)后,RabbitMQ在將消息返回給生產(chǎn)者時(shí),會(huì)觸發(fā)該回調(diào)函數(shù)。在ReturnCallback回調(diào)函數(shù)中,可以處理消息無(wú)法路由的情況,例如重發(fā)消息、記錄日志等。

下面是一個(gè)使用ReturnCallback機(jī)制的示例代碼:

channel.addReturnListener(new ReturnCallback() {
    @Override
    public void handle(ReturnedMessage returnedMessage) {
        String message = new String(returnedMessage.getBody());
        System.out.println("Message returned: " + message);
    }
});
channel.basicPublish(exchangeName, routingKey, true, null, message.getBytes());

在上面的代碼中,我們通過(guò)addReturnListener方法設(shè)置了ReturnCallback回調(diào)函數(shù),當(dāng)消息無(wú)法路由到指定隊(duì)列時(shí),會(huì)觸發(fā)該回調(diào)函數(shù)。在回調(diào)函數(shù)中,我們將返回的消息打印出來(lái),以便處理。

需要注意的是,ReturnCallback機(jī)制只有在消息被發(fā)送到交換機(jī)后,才會(huì)觸發(fā)。如果消息發(fā)送的交換機(jī)不存在,或者路由鍵不符合任何綁定規(guī)則,消息會(huì)被直接丟棄,不會(huì)觸發(fā)ReturnCallback回調(diào)函數(shù)。

在配置文件中配置:

spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true

confrim 模式只能保證消息到達(dá) broker,不能保證消息準(zhǔn)確投遞到目標(biāo) queue 里。在有 些業(yè)務(wù)場(chǎng)景下,我們需要保證消息一定要投遞到目標(biāo) queue 里,此時(shí)就需要用到return 退回模式。

這樣如果未能投遞到目標(biāo) queue 里將調(diào)用 returnCallback ,可以記錄下詳細(xì)到投遞數(shù)據(jù),定期的巡檢或者自動(dòng)糾錯(cuò)都需要這些數(shù)據(jù)

RabbitMQ自動(dòng)確認(rèn)和手動(dòng)確認(rèn)

RabbitMQ消息確認(rèn)機(jī)制是一種保證消息可靠抵達(dá)的機(jī)制。在RabbitMQ中,消息確認(rèn)機(jī)制分為兩種模式:自動(dòng)確認(rèn)模式和手動(dòng)確認(rèn)模式

在自動(dòng)確認(rèn)模式下,當(dāng)消費(fèi)者收到消息并將其處理完畢后,RabbitMQ會(huì)自動(dòng)將該消息標(biāo)記為已確認(rèn),然后將其從隊(duì)列中刪除。這種模式比較簡(jiǎn)單,但是存在消息丟失的風(fēng)險(xiǎn),因?yàn)槿绻M(fèi)者在處理消息的過(guò)程中出現(xiàn)異常,消息就會(huì)被丟失

在手動(dòng)確認(rèn)模式下,當(dāng)消費(fèi)者收到消息并將其處理完畢后,需要向RabbitMQ發(fā)送一個(gè)確認(rèn)消息,告訴RabbitMQ該消息已經(jīng)被處理完畢,可以從隊(duì)列中刪除。如果消費(fèi)者在處理消息的過(guò)程中出現(xiàn)異常,可以選擇不發(fā)送確認(rèn)消息,這樣消息就不會(huì)被從隊(duì)列中刪除,可以重新被其他消費(fèi)者獲取。

手動(dòng)確認(rèn)模式可以保證消息不會(huì)被丟失,但是需要消費(fèi)者編寫額外的代碼來(lái)處理確認(rèn)消息的發(fā)送。此外,手動(dòng)確認(rèn)模式還可以設(shè)置確認(rèn)模式為批量確認(rèn)模式,即一次性確認(rèn)多個(gè)消息,可以提高消息處理的效率。

總結(jié):

1.自動(dòng)ACK模式

在自動(dòng)ACK模式下,消息一旦被消費(fèi)者接收到,就會(huì)自動(dòng)被確認(rèn)。這種模式下,消息一旦被發(fā)送到消費(fèi)者,就會(huì)從隊(duì)列中刪除,無(wú)論消費(fèi)者是否已經(jīng)成功消費(fèi)該消息。

2.手動(dòng)ACK模式

在手動(dòng)ACK模式下,消費(fèi)者必須手動(dòng)發(fā)送ACK消息來(lái)確認(rèn)消息已經(jīng)被成功消費(fèi)。如果消費(fèi)者沒(méi)有發(fā)送ACK消息,RabbitMQ服務(wù)器就會(huì)認(rèn)為該消息還沒(méi)有被消費(fèi),會(huì)將該消息重新發(fā)送給其他消費(fèi)者。這種模式下,消費(fèi)者可以選擇性地確認(rèn)消息,只有當(dāng)消費(fèi)者成功消費(fèi)一條消息并確認(rèn)后,該消息才會(huì)從隊(duì)列中刪除。

手動(dòng)ACK模式可以保證消息的可靠性,但是需要消費(fèi)者在處理消息時(shí)進(jìn)行額外的處理,消費(fèi)者需要在處理消息后發(fā)送ACK消息,否則消息會(huì)被重新發(fā)送。

在 RabbitMQ 中,消費(fèi)者可以通過(guò)設(shè)置 channel.basicAck(deliveryTag, multiple) 方法來(lái)發(fā)送 ack 消息。其中,deliveryTag 表示消息的唯一標(biāo)識(shí)符,multiple 表示是否批量確認(rèn)。如果 multiple 為 true,表示要確認(rèn)該 deliveryTag 及其之前的所有消息;如果 multiple 為 false,表示只確認(rèn)該 deliveryTag 指定的一條消息。

需要注意的是,如果消費(fèi)者在處理消息時(shí)發(fā)生了異常,消息并沒(méi)有被成功處理,那么不應(yīng)該發(fā)送 ack 消息,而應(yīng)該將消息重新放回隊(duì)列中,讓其他消費(fèi)者來(lái)處理。

RabbitMQ處理消息方法

RabbitMQ提供了一些基本的方法來(lái)處理消息,這些方法包括:

  • basic.publish: 發(fā)布消息到指定的交換機(jī)上。
  • basic.consume: 消費(fèi)消息,啟動(dòng)一個(gè)消費(fèi)者來(lái)監(jiān)聽指定隊(duì)列上的消息。
  • basic.ack: 確認(rèn)消息已經(jīng)被消費(fèi),告訴RabbitMQ可以刪除該消息。
  • basic.nack: 否認(rèn)消息已經(jīng)被消費(fèi),告訴RabbitMQ需要重新發(fā)送該消息。
  • basic.reject: 拒絕消息,告訴RabbitMQ不需要再次發(fā)送該消息。
  • basic.get: 獲取指定隊(duì)列上的一條消息。
  • basic.cancel: 取消消費(fèi)者的消費(fèi),停止監(jiān)聽指定隊(duì)列上的消息。

這些方法都是基于AMQP協(xié)議定義的,可以使用RabbitMQ提供的客戶端庫(kù)或者自己實(shí)現(xiàn)AMQP協(xié)議來(lái)調(diào)用這些方法。

到此這篇關(guān)于一文總結(jié)RabbitMQ中的消息確認(rèn)機(jī)制的文章就介紹到這了,更多相關(guān)RabbitMQ消息確認(rèn)機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示

    SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示

    本文詳細(xì)介紹了SpringMVC中@RequestMapping注解的用法,包括其映射請(qǐng)求、參數(shù)配置、Ant風(fēng)格URL、與@PathVariable結(jié)合使用,以及如何通過(guò)@Controller實(shí)現(xiàn)POJO作為控制器,強(qiáng)調(diào)掌握該注解對(duì)SpringMVC開發(fā)的重要性,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Java?DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解

    Java?DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解

    DelayQueue是一個(gè)無(wú)界的BlockingQueue的實(shí)現(xiàn)類,用于放置實(shí)現(xiàn)了Delayed接口的對(duì)象,其中的對(duì)象只能在其到期時(shí)才能從隊(duì)列中取走。本文就來(lái)利用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù),感興趣的可以了解一下
    2022-09-09
  • 分析java中全面的單例模式多種實(shí)現(xiàn)方式

    分析java中全面的單例模式多種實(shí)現(xiàn)方式

    單例模式是一種常用的軟件設(shè)計(jì)模式,單例對(duì)象的類只能允許一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,有利于協(xié)調(diào)系統(tǒng)整體的行為。比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中。本文將介紹它的思想和多種實(shí)現(xiàn)方式
    2021-06-06
  • 微信隨機(jī)生成紅包金額算法java版

    微信隨機(jī)生成紅包金額算法java版

    這篇文章主要為大家詳細(xì)介紹了java和php版的微信隨機(jī)生成紅包金額算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • SpringCloud修改OpenFeign的負(fù)載均衡算法的實(shí)現(xiàn)步驟

    SpringCloud修改OpenFeign的負(fù)載均衡算法的實(shí)現(xiàn)步驟

    本文主要介紹了SpringCloud修改OpenFeign的負(fù)載均衡算法的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • 使用Java和高德地圖API將經(jīng)緯度轉(zhuǎn)換為地理位置信息的步驟

    使用Java和高德地圖API將經(jīng)緯度轉(zhuǎn)換為地理位置信息的步驟

    這篇文章詳細(xì)介紹了如何將GPS坐標(biāo)轉(zhuǎn)換為人類可讀的地理位置,介紹了環(huán)境準(zhǔn)備、代碼實(shí)現(xiàn)、異常處理及優(yōu)化步驟,首先創(chuàng)建LocationFinder類,實(shí)現(xiàn)getLocationFromCoordinates方法,利用高德逆地理編碼API轉(zhuǎn)換坐標(biāo),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • 徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題(推薦)

    徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題(推薦)

    這篇文章主要介紹了徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題,本文給大家?guī)?lái)問(wèn)題原因分析通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • Java自定義異常類詳解及示例說(shuō)明

    Java自定義異常類詳解及示例說(shuō)明

    本文詳細(xì)講述了Java中自定義異常類的原理、使用場(chǎng)景及創(chuàng)建方法,包括為何使用自定義異常、如何創(chuàng)建和實(shí)例化,以及文件處理、用戶認(rèn)證和業(yè)務(wù)邏輯中的應(yīng)用示例,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑

    SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑

    這篇文章主要介紹了SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringCloud如何解決服務(wù)之間的通信問(wèn)題

    SpringCloud如何解決服務(wù)之間的通信問(wèn)題

    本文主要介紹了SpringCloud如何解決服務(wù)之間的通信問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評(píng)論

尉氏县| 通江县| 龙口市| 绥宁县| 桓仁| 尼玛县| 龙川县| 万源市| 贡山| 鸡东县| 利川市| 德惠市| 民权县| 光山县| 钟祥市| 聂荣县| 湟源县| 尖扎县| 大荔县| 临沂市| 开原市| 华阴市| 大丰市| 平山县| 广宗县| 安宁市| 临颍县| 长白| 永城市| 虹口区| 龙胜| 桐梓县| 石城县| 赤峰市| 科技| 洛隆县| 凌海市| 襄樊市| 金坛市| 舒兰市| 乐山市|