• RabbitMQ--延迟队列--使用/原理


    原文网址:RabbitMQ--延迟队列--使用/原理_IT利刃出鞘的博客-CSDN博客

    简介

    本文介绍RabbitMQ的延迟队列的用法。

    本内容也是Java后端面试中常见的问题。

    概述

    延迟队列用来存放延迟消息。延迟消息:指当消息被发送以后,不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

    RabbitMQ本身没有直接支持延迟队列的功能,但是有两种方案来实现:

    • 方案1:采用rabbitmq-delayed-message-exchange 插件实现。(RabbitMQ 3.6.x开始支持)
      • 推荐。原因:它解决了死信队列的消息投递问题:在第一条消息成为死信之前,后面的消息即使过期也不会投递为死信。
    • 方案2:通过前面所介绍的DLX和TTL模拟出延迟队列的功能。
      • 不推荐。原因:死信队列的设计目的是为了存储没有被正常消费的消息,便于排查和重新投递。死信队列没有对投递时间做出保证,在第一条消息成为死信之前,后面的消息即使过期也不会投递为死信(解决方法:向单个队列投递相同延迟时间的消息)。

    在上图中,不仅展示的是死信队列的用法,也是延迟队列的用法,对于queue.dlx这个死信队列来说,同样可以看作延迟队列。假设一个应用中需要将每条消息都设置为10秒的延迟,
    生产者通过exchange.normal这个交换器将发送的消息存储在queue.normal这个队列中。消费者订阅的并非是queue.normal这个队列,而是queue.dlx这个队列。当消息从queue.normal这个队列中过期之后被存入queue.dlx这个队列中,消费者就恰巧消费到了延迟10秒的这条消息。

    在真实应用中,对于延迟队列可以根据延迟时间的长短分为多个等级,一般分为5秒、10秒、30秒、1分钟、5分钟、10分钟、30分钟、1小时这几个维度,当然也可以再细化一下。

    以下图(图2-1)为例进行说明。为简化,只设置5秒、10秒、30秒、1分钟这四个等级。根据需求的不同,生产者发送消息的时候通过设置不同的路由键,将消息发送到与交换器绑定的不同的队列中。这里队列也分别配置了DLX和相应的死信队列,当相应的消息过期时,就会转存到相应的死信队列(即延迟队列)中,这样消费者根据业务自身的情况,分别选择不同延迟等级的延迟队列进行消费。

    图2-1

    上边只是部分内容,为便于维护,本文已迁移到此地址:RabbitMQ延迟队列-使用/原理 - 自学精灵

  • 相关阅读:
    .Net平台
    SpringCloud案例day01.md
    初识Cpp之 二、IO与文件
    web crawler 抓某前程的小小tips(低调发育)
    2022.9.29
    企业云成本管控,你真的做对了吗?
    non-trivial designated initializers not supported
    【Stable Diffusion】入门-04:不同模型分类+代表作品+常用下载网站+使用技巧
    【无标题】C语言学习笔记5--循环结构和选择结构
    idea导入maven web项目,增加tomcat服务器
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/127154292