(三)丶RabbitMQ的四种类型交换机

前言:四大交换机工作原理及实战应用

1.交换机的概念

交换机可以理解成具有路由表的路由程序,仅此而已。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

交换机的作用:生产者向broker发送消息(RabbitMQ的服务器)。交换机通过生产者的路由键,将消息推送到不同的消息队列中,而消费者只能绑定队列,从队列中获取消息;

一、直接交换机(direct)

直接交换机和扇出交换机很类似,扇出交换机的所有绑定都一样,而直接交换机的绑定不一样,也就是说,扇出交换机是把所有接收到的消息全部发给绑定的队列,而直接交换机是根据绑定的routingKey有选择的把消息发给指定的队列,直接交换机使用的是路由模式。

二、标题交换机(Header)

与routingKey无关,匹配机制是匹配消息头中的属性信息。在绑定消息队列与交换机之前声明一个map键值对,通过这个map对象实现消息队列和交换机的绑定。当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。(实际开发中不常用,反正我没遇到过)

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

三、Topic Exchange(主题交换机)

主题交换机是在直接交换机基础上的在一次增强,直接交换机每次只能根据routingKey把消息发送到某一个队列上,不能一次发送到多个队列上,而主题交换机可以解决这样的问题,主题交换机就是按照一定的匹配规则来把消息发送到匹配的消息队列上,所以发送到topic交换机的消息的routingKey不能随意写,必须满足一定的要求,他必须是一个单词列表,以点号分隔开。这些单词可以随意写,比如"dada.ffk","urru.ouu","eif.fggi.ebff"等,这个单词列表的做最多不能超过255个字节。在这个规则中""(星号)可以代替一个单词,"#"(井号)可以代替零个或多个单词。

复制代码
public class TopicProducer {

    public static final String TOPIC_EXCHANGE = "topic_exchange";
    public static final String TOPIC_QUEUE_ONE = "topic_queue_one";
    public static final String TOPIC_QUEUE_TWO = "topic_queue_two";

    public static void main(String[] args) throws Exception {
        //声明用作全局变量的队列变量和交换价变量

        //创建连接
        Connection connection = RabbitMQConnection.getConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(TOPIC_QUEUE_ONE,true,false,false,null);
        channel.queueDeclare(TOPIC_QUEUE_TWO,true,false,false,null);
        //声明交换机
        channel.exchangeDeclare(TOPIC_EXCHANGE, "topic",true);
        //绑定队列
        channel.queueBind(TOPIC_QUEUE_ONE,TOPIC_EXCHANGE,"*.orange.*");
        channel.queueBind(TOPIC_QUEUE_TWO,TOPIC_EXCHANGE,"*.*.rabbit");
        channel.queueBind(TOPIC_QUEUE_TWO,TOPIC_EXCHANGE,"lazy.#");
        //发生消息
        for (int i = 0; i <10 ; i++) {
            String msg="oh! Gie Gie ===>"+i;
            channel.basicPublish(TOPIC_EXCHANGE,"ag.we.rabbit",null,msg.getBytes());
        }
    }
}

1.当我key为RNG.orange.S8 被 QueueA 接收

2.当我key为TES.orange.rabbit 被 QueueA,QueueB接收

3.当我key为lazy.orange.S8 被 QueueA,QueueB 接收

3.当我key为lazy.ahaha.qq 被 QueueB 接收

四、扇出交换机(fanout)

扇出交换机的特点是类似于广播,只要队列与该类型的交换机绑定,所有发送到该交换机的信息都会被转发到所有与之绑定的队列,与routingKey无关。因为不处理路由键,所以fanout Exchange 速度最快

相关推荐
少许极端8 小时前
消息队列-RabbitMQ(1)
分布式·消息队列·rabbitmq
若水不如远方9 小时前
分布式一致性(七):架构角度 —— 分布式共识系统的选型指南
分布式·后端
&&月弥10 小时前
三大开源消息队列(Kafka、RabbitMQ、RocketMQ)使用教程
kafka·开源·rabbitmq
Darkdreams11 小时前
分布式监控Skywalking安装及使用教程(保姆级教程)
分布式·skywalking
深蓝电商API20 小时前
分布式事务在跨境交易中的解决方案
分布式·跨境电商·代购系统·反向海淘·代购平台·跨境代购
我真会写代码1 天前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
黄俊懿1 天前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
一叶飘零_sweeeet1 天前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
007张三丰1 天前
常用缓存技术全方位解析:从本地缓存到分布式缓存
分布式·缓存
tianyuanwo1 天前
Koji 分布式编译调度机制深度解析:多架构异构节点的资源优化方案
分布式·架构