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

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列

這篇具有很好參考價值的文章主要介紹了RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

MQ高級特性

1.削峰

設(shè)置 消費者

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

測試 添加多條消息

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

拉取消息 每隔20秒拉取一次 一次拉取五條 然后在20秒內(nèi)一條一條消費

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

TTL

Time To Live(存活時間/過期時間)。

當(dāng)消息到達存活時間后,還沒有被消費,會被自動清除。

RabbitMQ可以對消息設(shè)置過期時間,也可以對整個隊列(Queue)設(shè)置過期時間。

可以在管理臺新建隊列、交換機,綁定

1.圖形化操作

添加隊列

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

添加交換機

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

將交換機和對應(yīng)的隊列進行綁定

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

時間結(jié)束 , 消息失效

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

2.代碼實現(xiàn)

配置 生產(chǎn)者

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

@Configuration
public class TopicMqTtlConfig {


    @Value("${mq.exchange.name}")
    private String EXCHANGENAME;
    @Value("${mq.queue.name1}")
    private String QUEUENAME1;
    @Value("${mq.queue.name2}")
    private String QUEUENAME2;
    // 1
    // . 交換機
    @Bean("ex1")
    public Exchange getExchange(){
        Exchange exchange = ExchangeBuilder.topicExchange(EXCHANGENAME).durable(false).build();
        return exchange;
    }
    // 2。 隊列
    @Bean("queue1")
    public Queue getQueue1(){
        Queue queue = QueueBuilder.nonDurable(QUEUENAME1)
                .withArgument("x-message-ttl",30000)//過期時間30秒
                .withArgument("x-max-length",10)//隊列中最多接收10條消息超過10條的部分廢棄
                .build();
        return queue;
    }
    @Bean("queue2")
    public Queue getQueue2(){
        Queue queue2 = QueueBuilder.nonDurable(QUEUENAME2)
                .withArgument("x-message-ttl",300000000)//過期時間30秒
                .build();
        return queue2;
    }
    // 3. 交換機和隊列進行綁定
    @Bean("binding1")
    public Binding bindQueue1ToExchange(@Qualifier("ex1") Exchange exchange,@Qualifier("queue1") Queue queue){
        Binding binding1 = BindingBuilder.bind(queue).to(exchange).with("ttl1.*").noargs();
        return binding1;
    }
    @Bean("binding2")
    public Binding bindQueue2ToExchange(@Qualifier("ex1") Exchange exchange,@Qualifier("queue2") Queue queue){
        Binding binding2 = BindingBuilder.bind(queue).to(exchange).with("ttl2.#").noargs();
        return binding2;
    }
}

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

測試

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

添加成功 ttl1只接收10條

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

時間過期

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

死信隊列

死信隊列,英文縮寫:DLX 。Dead Letter Exchange(死信交換機,因為其他MQ產(chǎn)品中沒有交換機的概念),當(dāng)消息成為Dead message后,可以被重新發(fā)送到另一個交換機,這個交換機就是DLX。

比如消息隊列的消息過期,如果綁定了死信交換器,那么該消息將發(fā)送給死信交換機

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

消息在什么情況下會成為死信?(面試會問)

1.隊列消息長度到最大的限制

最大的長度設(shè)置為10當(dāng)?shù)?1條消息進來的時候就會成為死信

2. 消費者拒接消費消息,basicNack/basicReject,并且不把消息重新放入原目標(biāo)隊列,requeue=false(不重新回到隊列中)

設(shè)置消費者為手動簽收的狀態(tài)

3. 原隊列存在消息過期設(shè)置,消息到達超時時間未被消費;

隊列綁定交換機的方式是什么?

給隊列設(shè)置參數(shù): x-dead-letter-exchange 和 x-dead-letter-routing-key

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

//?1.??交換機??:正常的交換機???死信交換機

//?2.隊列??:正常的??死信

//3.綁定???正常ex?-?正常的que

正常的que和死信交換機

死信ex-死信queue

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

2.代碼實現(xiàn)

