RabbitMQ

RabbitMQ 本质是 AMQP 协议的一个开源实现,在详细介绍 RabbitMQ 之前,我们先来看一下 AMQP 的内部结构图

info

Version: rabbitmq:3.12.4-management
Plugins:

rabbitmq学习

RabbitMQ 使用 AMQP,概念体系包括:

  • Exchange(direct/fanout/topic/headers)
  • Binding
  • Queue
  • RoutingKey
  • vHost
  • Channel

安装

docker-compose.yml

version: "3"

services:
  rabbitmq:
    image: rabbitmq:3.12.4-management
    container_name: rabbitmq
    ports:
      - "5672:5672"  # AMQP
      - "15672:15672"  # Web 管理界面
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - LANG=C.UTF-8
      - LANGUAGE=C.UTF-8
      - LC_ALL=C.UTF-8
#    volumes:
#      - /opt/docker_data/rabbitmq_data:/var/lib/rabbitmq

访问 http://ip:15672/#/ 可以看到 Exchanges 等信息。

延时队列

什么是延时队列

延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的,元素从一端进入,从另一端取出。

其次,延时队列,最重要的特性就体现在它的延时属性上,跟普通的队列不一样的是,普通队列中的元素总是等着希望被早点取出处理,而延时队列中的元素则是希望被在指定时间得到取出和处理,所以延时队列中的元素是都是带时间属性的,通常来说是需要被处理的消息或者任务。

简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。

什么时候/场景需要使用延时队列

  • 订单在十分钟之内未支付则自动取消。
  • 新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
  • 账单在一周内未支付,则自动结算。
  • 用户注册成功后,如果三天内没有登陆则进行短信提醒。
  • 用户发起退款,如果三天内没有得到处理则通知相关运营人员。
  • 预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。

如何利用RabbitMQ实现延时队列需求

延时情况分两类:消息队列有相同的延时、每条消息有不同的延时。

内置的死信队列

创建一个延时队列、一个延时交换机、延时routingKey。
和一个立即队列、一个立即交换机、立即routingKey。

如上组件的关系如下图:

在延时队列里指定如下:

  • x-dead-letter-exchange 声明了队列里的死信转发到的DLX名称,(对应立即交换机)
  • x-dead-letter-routing-key 声明了这些死信在转发时携带的 routing-key 名称,(对应立即routingKey)
  • x-message-ttl 队列中消息的过期时间(注意消息上也可以设置过期时间),两者若同时设置取其小
    即可。

x-delayed-message(插件)

安装过程

安装一个插件即可:https://www.rabbitmq.com/community-plugins.html

  • 下载插件:访问 rabbitmq-delayed-message-exchange GitHub 仓库,找到并下载与你的 RabbitMQ 版本相对应的插件文件(通常是 .ez 或 .tar.gz 格式)。
  • 停止 RabbitMQ 服务:在安装之前,停止 RabbitMQ 服务以避免冲突。
  • 复制插件文件:将下载并解压后的 .ez 文件复制到 RabbitMQ 安装目录下的 plugins 文件夹中。
  • 启动 RabbitMQ 服务:启动 RabbitMQ 服务。
  • 启用插件:打开命令行,进入 RabbitMQ 的 sbin 目录,并执行命令 rabbitmq-plugins enable rabbitmq_delayed_message_exchange 来启用插件。
  • 重启RabbitMQ。

选择

如果你的系统中延迟消息很多 → 强烈推荐 x-delayed-message

理由:

  • 不产生死信
  • 不需要两个队列
  • 延迟精确
  • 支持随时变更 delay
  • 性能更高

参考

作者:张三  创建时间:2025-09-15 13:46
最后编辑:张三  更新时间:2025-11-26 16:14