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

【RabbitMQ筆記08】消息隊(duì)列RabbitMQ之防止消息丟失的三種方式(生產(chǎn)者消息確認(rèn)、消費(fèi)者消息確認(rèn)、消息持久化)

這篇具有很好參考價(jià)值的文章主要介紹了【RabbitMQ筆記08】消息隊(duì)列RabbitMQ之防止消息丟失的三種方式(生產(chǎn)者消息確認(rèn)、消費(fèi)者消息確認(rèn)、消息持久化)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

這篇文章,主要介紹消息隊(duì)列RabbitMQ之防止消息丟失的三種方式(生產(chǎn)者消息確認(rèn)、消費(fèi)者消息確認(rèn)、消息持久化)。

目錄

一、防止消息丟失

1.1、消息確認(rèn)機(jī)制(生產(chǎn)者)

(1)生產(chǎn)者丟失消息

(2)生產(chǎn)者消息確認(rèn)機(jī)制

1.2、消息確認(rèn)機(jī)制(消費(fèi)者)

(1)消費(fèi)者丟失消息

(2)消費(fèi)者消息確認(rèn)機(jī)制

1.3、消息持久化(RabbitMQ)

(1)RabbitMQ丟失消息

(2)消息持久化機(jī)制


一、防止消息丟失

RabbitMQ消息隊(duì)列,在使用的時(shí)候,可能會(huì)存在消息丟失的情況,所謂的消息丟失就是生產(chǎn)者發(fā)送的消息沒(méi)辦法被消費(fèi)者正確的消費(fèi),消息隊(duì)列中導(dǎo)致消息丟失的地方有三個(gè),分別是:

  • 第一種情況:生產(chǎn)者發(fā)送的消息沒(méi)有正確的發(fā)送到RabbitMQ里面,導(dǎo)致發(fā)送的消息丟失。
  • 第二種情況:消費(fèi)者從RabbitMQ消費(fèi)消息時(shí)候,消費(fèi)失敗,但是RabbitMQ認(rèn)為消費(fèi)成功,從而刪除了消息。
  • 第三種情況:RabbitMQ中保存的消息還沒(méi)有被消費(fèi)者消費(fèi),此時(shí)RabbitMQ服務(wù)宕機(jī),導(dǎo)致內(nèi)存中的消息丟失。

1.1、消息確認(rèn)機(jī)制(生產(chǎn)者)

(1)生產(chǎn)者丟失消息

生產(chǎn)者丟失消息,是指:當(dāng)生產(chǎn)者發(fā)送消息給RabbitMQ的時(shí)候,此時(shí)消息發(fā)送失敗了,并且生產(chǎn)者又沒(méi)有重新發(fā)送這一條消息,所以這個(gè)時(shí)候,生產(chǎn)者這一條失敗的消息就丟失了。

既然是生產(chǎn)者發(fā)送消息失敗導(dǎo)致這一條消息丟失的,那么我們?cè)谔幚磉@個(gè)丟失消息問(wèn)題的時(shí)候,就可以這樣做:當(dāng)生產(chǎn)者消息發(fā)送失敗之后,可以讓生產(chǎn)者再次發(fā)送這一條消息,這里就有一個(gè)問(wèn)題啦,那就是生產(chǎn)者怎么知道消息有沒(méi)有發(fā)送成功???

RabbitMQ給我們提供了一個(gè)機(jī)制,即:發(fā)布確認(rèn)機(jī)制,大致思想是:當(dāng)生產(chǎn)者將消息發(fā)送到RabbitMQ之后,并且RabbitMQ正確接收到消息并將其放入Queue隊(duì)列里面時(shí),RabbitMQ會(huì)返回一個(gè)ACK標(biāo)識(shí)給生產(chǎn)者,生產(chǎn)者接收到ACK標(biāo)識(shí)就可以認(rèn)為消息發(fā)送成功啦;如果消息接收失敗,RabbitMQ會(huì)返回一個(gè)NACK標(biāo)識(shí),表示接收失敗。