@Configuration
public class TopicMqDeadConfig {
    @Value("${mq1.exchange.name1}")
    private String EXCHANGENAME;
    @Value("${mq1.exchange.name2}")
    private String DEADEXCHANGE;
    @Value("${mq1.queue.name1}")
    private String QUEUENAME1;
    @Value("${mq1.queue.name2}")
    private String QUEUENAME2;
    // 聲明正常交換機
    @Bean("ex1")
    public Exchange getExchange(){
        Exchange exchange = ExchangeBuilder.topicExchange(EXCHANGENAME).durable(false).build();
        return exchange;
    }
    //  正常隊列
    @Bean("queue1")
    public Queue getQueue1(){
        Queue queue = QueueBuilder.nonDurable(QUEUENAME1)
                .withArgument("x-message-ttl",30000)//過期時間30秒
                .withArgument("x-dead-letter-exchange",DEADEXCHANGE)
                .withArgument("x-dead-letter-routing-key","dead.test")//將正常隊列與死信交換機,死信隊列綁定
                //.withArgument("x-max-length",10)//隊列中最多接收10條消息超過10條的部分廢棄
                .build();
        return queue;
    }
    // 交換機和隊列進行綁定
    @Bean("binding1")
    public Binding bindQueue1ToExchange(@Qualifier("ex1") Exchange exchange,@Qualifier("queue1") Queue queue){
        Binding binding1 = BindingBuilder.bind(queue).to(exchange).with("normal.*").noargs();
        return binding1;
    }


    // 聲明死信交換機
    @Bean("ex2")
    public Exchange getDeadExchange(){
        Exchange exchange = ExchangeBuilder.topicExchange(DEADEXCHANGE).durable(false).build();
        return exchange;
    }
    //死信隊列
    @Bean("queue2")
    public Queue getQueue2(){
        Queue queue2 = QueueBuilder.nonDurable(QUEUENAME2)
                .build();
        return queue2;
    }
    // 死信交換機和死信隊列進行綁定
    @Bean("binding2")
    public Binding bindQueue2ToExchange(@Qualifier("ex2") Exchange exchange,@Qualifier("queue2") Queue queue){
        Binding binding2 = BindingBuilder.bind(queue).to(exchange).with("dead.*").noargs();
        return binding2;
    }


}

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

測試

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

如果程序出現(xiàn)錯誤 拒絕簽收

監(jiān)聽正常隊列

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

發(fā)送消息 啟動測試

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

總結(jié):

1. 死信交換機和死信隊列和普通的沒有區(qū)別

2. 當(dāng)消息成為死信后,如果該隊列綁定了死信交換機,則消息會被死信交換機重新路由到死信隊列

3. 消息成為死信的三種情況:

????????1. 隊列消息長度到達限制;

????????2. 消費者拒接消費消息,并且不重回隊列;

????????3. 原隊列存在消息過期設(shè)置,消息到達超時時間未被消費;

?延遲隊列

延遲隊列,即消息進入隊列后不會立即被消費,只有到達指定時間后,才會被消費。

需求:

  • 1. 下單后,30分鐘未支付,取消訂單,回滾庫存
  • 2. 新用戶注冊成功7天后,發(fā)送短信問候。

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

實現(xiàn)方式:

1. 定時器

2. 死信隊列

在RabbitMQ中并未提供延遲隊列功能。但是可以使用:TTL+死信隊列 組合實現(xiàn)延遲隊列的效果。

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

1.配置

添加依賴

  <!--2. rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>




        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--nacos 配置中心-->
        <!--配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>


        <!-- application  bootstrap  -->


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>


        <!-- nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>




        <dependency>
            <groupId>com.example</groupId>
            <artifactId>sys-comm</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

?RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

修改配置

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

2.代碼實現(xiàn)

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

創(chuàng)建實體類

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

發(fā)送消息 測試

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

過期后放入死信隊列

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

添加依賴

 <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

將json數(shù)據(jù)轉(zhuǎn)化為對象

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

獲取成功

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

3.連接數(shù)據(jù)庫

創(chuàng)建表

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

創(chuàng)建測試類
@RestController
@RequestMapping("order")
public class OrderController {
    @Value("${mq1.exchange.name1}")
    private String EXCHANGENAME;
    //
    @Resource
    private RabbitTemplate rabbitTemplate;
    @GetMapping
    public Result aaa(TabOrder order){
     //1. 消息 存放到mq里面
        String s = JSONUtil.toJsonStr(order);
        // openfeign  --      數(shù)據(jù)添加到數(shù)據(jù)庫里面
        rabbitTemplate.convertAndSend(EXCHANGENAME, "normal.test", s);
        return Result.success(s);
    }
}

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

