当前位置:   article > 正文

RabbitMQ之交换机_rabbitmq的交换机

rabbitmq的交换机

目录

前言

一.关于交换机

1.交换机工作原理

2.交换机类型及路由规则

二.交换机实战讲解

1.直连交换机

2.主题交换机

3.扇形交换机

总结


前言

RabbitMQ 中的交换机(Exchange)是消息的分发中心,负责将消息发送到一个或多个队列。它接收生产者发送的消息并将这些消息路由到消息队列中

一.关于交换机

1.交换机工作原理

在RabbitMQ中生产者发送消息不会直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列再将消息以推送或者拉取的方式给消费者

在交换机接收到生产者发送的消息时,交换机会根据消息的路由键和交换机类型,决定将消息路由到哪个队列,而不同类型的交换机也有不同的路由规则

2.交换机类型及路由规则

1.Direct Exchange(直接交换机):

路由规则:消息的路由键与队列绑定时指定的路由键完全匹配。

行为:消息将被路由到与其路由键完全匹配的队列。

2.Topic Exchange(主题交换机):

路由规则:使用通配符进行模糊匹配。

通配符:

* 匹配一个单词。

# 匹配零个或多个单词。

行为:消息将被路由到与路由键匹配的队列。

对比直连交换机

我们知道,直连交换机的路由方案非常简单,但是当我们在希望将一条消息发送给多个队列时,那么这个交换机就需要绑定非常多的路由规则(routing_key),交换机绑定的路由规则(routing_key)越多,管理就越复杂,相对于直连交换机,主题交换机可以通过通配符进行模糊匹配多条消息进行筛选进入队列

拓展:当一个队列的绑定键是"#",它将会接收所有的消息,而不再考虑所接收消息的路由键,当一个队列的绑定键没有用到"#"和"*"时,它又像direct交换一样工作

 

3.Fanout Exchange(扇出交换机):

路由规则:路由键被忽略。

行为:消息将广播到所有与交换机绑定的队列。

4.Headers Exchange(头部交换机):

路由规则:使用消息的头部信息进行匹配。

行为:消息头部信息与队列绑定规则匹配时,消息将被路由到相应队列。

5.Dead Letter Exchange(死信交换机 ):

RabbitMQ作为一个高级消息中间件,提出了死信交换器的概念这种交换器专门处理死了的信息(被拒绝可以重新投递的信息不能算死的)。消息变成死信一般是以下三种情况:
消息被拒绝,并且设置requeue 参数为 false
消息过期(默认情况下 Rabbit 中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以达到消息过期的效果)队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时)当满足上面三种情况时,消息会变成死信消息,并通过死信交换机投递到相应的队列中我们只需要监听相应队列,就可以对死信消息进行最后的处理。

二.交换机实战讲解

1.直连交换机

先在RabbitMQ配置类中创建一个直连交换机和两个队列做测试用

  1. package com.yu.publisher;
  2. import org.springframework.amqp.core.DirectExchange;
  3. import org.springframework.amqp.core.Queue;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. @SuppressWarnings("all")
  8. public class RabbitConfig {
  9. @Bean
  10. public Queue queue1() {
  11. return new Queue("queue1");
  12. }
  13. @Bean
  14. public Queue queue2() {
  15. return new Queue("queue2");
  16. }
  17. @Bean
  18. public DirectExchange directExchange(){
  19. return new DirectExchange("directExchange");
  20. }
  21. }

将队列与交换机进行绑定并配置路由键(BindingKey)

  1. @Bean
  2. public Binding binding1(){
  3. return BindingBuilder.bind(queue1()).to(directExchange()).with("K1");
  4. }
  5. @Bean
  6. public Binding binding2(){
  7. return BindingBuilder.bind(queue2()).to(directExchange()).with("K2");
  8. }

在控制层做测试通过交换机及路由键做信息发送

  1. @RequestMapping("send3")
  2. public String send3(){
  3. //向消息队列发送消息
  4. amqpTemplate.convertAndSend("directExchange","Q1","Hello");
  5. return "
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/82428
    推荐阅读