消息隊(duì)列如何保證消息不丟失,【中間件筆記】,rabbitmq,消息中間件,RabbitMQ消息隊(duì)列,消息確認(rèn),消息持久化

(2)生產(chǎn)者消息確認(rèn)機(jī)制

生產(chǎn)者消息確認(rèn)機(jī)制,上一篇文章已經(jīng)介紹了(【RabbitMQ筆記07】消息隊(duì)列RabbitMQ七種模式之Publisher Confirms發(fā)布確認(rèn)模式),這里就不再重復(fù)。

1.2、消息確認(rèn)機(jī)制(消費(fèi)者)

(1)消費(fèi)者丟失消息

如果生產(chǎn)者已經(jīng)將消息正確的發(fā)送到RabbitMQ里面了,消費(fèi)者從Queue隊(duì)列里面獲取消息消費(fèi)時(shí)候,如果消費(fèi)失敗,那么此時(shí)就會(huì)導(dǎo)致這一條消息丟失,這是因?yàn)?,默認(rèn)情況下,RabbitMQ將消息分發(fā)給消費(fèi)者之后,消費(fèi)者接收到消息時(shí)候,就會(huì)返回一個(gè)ACK標(biāo)識(shí)給消息隊(duì)列RabbitMQ,此時(shí)RabbitMQ就會(huì)將這一條消息從Queue隊(duì)列里面刪除,但是這種情況下,消費(fèi)者是否正確將這條消息消費(fèi)了,RabbitMQ是不知道的,所以這就有可能導(dǎo)致丟失。

如何解決消費(fèi)者丟失消息???

  • 既然丟失消息是因?yàn)橄M(fèi)者消費(fèi)失敗,并且RabbitMQ把消息刪除了,那么我們就可以開(kāi)啟手動(dòng)確認(rèn)的方式來(lái)告訴RabbitMQ,消費(fèi)者是否正確的消費(fèi)消息,是否可以將消息從Queue隊(duì)列里面刪除了。

消息隊(duì)列如何保證消息不丟失,【中間件筆記】,rabbitmq,消息中間件,RabbitMQ消息隊(duì)列,消息確認(rèn),消息持久化

(2)消費(fèi)者消息確認(rèn)機(jī)制

  • 消費(fèi)者進(jìn)行消息確認(rèn),需要關(guān)閉自動(dòng)確認(rèn),將【basicConsume()】方法的第二個(gè)參數(shù)設(shè)置為【false】。
  • 消息成功消費(fèi)之后,主動(dòng)調(diào)用【basicAck()】方法,返回ACK標(biāo)識(shí)給RabbitMQ。
package com.rabbitmq.demo.dropmsg;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @version 1.0.0
 * @Date: 2023/2/25 16:30
 * @Copyright (C) ZhuYouBin
 * @Description: 消息消費(fèi)者
 */
