关键词:
四大交换机工作原理及实战应用
交换机概念
交换机可以理解成具有路由表的路由程序,仅此而已。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。
最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。
交换机的作用: 生产者向broker(rabbitmq服务器)发送消息,交换机通过生产者绑定的路由键,将消息推送到不同的消息队列中。而消费者,只绑定队列,从队列中获取消息。
direct 直连交换机
工作模式图解
生产者发送的消息;交换机会根据不同的路由键,发送到对应的队列;
springboot代码
MQ配置类,声明交换机、队列,路由键绑定
/**
* 声明交换机、队列、路由键绑定
* /
@Configuration
puvlic class RabbitConfig
/**
* 创建直连交换机
*/
@Bean
public DirectExchange createExchange()
// 交换机名字;是否持久化;是否自动删除
return new DirectExchange("testE", true, false);
/**
* 创建队列
*/
@Bean
public Queue createQueue()
// 交换机名字;是否持久化;是否自动删除
return new Queue ("testQ", true, false, false);
/**
* 通过路由键绑定交换机和队列
*/
@Bean
public Binding createBinding()
// 交换机名字;是否持久化;是否自动删除
return BindingBuilder
.bind(this.createQueue())
.to(this.createExchange())
.with("testR");
生产者
/**
* 消息生产者
*/
@Service
public class ProduceMsg
@Autowire
private RabbitTemplate rabbitTemplate;
public void sendMsg(Object msg)
// 消息唯一标识
CorrelationData correlationData= new CorrelationData();
correlationData.setId(msg.getId());
rabbitTemplate.converAndSend("testE", "testR", msg, correlationData);
消费者
@Conponent
public class ConsumeMsg
/**
* 消费者监听队列
*/
@RabbitListener(queues = "testQ")
public void sendMsg(String msg)
log.info("接收到消息:", msg);
// ......业务逻辑消费消息;
Fanout扇出交换机
工作模式图解
生产者发送到交换机的消息;会发送到绑定到该交换机的所有队列
springboot代码
MQ配置类,声明交换机、队列,绑定
/**
* RabbitMQ配置类
*/
@Configuration
public class RabbitMqConfig
@Bean
public Queue fanoutQueueA()
return new Queue("queueA", true, false, false);
@Bean
public Queue fanoutQueueB()
return new Queue("queueB", true, false, false);
@Bean
public Queue fanoutQueueC()
return new Queue("queueC", true, false, false);
@Bean
FanoutExchange fanoutExchange()
return new FanoutExchange("exchangeFanout");
@Bean
Binding bindingExchangeA()
return BindingBuilder.bind(fanoutQueueA()).to(fanoutExchange());
@Bean
Binding bindingExchangeB()
return BindingBuilder.bind(fanoutQueueB()).to(fanoutExchange());
@Bean
Binding bindingExchangeC()
return BindingBuilder.bind(fanoutQueueC()).to(fanoutExchange());
生产者
/**
* 消息生产者
*/
@Service
public class ProduceMsg
@Autowire
private RabbitTemplate rabbitTemplate;
public void sendMsg(Object msg)
// 消息唯一标识
CorrelationData correlationData= new CorrelationData();
correlationData.setId(msg.getId());
rabbitTemplate.converAndSend("exchangeFanout", "", msg, correlationData);
消费者
@Conponent
public class ConsumeMsg
/**
* 消费者监听队列
*/
@RabbitListener(queues = "testQ")
public void sendMsg(String msg)
log.info("接收到消息:", msg);
// ......业务逻辑消费消息;
Topic主题交换机
topic模式跟direct的区别是,topic模式可以用通配符的方式,对路由键进行绑定;达到更灵活路由消息的效果。
交换机的routingKey不能随意写;必须是以点号分隔;如aa.bb; cc.dd.ee等形式
*号代表一个单词;#号代表0个或多个单词
工作模式图解
图中队列1绑定的路由键是 *.*.routeA
图中队列2绑定的路由键是 routeA.#
生产者向该交换机的routeA.xxx.routeA路由键发送消息;那么队列1和2都会收到消息
springboot代码
MQ配置类,声明交换机、队列,绑定
@Configuration
public class TopicRabbitMqConfig
/**
* 队列A
*/
@Bean
public Queue topicQueueA()
return new Queue("topic_queue_A", true, false, false);
/**
* 队列B
*/
@Bean
public Queue topicQueueB()
return new Queue("topic_queue_B", true, false, false);
/**
* Topic交换器
*/
@Bean
TopicExchange exchange()
return new TopicExchange("topic_exchange", true, false);
/**
* 绑定A
*/
@Bean
Binding bindingExchangeQueueA()
//将队列和交换机绑定, 并设置用于匹配键:routingKey
return BindingBuilder.bind(topicQueueA()).to(exchange()).with("*.*.routeKey");
/**
* 绑定B
*/
@Bean
Binding bindingExchangeQueueB(Queue topicQueueB, TopicExchange exchange)
//将队列和交换机绑定, 并设置用于匹配键:routingKey
return BindingBuilder.bind(topicQueueB()).to(exchange()).with("routeKey.#");
生产者
/**
* 消息生产者
*/
@Service
public class ProduceMsg
@Autowire
private RabbitTemplate rabbitTemplate;
public void sendMsg(Object msg)
// 消息唯一标识
CorrelationData correlationData= new CorrelationData();
correlationData.setId(msg.getId());
rabbitTemplate.converAndSend("topic_exchange", "routeKey.test.routeKey",
msg, correlationData);
这个生产者发送的消息;队列topic_queue_A和topic_queue_B都会接收到该生产者发送的消息
header交换机
该交换机不同于其他机制,且实际开发不常用,此处不作讲解
rabbitmq交换器的四种模式
rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情
rabbitmq交换器的四种模式
rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情
一文带你彻底搞懂springboot-rabbitmq(代码片段)
...le模式,共计创建三个子modulecommon:通用实体信息rabbitmq-publisher:消息发布者,基于SpringBootrabbitmq-subscriber:消息订阅者,基于SpringBoot在消息发布者和订阅者两个项目中加入rabbitmqmaven依赖&l 查看详情
rabbitmq交换器的四种模式
rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情
rabbitmq一文读懂(代码片段)
目录1、RabbitMQ介绍应用场景其他消息队列选择RabbitMQ原因2、AMQP消息队列其他相关知识什么是AMQP?什么是JMS?3、RabbitMQ快速入门RabbitMQ的工作原理RabbitMQ消息发送和接受流程梳理RabbitMQ消息发送RabbitMQ消息接受RabbitMQ安装Rabbi... 查看详情
3.rabbitmq第一个程序
RabbitMQ消息服务器主要解决应用程序之间异步消息传输问题,传统的MQ分为点对点和主题与订阅,RabbitMQ使用Exchange(交换机)实现更加灵活的消息传递。前面介绍过几个概念,RoutingKey,Binding,Queue,Exchange,Binding将Exchange和Queue绑定... 查看详情
一文彻底弄懂“commonjs”与“esmodule”区别(代码片段)
简介文章中就不具体解释什么是“CommonJs”与“EsModule”了,我们先简单的描述一下“CommonJs”与“EsModule”的区别。它们有三个重大差异。CommonJS模块输出的是一个值的拷贝,ES6模块输出的是值的引用。CommonJS模块是运行... 查看详情
gis风暴一文彻底弄懂数字地形(demdomtdomdsm)的区别与联系
在2021自然资源部发布的《实景三维中国建设技术大纲(2021版)》中,空间数据部分包括“数字高程模型(DEM)、数字表面模型(DSM)、数字正射影像(DOM)、真正射影像(TDOM)、倾斜摄影三维模型、激光点云等。”那么到底什... 查看详情
rabbitmq四种交换机类型介绍
RabbitMQ 原文地址:https://baijiahao.baidu.com/s?id=1577456875919174629&wfr=spider&for=pc最新版本的RabbitMQ有四种交换机类型,分别是Directexchange、Fanoutexchange、Topicexchange、Headersexchange。DirectExchange处理路由 查看详情
一文彻底弄懂linux-shell编程(代码片段)
一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情
一文彻底弄懂linux-shell编程(代码片段)
一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情
一文彻底弄懂linux-shell编程(代码片段)
一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情
玩转rabbitmq系列01:一文带你敲响rabbitmq的大门(代码片段)
...帮助,点赞、收藏、留言都是对我最大的动力【玩转Rabbitmq系列】文章直通车~【玩转Rabbitmq系列】01:一 查看详情
gis风暴一文彻底弄懂数字地形(demdomtdomdsm)的区别与联系
在2021自然资源部发布的《实景三维中国建设技术大纲(2021版)》中,空间数据部分包括“数字高程模型(DEM)、数字表面模型(DSM)、数字正射影像(DOM)、真正射影像(TDOM)、倾斜摄影三维模型、激光点云等。”那么到底什... 查看详情
rabbitmq四种集群架构
参考技术A一、主备模式warren(兔子窝),一个主/备方案(主节点如果挂了,从节点提供服务,和ActiveMQ利用Zookeeper做主备一样)二、远程模式Shovel(架构简单,配置复杂,使用的少)三、镜像模式四、多活模式 查看详情
一文读懂rabbitmq消息队列
前言RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。AMQP,即AdvancedMessageQueuingProtocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息... 查看详情
一文读懂rabbitmq消息队列
前言RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。AMQP,即AdvancedMessageQueuingProtocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息... 查看详情
cookie从入门到进阶:一文彻底弄懂其原理以及应用(代码片段)
来自秦一授权的分享Cookie是什么?FortunecookieCookie,它的名字源自一种叫Fortunecookie的饼干,这种饼干里面有一张写着精辟句子的小纸条。在浏览器中,Cookie是服务器让浏览器帮忙携带信息的手段,就像饼干里的... 查看详情