rabbitmq應用--死信隊列

一. rabbitmq死信隊列


  死信(dead letter)是Rabbitmq的一種消息機制,當消息沒有及時消費時,消息就變成死信。出現消息沒有消費的情況如下:
  1.消息被否定確認,使用 channel.basicNack 或 channel.basicReject ,並且此時requeue 屬性被設置爲false;
  2.消息在隊列的存活時間超過設置的TTL時間;
  3.消息隊列的消息數量已經超過最大隊列長度。
   
  死信消息會被RabbitMQ進行特殊處理,如果配置了死信隊列信息,那麼該消息將會被丟進死信隊列中,如果沒有配置,則該消息將會被丟棄。
  生產者-->發送消息-->業務交換機-->業務隊列(配置死信隊列信息)-->DLX交換機-->死信隊列-->監聽-->消費者
  
  TTL是time to live 的簡稱,顧名思義指的是消息的存活時間

二. 應用場景


   1.電商業務中關閉指定時間未支付的訂單,比如關閉購物車中30分鐘未支付訂單
   2.檢查用戶指定時間內需要釋放的資源,比如釋放用戶只能佔用1分鐘的服務器資源。
   3.在較爲重要的業務隊列中,確保未被正確消費的消息不被丟棄,通過配置死信隊列,可以讓未正確處理的消息暫存到另一個隊列中,待後續排查清楚問題
   
   在高併發場景下,rabbitmq死信策略比定時任務更好用,減少對服務器資源的消耗,可以分佈式處理問題。

 

三.如何配置死信隊列

 

@Bean
    public Exchange testDeadExchange() {
        return ExchangeBuilder.directExchange("test-dlx").durable(true).build();
    }

    @Bean
    public Queue testDeadQueue() {
        return new Queue("test-dead-queue", true);
    }

    @Bean
    public Queue testQueue() {
        return QueueBuilder.durable("test-queue")
                .withArgument("x-dead-letter-exchange", "test-dlx")
                .withArgument("x-dead-letter-routing-key", "test-dead-key").build();

    }
    
    @Bean
    public Binding bindingTestDeadQueue() {
        return new Binding("tests-dead-queue", Binding.DestinationType.QUEUE, "test-dlx", "test-dead-key", null);
    }
    
    @Bean
    public Binding bindingTest() {
        return new Binding("test-queue", Binding.DestinationType.QUEUE, "test-dlx", "test-routing-key", null);
    }

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章