public class Consumer {
    public static void main(String[] args) {
        // 1、創(chuàng)建連接工廠
        ConnectionFactory factory = new ConnectionFactory();
        // 2、設(shè)置連接的 RabbitMQ 服務(wù)地址
        factory.setHost("127.0.0.1"); // 默認(rèn)就是本機(jī)
        factory.setPort(5672); // 默認(rèn)就是 5672 端口
        // 3、獲取連接
        Connection connection = null; // 連接
        Channel channel = null; // 通道
        try {
            connection = factory.newConnection();
            // 4、獲取通道
            channel = connection.createChannel();
            // 5、聲明 Exchange,如果不存在,則會(huì)創(chuàng)建
            String exchangeName = "exchange_dropmsg_2023";
            channel.exchangeDeclare(exchangeName, "direct");
            // 6、指定需要操作的消息隊(duì)列,如果隊(duì)列不存在,則會(huì)創(chuàng)建
            String queueName = "queue_dropmsg_2023";
            channel.queueDeclare(queueName, false, false, false, null);
            // 7、綁定 Exchange 和 Queue, 接收 routingKey = "info" 的消息
            channel.queueBind(queueName, exchangeName, "key_2023");
            // 8、消費(fèi)消息
            Channel finalChannel = channel;
            DeliverCallback callback = new DeliverCallback() {
                public void handle(String s, Delivery delivery) throws IOException {
                    // 接收消息
                    System.out.println("這是接收的消息:" + new String(delivery.getBody()));
                    // TODO 消費(fèi)者正確消費(fèi)消息之后,主動(dòng)返回 ACK 標(biāo)識(shí)
                    finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(), true);
                }
            };
            // TODO 這第二個(gè)參數(shù)修改為 false,表示消費(fèi)者需要手動(dòng)發(fā)送 ACK 標(biāo)識(shí)給 RabbitMQ(默認(rèn)是true)
            channel.basicConsume(queueName, false, callback, i->{});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.3、消息持久化(RabbitMQ)

(1)RabbitMQ丟失消息

上面介紹了兩種丟失消息的情況,分別是生產(chǎn)者和消費(fèi)者丟失消息,還有一種丟失消息的情況,那就是RabbitMQ消息隊(duì)列將消息丟失了。假設(shè),現(xiàn)在存在這一種情況,生產(chǎn)者已經(jīng)正確將消息發(fā)送到RabbitMQ里面,正準(zhǔn)備將消息發(fā)送給消費(fèi)者的時(shí)候,此時(shí)RabbitMQ服務(wù)宕機(jī)了,導(dǎo)致RabbitMQ中的消息丟失了(默認(rèn)情況下,RabbitMQ是將消息保存在內(nèi)存中的),由于內(nèi)存中的數(shù)據(jù)斷電即失,所以這就導(dǎo)致消息丟失情況。

如何解決RabbitMQ出現(xiàn)的消息丟失問(wèn)題呢???

  • 既然RabbitMQ是將消息保存在內(nèi)存中的,那么為了避免消息丟失,可以將內(nèi)存中的消息保存到磁盤文件里面,這樣即使RabbitMQ宕機(jī)了,重新啟動(dòng)的時(shí)候也可以從磁盤文件里面讀取消息到內(nèi)存里面。

消息隊(duì)列如何保證消息不丟失,【中間件筆記】,rabbitmq,消息中間件,RabbitMQ消息隊(duì)列,消息確認(rèn),消息持久化

(2)消息持久化機(jī)制

  • 在調(diào)用【queueDeclare()】方法,創(chuàng)建Queue隊(duì)列的時(shí)候,設(shè)置第二個(gè)參數(shù)等于【true】,表示消息允許持久化。
  • 生產(chǎn)者調(diào)用【basicPublish()】方法發(fā)送消息的時(shí)候,設(shè)置消息屬性等于【MessageProperties.PERSISTENT_TEXT_PLAIN】,表示文本持久化。
// 第二個(gè)參數(shù)設(shè)置為true,表示開(kāi)啟持久化消息
channel.queueDeclare("Queue隊(duì)列名稱", true, false, false, null);

// 生產(chǎn)者發(fā)送消息時(shí)候,設(shè)置消息屬性是文本持久化
channel.basicPublish("Exchange交換機(jī)名稱", "Queue隊(duì)列名稱", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

到此,RabbitMQ消息隊(duì)列防止消息丟失的三種方式介紹完啦。

綜上,這篇文章結(jié)束了,主要介紹消息隊(duì)列RabbitMQ之防止消息丟失的三種方式(生產(chǎn)者消息確認(rèn)、消費(fèi)者消息確認(rèn)、消息持久化)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787896.html

到了這里,關(guān)于【RabbitMQ筆記08】消息隊(duì)列RabbitMQ之防止消息丟失的三種方式(生產(chǎn)者消息確認(rèn)、消費(fèi)者消息確認(rèn)、消息持久化)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【SpringBoot筆記29】SpringBoot集成RabbitMQ消息隊(duì)列

    這篇文章,主要介紹SpringBoot如何集成RabbitMQ消息隊(duì)列。 目錄 一、集成RabbitMQ 1.1、引入amqp依賴 1.2、添加連接信息 1.3、添加RabbitMQ配置類

    2023年04月08日
    瀏覽(18)
  • 防止消息丟失與消息重復(fù)——Kafka可靠性分析及優(yōu)化實(shí)踐

    防止消息丟失與消息重復(fù)——Kafka可靠性分析及優(yōu)化實(shí)踐

    上手第一關(guān),手把手教你安裝kafka與可視化工具kafka-eagle Kafka是什么,以及如何使用SpringBoot對(duì)接Kafka 架構(gòu)必備能力——kafka的選型對(duì)比及應(yīng)用場(chǎng)景 Kafka存取原理與實(shí)現(xiàn)分析,打破面試難關(guān) 在上一章內(nèi)容中,我們解析了Kafka在讀寫層面上的原理,介紹了很多Kafka在讀出與寫入時(shí)的

    2024年02月08日
    瀏覽(26)
  • Elasticsearch 8.X 防止 Mapping “爆炸”的三種方案

    Elasticsearch 8.X 防止 Mapping “爆炸”的三種方案

    Elasticsearch 映射如果不做特殊處理,默認(rèn) dynamic 為 true。dynamic 為 true 的確切含義是:根據(jù)導(dǎo)入的數(shù)據(jù)自定識(shí)別字段類型(有可能不精確),也就是說(shuō),可以提前不指定 Mapping,也能寫入數(shù)據(jù)。 但,這導(dǎo)致的問(wèn)題也非常明顯。Mapping 字段越多,會(huì)超過(guò)默認(rèn)字段數(shù)上限。超過(guò)上限

    2023年04月19日
    瀏覽(14)
  • 思科IOS防止遭受IP地址欺騙攻擊的三種辦法

    IP欺騙技術(shù)就是偽造某臺(tái)主機(jī)的IP 地址的技術(shù)。通過(guò)IP地址的偽裝使得某臺(tái)主機(jī)能夠偽裝另外的一臺(tái)主機(jī),而這臺(tái)主機(jī)往往具有某種特權(quán)或者被另外的主機(jī)所信任。在一次典型的地址欺騙嘗試中,攻擊者只是簡(jiǎn)單地偽裝源數(shù)據(jù)包使其看起來(lái)是內(nèi)自于內(nèi)部網(wǎng)絡(luò)。下面談一下怎樣利

    2024年02月07日
    瀏覽(27)
  • RabbitMQ學(xué)習(xí)筆記(消息發(fā)布確認(rèn),死信隊(duì)列,集群,交換機(jī),持久化,生產(chǎn)者、消費(fèi)者)

    RabbitMQ學(xué)習(xí)筆記(消息發(fā)布確認(rèn),死信隊(duì)列,集群,交換機(jī),持久化,生產(chǎn)者、消費(fèi)者)

    MQ(message queue):本質(zhì)上是個(gè)隊(duì)列,遵循FIFO原則,隊(duì)列中存放的是message,是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞消息。MQ提供“邏輯解耦+物理解耦”的消息通信服務(wù)。使用了MQ之后消息發(fā)送上游只需要依賴MQ,不需要依賴其它服務(wù)。 功能1:流量消峰 功能2:應(yīng)用解耦 功

    2024年02月07日
    瀏覽(118)
  • RabbitMQ 消息丟失的場(chǎng)景,如何保證消息不丟失?

    RabbitMQ 消息丟失的場(chǎng)景,如何保證消息不丟失?

    第一種:生產(chǎn)者弄丟了數(shù)據(jù)。生產(chǎn)者將數(shù)據(jù)發(fā)送到 RabbitMQ 的時(shí)候,可能數(shù)據(jù)就在半路給搞丟了,因?yàn)榫W(wǎng)絡(luò)問(wèn)題啥的,都有可能。 第二種:RabbitMQ 弄丟了數(shù)據(jù)。MQ還沒(méi)有持久化自己掛了 第三種:消費(fèi)端弄丟了數(shù)據(jù)。剛消費(fèi)到,還沒(méi)處理,結(jié)果進(jìn)程掛了,比如重啟了。 1.針對(duì)生

    2024年02月11日
    瀏覽(30)
  • RabbitMQ消息丟失的場(chǎng)景,MQ消息丟失解決方案

    RabbitMQ消息丟失的場(chǎng)景,MQ消息丟失解決方案

    第一種 : (生產(chǎn)者) 生產(chǎn)者弄丟了數(shù)據(jù)。生產(chǎn)者將數(shù)據(jù)發(fā)送到 RabbitMQ 的時(shí)候,可能數(shù)據(jù)就在半路給搞丟了,因?yàn)榫W(wǎng)絡(luò)問(wèn)題啥的,都有可能。 第二種 : (服務(wù)端) RabbitMQ 弄丟了數(shù)據(jù)。MQ還沒(méi)有持久化自己掛了 第三種 : (消費(fèi)者) 消費(fèi)端弄丟了數(shù)據(jù)。剛消費(fèi)到,還沒(méi)處理

