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

RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題

這篇具有很好參考價(jià)值的文章主要介紹了RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


接上一篇:RabbitMQ(三) | 死信交換機(jī)、死信隊(duì)列、TTL、延遲隊(duì)列(安裝DelayExchange插件)


1.消息堆積問題

當(dāng)生產(chǎn)者發(fā)送消息的速度超過了消費(fèi)者處理消息的速度,就會(huì)導(dǎo)致隊(duì)列中的消息堆積,直到隊(duì)列存儲(chǔ)消息達(dá)到上限。之后發(fā)送的消息就會(huì)成為死信,可能會(huì)被丟棄,這就是消息堆積問題。
RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題

解決消息堆積有兩種思路:

  • 增加更多消費(fèi)者,提高消費(fèi)速度。也就是我們之前說的work queue模式
  • 給消費(fèi)者開啟多線程,提高消費(fèi)速度
  • 擴(kuò)大隊(duì)列容積,提高堆積上限

要提升隊(duì)列容積,把消息保存在內(nèi)存中顯然是不行的。


2.惰性隊(duì)列

從RabbitMQ的3.6.0版本開始,就增加了Lazy Queues的概念,也就是惰性隊(duì)列。惰性隊(duì)列的特征如下:

  • 接收到消息后直接存入磁盤而非內(nèi)存
  • 消費(fèi)者要消費(fèi)消息時(shí)才會(huì)從磁盤中讀取并加載到內(nèi)存
  • 支持?jǐn)?shù)百萬條的消息存儲(chǔ)

2.1.基于命令行設(shè)置lazy-queue

而要設(shè)置一個(gè)隊(duì)列為惰性隊(duì)列,只需要在聲明隊(duì)列時(shí),指定x-queue-mode屬性為lazy即可??梢酝ㄟ^命令行將一個(gè)運(yùn)行中的隊(duì)列修改為惰性隊(duì)列:

rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues  

命令解讀:

  • rabbitmqctl :RabbitMQ的命令行工具
  • set_policy :添加一個(gè)策略
  • Lazy :策略名稱,可以自定義
  • "^lazy-queue$" :用正則表達(dá)式匹配隊(duì)列的名字
  • '{"queue-mode":"lazy"}' :設(shè)置隊(duì)列模式為lazy模式
  • --apply-to queues :策略的作用對(duì)象,是所有的隊(duì)列

2.2.基于@Bean聲明lazy-queue

RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題

在consumer服務(wù)端的新增惰性隊(duì)列配置類LazyConfig:

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/** 惰性隊(duì)列配置 */
@Configuration
public class LazyConfig {

    /** 惰性隊(duì)列 - 增加了.lazy()屬性 */
    @Bean
    public Queue lazyQueue() {
        return QueueBuilder.durable("lazy.queue")
                .lazy() // 開啟x-queue-mode為lazy
                .build();
    }

    /** 正常隊(duì)列 */
    @Bean
    public Queue normalQueue() {
        return QueueBuilder.durable("normal.queue")
                .build();
    }
}

2.3.基于@RabbitListener聲明LazyQueue

RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題
在consumer服務(wù)端的消息監(jiān)聽類中新增方法

@RabbitListener(queuesToDeclare = @Queue(
        name = "lazy.queue",
        durable = "true",
        arguments = @Argument(name = "x-queue-mode", value = "lazy")
))
public void listenLazyQueue(String msg) {
    log.info("接收到 lazy.queue 的消息:{}", msg);
}

2.4.發(fā)送消息

這里對(duì)正常隊(duì)列和惰性隊(duì)列進(jìn)行十萬條數(shù)據(jù)的測(cè)試,啟動(dòng)consumer服務(wù),在publisher服務(wù)的SpringAmqpTest類中新增下列兩個(gè)方法:

/** 測(cè)試惰性隊(duì)列 */
@Test
public void testLazyQueue() throws InterruptedException {
    // 模擬發(fā)送十萬條數(shù)據(jù)
    long b = System.nanoTime();
    for (int i = 0; i < 1000000; i++) {
        // 1.準(zhǔn)備消息
        Message message = MessageBuilder
                .withBody("hello, LazyQueue".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT) // 改成非持久化,可以看一下LazyQueue的效果
                .build();
        // 2.發(fā)送消息
        rabbitTemplate.convertAndSend("lazy.queue", message);
    }
    long e = System.nanoTime();
    System.out.println(e - b);
}

/** 測(cè)試正常隊(duì)列 */
@Test
public void testNormalQueue() throws InterruptedException {
    // 模擬發(fā)送十萬條數(shù)據(jù)
    long b = System.nanoTime();
    for (int i = 0; i < 1000000; i++) {
        // 1.準(zhǔn)備消息
        Message message = MessageBuilder
                .withBody("hello, Spring".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT) // 改成非持久化,可以看一下正常隊(duì)列的效果
                .build();
        // 2.發(fā)送消息
        rabbitTemplate.convertAndSend("normal.queue", message);
    }
    long e = System.nanoTime();
    System.out.println(e - b);
}