監(jiān)聽normal
import javax.annotation.Resource;
@Component
public class XiaoFeng implements ChannelAwareMessageListener {
    @Resource
    private TabOrderMapper orderMapper;
    @Override
    @RabbitListener(queues = "test_queue_normal")
    public void onMessage(Message message, Channel channel) throws Exception {
        //Thread.sleep(2000);// 20s
        byte[] body = message.getBody();
        String s = new String(body);
        System.out.println(s);
        // 將字符串轉(zhuǎn)化為 對象


        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try{
            TabOrder order = JSONUtil.toBean(s, TabOrder.class);
            // 將訂單的信息 報訊到數(shù)據(jù)庫里面
            int insert = orderMapper.insert(order);
            channel.basicAck(deliveryTag,true); //
        }catch(Exception e){
            //long deliveryTag, boolean multiple, boolean requeue
            System.out.println("拒絕簽收消息");
            channel.basicNack(deliveryTag,true,false);// 死信消息
        }
    }
}

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

監(jiān)聽dead
@Component
public class YanChi implements ChannelAwareMessageListener {


    @Resource
    private TabOrderMapper orderMapper;
    @Override
    @RabbitListener(queues = "test_queue_dead")
    public void onMessage(Message message, Channel channel) throws Exception {
        //Thread.sleep(2000);// 20s
        byte[] body = message.getBody();
        String s = new String(body);
        System.out.println(s);
        // 將字符串轉(zhuǎn)化為 對象
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try{
            TabOrder order = JSONUtil.toBean(s, TabOrder.class);
            //  order 的狀態(tài)
            TabOrder tabOrder = orderMapper.selectById(order.getId());
            if(tabOrder.getStatus()==1){
                // 取消
                tabOrder.setStatus(3);
            }
            orderMapper.updateById(tabOrder);
            channel.basicAck(deliveryTag,true); //
        }catch(Exception e){
            //long deliveryTag, boolean multiple, boolean requeue
            System.out.println("拒絕簽收消息");
            channel.basicNack(deliveryTag,true,false);// 死信消息
        }
    }
}

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

測試

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式

成功

RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列,rabbitmq,分布式文章來源地址http://www.zghlxwxcb.cn/news/detail-793272.html