    2024年02月08日
    瀏覽(29)
  • RabbitMQ防止消息重復(fù)消費(fèi)、保證異步消息的冪等性

    一、rabbitmq出現(xiàn)消息重復(fù)的場(chǎng)景 1、消費(fèi)成功,沒(méi)有進(jìn)行ack,這時(shí)?Broker?會(huì)重新發(fā)送 2、不確認(rèn)(unack)或 reject?之后,重新排隊(duì),Broker?會(huì)重新發(fā)送 3、消費(fèi)成功,ack時(shí)宕機(jī),沒(méi)有ack成功,消息由unack變?yōu)閞eady,Broker又重新發(fā)送 4、總的來(lái)說(shuō)就是 Broker?發(fā)送消息后,消費(fèi)端收到消息

    2024年02月13日
    瀏覽(23)
  • (五)RabbitMQ-進(jìn)階 死信隊(duì)列、延遲隊(duì)列、防丟失機(jī)制

    (五)RabbitMQ-進(jìn)階 死信隊(duì)列、延遲隊(duì)列、防丟失機(jī)制

    Lison dreamlison@163.com , v1.0.0 , 2023.06.23 概念 在MQ中,當(dāng)消息成為死信(Dead message)后,消息中間件可以 將其從當(dāng)前隊(duì)列發(fā)送到另一個(gè)隊(duì)列中,這個(gè)隊(duì)列就是死信隊(duì)列。而 在RabbitMQ中,由于有交換機(jī)的概念,實(shí)際是將死信發(fā)送給了死 信交換機(jī)(Dead Letter Exchange,簡(jiǎn)稱DLX)。死信交

    2024年02月15日
    瀏覽(25)
  • Rabbitmq消息不丟失

    Rabbitmq消息不丟失

    消息的不丟失,在MQ角度考慮,一般有三種途徑: 1,生產(chǎn)者不丟數(shù)據(jù) 2,MQ服務(wù)器不丟數(shù)據(jù) 3,消費(fèi)者不丟數(shù)據(jù) 保證消息不丟失有兩種實(shí)現(xiàn)方式: 1,開(kāi)啟事務(wù)模式 2,消息確認(rèn)模式 說(shuō)明:開(kāi)啟事務(wù)會(huì)大幅降低消息發(fā)送及接收效率,使用的相對(duì)較少,因此我們生產(chǎn)環(huán)境一般都采

    2024年02月13日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包