RabbitMQ控制臺(tái)隊(duì)列的數(shù)據(jù)變化:

初始:
RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題

運(yùn)行兩個(gè)生產(chǎn)者方法后,看一下兩個(gè)隊(duì)列總覽

RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題


惰性隊(duì)列數(shù)據(jù)變化

全部一進(jìn)來就會(huì)存儲(chǔ)到磁盤,內(nèi)存中只有需要消費(fèi)的:
RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題


正常隊(duì)列數(shù)據(jù)變化

而正常隊(duì)列都在內(nèi)存中(這里是沒有開啟持久化的情況):
RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題


3.總結(jié)

消息堆積問題的解決方案?

  • 隊(duì)列上綁定多個(gè)消費(fèi)者,提高消費(fèi)速度
  • 給消費(fèi)者開啟多線程,提高消費(fèi)速度
  • 使用惰性隊(duì)列,可以在mq中保存更多消息

惰性隊(duì)列的優(yōu)點(diǎn)有哪些?

  • 基于磁盤存儲(chǔ),消息上限高
  • 沒有間歇性的page-out,性能比較穩(wěn)定

惰性隊(duì)列的缺點(diǎn)有哪些?

  • 基于磁盤存儲(chǔ),消息時(shí)效性會(huì)降低
  • 性能受限于磁盤的IO

下一篇:RabbitMQ(五) | MQ集群搭建、部署、仲裁隊(duì)列、集群擴(kuò)容文章來源地址http://www.zghlxwxcb.cn/news/detail-428106.html


