RabbitMQ Exchange 模式 - direct

本文介绍如何在Windows环境下安装RabbitMQ服务器,并详细解析RabbitMQ Direct Exchange模式的工作原理。Direct Exchange模式下,消息会根据路由键(RouteKey)转发到指定的队列中。若指定队列不存在,消息将被丢弃。


windows 下 安装 RabbitMQ 服务器 环境 









RabbitMQ 默认的 Exchange;


1. 消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。


2.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。




参考代码(函数):



消息将 发送至 routingKey  对应的 队列 中,如果队列不存在,消息将被 舍弃。





调用测试代码:







在服务器上查看执行结果:





测试代码,点击下载

<think>我们正在使用RabbitMQ的延时插件`rabbitmq-delayed-message-exchange`,该插件允许我们使用一种新的交换机类型(x-delayed-message)来实现延时队列,从而避免使用死信队列+TTL带来的队头阻塞问题。 在Dubbo环境中安装该插件,实际上与Dubbo本身无关,因为Dubbo是一个RPC框架,而RabbitMQ是独立的消息中间件。因此,安装插件是在RabbitMQ服务端进行的。我们假设RabbitMQ是以Docker容器方式运行的(这是常见部署方式)。 ### 步骤1:下载插件 首先,我们需要下载插件。注意:插件的版本必须与RabbitMQ的版本兼容。可以从以下地址下载: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases 例如,对于RabbitMQ 3.7.x,可以下载`rabbitmq_delayed_message_exchange-20171201-3.7.x.ez`。 ### 步骤2:将插件复制到容器中 假设RabbitMQ的容器名称为`rabbitmq`(通过`docker ps`查看实际名称),我们将插件文件复制到容器的插件目录中。 ```bash docker cp rabbitmq_delayed_message_exchange-20171201-3.7.x.ez rabbitmq:/plugins ``` ### 步骤3:在容器内启用插件 进入容器内部,启用插件: ```bash docker exec -it rabbitmq bash ``` 在容器内执行: ```bash rabbitmq-plugins enable rabbitmq_delayed_message_exchange ``` ### 步骤4:重启RabbitMQ容器 退出容器并重启: ```bash docker restart rabbitmq ``` ### 步骤5:验证插件 重新进入容器,查看插件列表: ```bash docker exec -it rabbitmq rabbitmq-plugins list ``` 应该能看到`rabbitmq_delayed_message_exchange`插件已启用。 ### 在Dubbo项目中使用延时交换机 安装插件后,我们就可以在Dubbo服务中(生产者或消费者端)通过RabbitTemplate发送延时消息了。注意:这里我们使用`x-delayed-message`类型的交换机。 #### 配置延时交换机(Java Config) ```java @Configuration public class DelayedRabbitConfig { public static final String DELAYED_EXCHANGE = "delayed.exchange"; public static final String DELAYED_QUEUE = "delayed.queue"; public static final String DELAYED_ROUTING_KEY = "delayed.routingkey"; // 声明延时交换机(自定义类型) @Bean public CustomExchange delayedExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); // 底层交换机的类型,可以是direct, topic, fanout等 return new CustomExchange(DELAYED_EXCHANGE, "x-delayed-message", true, false, args); } // 声明队列 @Bean public Queue delayedQueue() { return new Queue(DELAYED_QUEUE); } // 绑定 @Bean public Binding bindingDelayedQueue(Queue delayedQueue, CustomExchange delayedExchange) { return BindingBuilder.bind(delayedQueue) .to(delayedExchange) .with(DELAYED_ROUTING_KEY) .noargs(); } } ``` #### 发送延时消息 ```java rabbitTemplate.convertAndSend(DelayedRabbitConfig.DELAYED_EXCHANGE, DelayedRabbitConfig.DELAYED_ROUTING_KEY, message, msg -> { // 设置延时时间(毫秒) msg.getMessageProperties().setHeader("x-delay", 30 * 60 * 1000); // 30分钟 return msg; }); ``` ### 注意事项 1. **插件兼容性**:确保插件版本与RabbitMQ版本匹配,否则可能导致RabbitMQ无法启动。 2. **交换机类型**:创建交换机时,类型必须为`x-delayed-message`,并且通过参数指定底层交换机类型(如direct)。 3. **延时时间**:发送消息时,通过消息头`x-delay`设置延时时间(毫秒)。 4. **队列声明**:延时交换机的绑定队列无需特殊参数,与普通队列一致。 通过上述步骤,我们在Dubbo环境中集成了RabbitMQ的延时队列插件,可以实现更精确的延时消息发送[^3]。这种方案避免了传统死信队列的队头阻塞问题,每条消息都可以有自己的延时时间。 §§相关问题§§ 1. RabbitMQ延时队列插件与死信队列方案有什么区别? 2. 如何确保RabbitMQ插件安装后的高可用性? 3. 在分布式事务中如何可靠地发送延时消息? </think>### Dubbo 环境中安装 RabbitMQ 延时插件指南 #### 一、安装插件核心步骤 1. **下载插件** 根据 RabbitMQ 版本下载对应插件(需匹配主要版本号): ```bash # RabbitMQ 3.8.x 版本 wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.8.17/rabbitmq_delayed_message_exchange-3.8.17.8f537ac.ez ``` 2. **复制插件到容器** 通过 `docker cp` 将插件复制到容器内: ```bash docker cp rabbitmq_delayed_message_exchange-3.8*.ez rabbitmq-container:/plugins ``` 3. **启用插件** 进入容器执行启用命令: ```bash docker exec -it rabbitmq-container bash rabbitmq-plugins enable rabbitmq_delayed_message_exchange ``` 4. **重启服务** ```bash docker restart rabbitmq-container ``` #### 二、Dubbo 项目集成配置 在 Dubbo 服务中配置延时交换机(XML 方式): ```xml <!-- 1. 声明延时交换机 --> <rabbit:exchange name="delayed.exchange" type="x-delayed-message"> <rabbit:exchange-arguments> <!-- 底层实际交换类型 --> <entry key="x-delayed-type" value="direct" /> </rabbit:exchange-arguments> </rabbit:exchange> <!-- 2. 绑定队列 --> <rabbit:queue name="dubbo.delay.queue" /> <rabbit:binding queue="dubbo.delay.queue" exchange="delayed.exchange" key="delay.key" /> ``` #### 三、Dubbo 服务发送延时消息 ```java @Service public class OrderServiceImpl implements OrderService { @Autowired private RabbitTemplate rabbitTemplate; public void createOrder(Order order) { // Dubbo 服务方法内发送延时消息 rabbitTemplate.convertAndSend("delayed.exchange", "delay.key", order, message -> { // 设置30分钟延迟(单位毫秒) message.getMessageProperties().setHeader("x-delay", 30 * 60 * 1000); return message; }); } } ``` #### 四、验证插件安装成功 ```bash # 查看已启用插件列表 docker exec rabbitmq-container rabbitmq-plugins list # 预期输出应包含 [E*] rabbitmq_delayed_message_exchange ``` #### 五、注意事项 1. **版本兼容性** - RabbitMQ 3.7.x 需使用插件版本 `3.7.*` - RabbitMQ 3.8.x 需使用 `3.8.*` - 版本不匹配会导致启动失败[^3] 2. **集群环境** 集群中所有节点需同步安装插件: ```bash # 将插件复制到所有节点 for node in node1 node2 node3; do docker cp plugin.ez ${node}:/plugins done ``` 3. **消息可靠性** Dubbo 服务需添加生产者确认机制确保消息投递: ```yaml spring: rabbitmq: publisher-confirm-type: correlated publisher-returns: true ``` #### 六、插件原理示意图 ```mermaid graph LR A[Dubbo服务] -->|发送延时消息| B[x-delayed-message交换机] B -->|消息暂存| C[RabbitMQ内部存储] C -->|到期后投递| D[目标队列] D -->|消费| E[Dubbo消费者服务] ``` > 此方案直接使用 RabbitMQ 官方插件,避免了传统 TTL+DLX 方案的队头阻塞问题,每条消息可独立设置延迟时间[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安得权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值