到了這里,關(guān)于RabbitMQ高級特性2 、TTL、死信隊列和延遲隊列的文章就介紹完了。如果您還想了解更多內(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)文章

  • SpringCloudStream整合RabbitMQ用ttl+死信實現(xiàn)延遲隊列的實踐

    這篇是關(guān)于我使用Spring Cloud Steam操作RabbitMQ采用ttl+死信隊列的方式實現(xiàn)的延遲隊列。 在公司項目中遇到了需要延遲隊列的需求,為了以后可維護性和擴展性要求必須要用Springcloud Stream組件來操作mq,而且公司的rabbit也不允許安裝延遲插件,只能用最原始的ttl+死信來實現(xiàn),在搭

    2024年02月12日
    瀏覽(26)
  • 【RabbitMQ】RabbitMQ高級:死信隊列和延遲隊列

    【RabbitMQ】RabbitMQ高級:死信隊列和延遲隊列

    在電商平臺下單,訂單創(chuàng)建成功,等待支付,一般會給30分鐘的時間,開始倒計時。如果在這段時間內(nèi)用戶沒有支付,則默認(rèn)訂單取消。 該如何實現(xiàn)? 定期輪詢(數(shù)據(jù)庫等) 用戶下單成功,將訂單信息放入數(shù)據(jù)庫,同時將支付狀態(tài)放入數(shù)據(jù)庫,用戶付款更改數(shù)據(jù)庫狀態(tài)。定

    2024年01月17日
    瀏覽(18)
  • RabbitMQ:概念和安裝,簡單模式,工作,發(fā)布確認(rèn),交換機,死信隊列,延遲隊列,發(fā)布確認(rèn)高級,其它知識,集群

    RabbitMQ:概念和安裝,簡單模式,工作,發(fā)布確認(rèn),交換機,死信隊列,延遲隊列,發(fā)布確認(rèn)高級,其它知識,集群

    1.1.1.什么是MQ MQ(message queue:消息隊列) ,從字面意思上看,本質(zhì)是個 隊列 , FIFO 先入先出 ,只不過隊列中存放的 內(nèi)容是message 而已 ,還是一種 跨進程的通信機制 , 用于上下游傳遞消息 。在互聯(lián)網(wǎng)架構(gòu)中,MQ 是一種非常常見的上下游 “邏輯解耦+物理解耦” 的消息通信服

    2024年01月20日
    瀏覽(92)
  • RabbitMQ實現(xiàn)延遲消息,RabbitMQ使用死信隊列實現(xiàn)延遲消息,RabbitMQ延時隊列插件

    RabbitMQ實現(xiàn)延遲消息,RabbitMQ使用死信隊列實現(xiàn)延遲消息,RabbitMQ延時隊列插件

    假設(shè)有一個業(yè)務(wù)場景:超過30分鐘未付款的訂單自動關(guān)閉,這個功能應(yīng)該怎么實現(xiàn)? RabbitMQ使用死信隊列,可以實現(xiàn)消息的延遲接收。 隊列有一個消息過期屬性。就像豐巢超過24小時就收費一樣,通過設(shè)置這個屬性,超過了指定事件的消息將會被丟棄。 這個屬性交:x-message

    2024年02月13日
    瀏覽(104)
  • RabbitMQ延遲隊列,死信隊列配置

    延遲和死信隊列的配置 延遲隊列有效期一分鐘,后進入死信隊列,如果異常就進入異常隊列 異常隊列配置類

    2024年02月14日
    瀏覽(28)
  • RabbitMQ詳解(五):過期時間TTL、死信隊列、磁盤監(jiān)控

    RabbitMQ詳解(五):過期時間TTL、死信隊列、磁盤監(jiān)控

    過期時間TTL表示可以對消息設(shè)置預(yù)期的時間,在這個時間內(nèi)都可以被消費者接收獲??;過了之后消息將自動被刪除。 目前有兩種方法可以設(shè)置 第一種方法是通過隊列屬性設(shè)置,隊列中所有消息都有相同的TTL。 第二種方法是對消息進行單獨設(shè)置,每條消息TTL可以不同。 當(dāng)同時

    2024年02月04日
    瀏覽(19)
  • 【RabbitMQ學(xué)習(xí)日記】——死信隊列與延遲隊列

    【RabbitMQ學(xué)習(xí)日記】——死信隊列與延遲隊列

    死信,顧名思義就是無法被消費的消息,字面意思可以這樣理解,一般來說, producer 將消息投遞到 broker 或者直接到 queue 里了, consumer 從 queue 取出消息進行消費,但某些時候 由于特定的原因?qū)е?queue 中的某些消息無法被消費 ,這樣的消息如果沒有后續(xù)的處理,就變成了死

    2024年02月06日
    瀏覽(22)
  • RabbitMQ實現(xiàn)延遲消息的方式-死信隊列、延遲隊列和惰性隊列

    當(dāng)一條消息因為一些原因無法被成功消費,那么這這條消息就叫做死信,如果包含死信的隊列配置了dead-letter-exchange屬性指定了一個交換機,隊列中的死信都會投遞到這個交換機內(nèi),這個交換機就叫死信交換機,死信交換機再綁定一個隊列,死信最終會進入到這個存放死信的

    2024年02月19日
    瀏覽(94)
  • (五)RabbitMQ-進階 死信隊列、延遲隊列、防丟失機制

    (五)RabbitMQ-進階 死信隊列、延遲隊列、防丟失機制

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

    2024年02月15日
    瀏覽(25)
  • 【110期】面試官:說說 RabbitMQ 消費端限流、TTL、死信隊列?

    【110期】面試官:說說 RabbitMQ 消費端限流、TTL、死信隊列?

    *?entire?channel?rather?than?each?consumer *?@throws?java.io.IOException?if?an?error?is?encountered */ void?basicQos(int?prefetchSize,?int?prefetchCount,?boolean?global)?throws?IOException; prefetchSize:0,單條消息大小限制,0代表不限制 prefetchCount:一次性消費的消息數(shù)量。會告訴 RabbitMQ 不要同時給一個

    2024年04月27日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包