到了這里,關(guān)于RabbitMQ(四) | 惰性隊(duì)列 - 解決消息堆積問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • rabbitmq基礎(chǔ)7——隊(duì)列和消息過期時(shí)間設(shè)置、死信隊(duì)列、延遲隊(duì)列、優(yōu)先級(jí)隊(duì)列、回調(diào)隊(duì)列、惰性隊(duì)列

    rabbitmq基礎(chǔ)7——隊(duì)列和消息過期時(shí)間設(shè)置、死信隊(duì)列、延遲隊(duì)列、優(yōu)先級(jí)隊(duì)列、回調(diào)隊(duì)列、惰性隊(duì)列

    這里過一個(gè)知識(shí)點(diǎn)——過期時(shí)間,即對(duì)消息或隊(duì)列設(shè)置過期時(shí)間(TTL)。一旦消息過期,消費(fèi)就無法接收到這條消息,這種情況是絕不允許存在的,所以官方就出了一個(gè)對(duì)策——死信隊(duì)列,死信隊(duì)列最初出現(xiàn)的意義就是為了應(yīng)對(duì)消息過期丟失情況的手段之一。 那么過期時(shí)間具

    2024年02月03日
    瀏覽(100)
  • RabbitMQ常見問題之消息堆積

    RabbitMQ常見問題之消息堆積

    當(dāng)生產(chǎn)者發(fā)送消息的速度超過了消費(fèi)者處理消息的速度,就會(huì)導(dǎo)致隊(duì)列中的消息堆積,直到隊(duì)列存儲(chǔ)消息達(dá)到上限。最 早接收到的消息,可能就會(huì)成為死信,會(huì)被丟棄,這就是消息堆積問題。 解決消息堆積有三種種思路: 增加 更多消費(fèi)者 ,提高消費(fèi)速度 在消費(fèi)者內(nèi)開啟 線程

    2024年01月18日
    瀏覽(23)
  • RabbitMQ--消息堆積--解決方案

    原文網(wǎng)址:RabbitMQ--消息堆積--解決方案_IT利刃出鞘的博客-CSDN博客 本文介紹如何處理RabbitMQ消息堆積(積壓)。 對(duì)于消息隊(duì)列(MQ)來說,消息丟失/消息重復(fù)/消費(fèi)順序/消息堆積(積壓)是比較常見的問題,都屬于消息異常,這幾個(gè)問題比較重要,面試中也會(huì)經(jīng)常問到。 消息堆積即

    2023年04月08日
    瀏覽(20)
  • 【學(xué)習(xí)日記2023.6.19】 之 RabbitMQ服務(wù)異步通信_(tái)消息可靠性_死信交換機(jī)_惰性隊(duì)列_MQ集群

    【學(xué)習(xí)日記2023.6.19】 之 RabbitMQ服務(wù)異步通信_(tái)消息可靠性_死信交換機(jī)_惰性隊(duì)列_MQ集群

    消息隊(duì)列在使用過程中,面臨著很多實(shí)際問題需要思考: 消息從發(fā)送,到消費(fèi)者接收,會(huì)經(jīng)歷多個(gè)過程: 其中的每一步都可能導(dǎo)致消息丟失,常見的丟失原因包括: 發(fā)送時(shí)丟失: 生產(chǎn)者發(fā)送的消息未送達(dá)exchange 消息到達(dá)exchange后未到達(dá)queue MQ宕機(jī),queue將消息丟失 consumer接收

    2024年02月11日
    瀏覽(98)
  • 如何解決RocketMQ消息堆積的問題

    MQ消息堆積是指生產(chǎn)者發(fā)送的消息短時(shí)間內(nèi)在Broker端大量堆積,無法被消費(fèi)者及時(shí)消費(fèi),從而導(dǎo)致業(yè)務(wù)功能無法正常使用。 (1)新上線的消費(fèi)者功能有bug,消息無法被消費(fèi) (2)消費(fèi)者實(shí)例宕機(jī)或者因?yàn)榫W(wǎng)絡(luò)問題暫時(shí)無法與Broker建立連接。 (3)生產(chǎn)者短時(shí)間內(nèi)大量推送消息

    2023年04月26日
    瀏覽(13)
  • RabbitMQ系列(23)--RabbitMQ惰性隊(duì)列

    1、概念:RabbitMQ從 3.6.0版本開始引入了惰性隊(duì)列的概念。惰性隊(duì)列會(huì)盡可能的將消息存入磁盤中(持久化隊(duì)列若想持久化消息還需要看消息設(shè)置了持久化沒),而在消費(fèi)者消費(fèi)到相應(yīng)的消息時(shí)才會(huì)被加載到內(nèi)存中,它的一個(gè)重要的設(shè)計(jì)目標(biāo)是能夠支持更長(zhǎng)的隊(duì)列,即支持更多

    2024年02月16日
    瀏覽(25)
  • RabbitMQ惰性隊(duì)列使用

    RabbitMQ惰性隊(duì)列使用

    說明:惰性隊(duì)列是為了解決消息堆積問題,當(dāng)生產(chǎn)者生產(chǎn)消息的速度遠(yuǎn)高于消費(fèi)者消費(fèi)消息的速度時(shí),消息會(huì)大量的堆積在隊(duì)列中,而隊(duì)列中存放的消息數(shù)量是有限的,當(dāng)超出數(shù)量時(shí),會(huì)造成消息的丟失。而擴(kuò)容隊(duì)列,實(shí)際上不太現(xiàn)實(shí),因?yàn)殛?duì)列的消息是存在內(nèi)存中的,內(nèi)存

    2024年02月16日
    瀏覽(18)
  • rabbitmq topic模式設(shè)置#通配符情況下 消費(fèi)者隊(duì)列未接收消息問題排查解決

    rabbitmq topic模式設(shè)置#通配符情況下 消費(fèi)者隊(duì)列未接收消息問題排查解決

    生產(chǎn)者配置 Exchange:topic_exchange_shcool Routing key:topic.shcool.# 消費(fèi)者代碼配置 Exchange:topic_exchange_shcool Routing key:topic.shcool.user 其實(shí)以上代碼看著沒有問題,意思是代碼生成一個(gè)隊(duì)列,并把【topic.shcool.user】隊(duì)列和生產(chǎn)者的【topic_exchange_shcool】exchange綁定,但是生產(chǎn)者發(fā)送消息是

    2024年02月11日
    瀏覽(39)
  • RabbitMQ --- 惰性隊(duì)列、MQ集群

    RabbitMQ --- 惰性隊(duì)列、MQ集群

    當(dāng)生產(chǎn)者發(fā)送消息的速度超過了消費(fèi)者處理消息的速度,就會(huì)導(dǎo)致隊(duì)列中的消息堆積,直到隊(duì)列存儲(chǔ)消息達(dá)到上限。之后發(fā)送的消息就會(huì)成為死信,可能會(huì)被丟棄,這就是消息堆積問題。 解決消息堆積有三種思路: 增加更多消費(fèi)者,提高消費(fèi)速度。也就是我們之前說的work

    2024年02月03日
    瀏覽(39)
  • RabbitMQ消息堆積方案處理

    在消息隊(duì)列中,消息堆積是生產(chǎn)環(huán)境中的需要考慮的問題,一旦消息產(chǎn)生積壓,來不及消費(fèi),可能會(huì)導(dǎo)致MQ服務(wù)器宕機(jī),而解決消息積壓有這樣一些方案解決: 1.增加消費(fèi)者數(shù)量 可以根據(jù)業(yè)務(wù)情況適當(dāng)添加多臺(tái)服務(wù)器部署消費(fèi)者服務(wù)實(shí)例,消費(fèi)者數(shù)量增加,可以有效提高消息

    2024年02月11日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包