RabbitMq学习(一) Exchange的四种类型和属性

一、什么是Exchange

首先我们要了解到,RabbitMQ 是 AMQP(高级消息队列协议)的标准实现:

从 AMQP 协议可以看出,Queue、Exchange 和 Binding 构成了 AMQP 协议的核心

  • Producer:消息生产者,即投递消息的程序。
  • Broker:消息队列服务器实体。
    • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
    • Binding:绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。
    • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Consumer:消息消费者,即接受消息的程序。

二、Exchange的作用

Exchange的主要作用还是为了解耦。

AMQP 协议中的核心思想就是生产者和消费者的解耦,生产者不直接将消息投递给队列,而是将消息投递给Exchange,然后Exchange根据相应的路由规则投递给队列,最后队列将消息投递到消费者。

举个生活中的例子,不是很恰当,但大概意思就是这样。将报纸、投递站、投递员、订阅报纸的用户分别看做生产者、exchange、队列以及消费者。

报纸印刷后,会分发到投递站,投递站相当于exchange,会指定分发规则,例如,这一片区的报纸分给某个投递员,投递员拿到这些报纸后,对订阅了该报纸的这一片区的用户进行投递。

当然这个队则有多种,例如将区域看做一个规则、将报纸种类看做规则、或者区域加种类混合规则。下面就详细介绍exchange的类型。

三、Exchange的类型

3.1    Fanout Exchange

这是最简单的一种交换器,首先要知道一个概念-banding。banding是将exchange和队列绑定的一种队则,java中万物皆对象,所以这个绑定也看做一个对象。

banding中还有个路由键的概念。就是即使交换机与队列进行了绑定,但是在某些场景下,我们不希望与交换机绑定的队列都能收到消息。所以就可以去指定一个路由键。

在进行绑定的时候去指定路由键,在发送消息的时候指定Exchange、指定路由键,才可以正确的将消息发送到队列上。

Fanout Exchange 比较特殊 会忽略路由键的设置,直接将 Message 广播到所有绑定的 Queue 中。

3.2  Direct Exchange

Direct Exchange 是RabbitMq的模式模式,将Exchange和队列绑定的时候,需要指定路由键,并且在发消息的时候也需要指定路由键,并且路由键必须要完全一致。

例如指定了路由键是green,那么只有与exchange绑定并且路由键为green的队列才会收到消息。

3.3 Topic Exchange

与Direct Exchange基本相同,唯一区别在于路由键。Topic exchange 的路由键可以去进行模糊匹配。

*  表示一个单词的模糊匹配 例如,路由键是   *.apple.big  则表示第一个单词可以是任意的,只要后边单词完全匹配,就可以。

#  表示完全模糊匹配。例如 路由键是 #.little ,那么 发送消息的路由键可以是 green,apple,little,也就是说前面的单词是任意的。

四、Exchange的使用

多说无益,直接撸代码。

就用topic 做演示,其他的模式基本一样。

1. 首先设定一个路由键

public static final String TOPIC_C = "red.*.*";

2.配置一个topicExchange
 @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(EXCHANGE_C);
    }

3. 配置一个队列

第一个参数拜师队列名称,第二个参数表示是否持久化

   @Bean
    public Queue queueC() {
        return new Queue(QUEUE_C, false); //队列持久
    }

4.   配置bangding

  @Bean
  public Binding bindingC() {
        return
  BindingBuilder.bind(queueC()).to(topicExchange()).with(TOPIS_C);
    }

5. 发送消息代码

第一个参数是Exchange名称,第二个参数是路由键,第三个参数是内容,第四个参数是唯一性id

如果是 Fanout Exchange 那么就不用指定路由键传参为null,

如果是 Direct Exchange,那么路由键就要与指定的路由键完全匹配。

public void sendMsg(String content) {
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(EXCHANGE_C, "red.cc.dd", content, correlationId);

    }

这样路由键是  red.*.*  ,发送消息的路由键是  "red.cc.dd" ,并且因为是Topic Exchange模式,所以该路由键是可以匹配到的。

完整代码请参考:https://github.com/zhuanzhiBUG/springboot-rabbitmq.git

部分参考内容:https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/80416996

原文地址:https://www.cnblogs.com/zhazhahui/p/11185005.html

时间: 2024-08-29 12:55:03

RabbitMq学习(一) Exchange的四种类型和属性的相关文章

RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)

转自:http://lostechies.com/derekgreer/2012/03/18/rabbitmq-for-windows-hello-world-review/ 我的心得: 1. 在创建ConnectFactory时,我们可以传入主机名.端口号.用户名/密码.虚拟Host等参数. 2. 也可以使用ampq://用户名:密码@主机名:端口号/%2f 3. Channel是轻量级的TCP/IP连接, 而Connection是非常Expensive的. 4. 消息不是直接发到Queue的

SQL语言的四种类型和ORACLE运算符

sql语句四种类型: 数据定义语言(DDL) 数据操作语言(DML) 数据控制语言(DCL) 事务控制语言(TCL) Data Definition Language(DDL) DDL使我们有能力创建或删除表格.也可以定义索引(键),规定表之间的链接,以及施加表间的约束. CREATE DATABASE - 创建新数据库   ALTER DATABASE - 修改数据库   CREATE TABLE - 创建新表   ALTER TABLE - 变更(改变)数据库表   DROP TABLE -

LVS四种类型和十种算法

Lvs常用术语说明 术语 解释 Load balancer或director 负载调度器 RS或Real Server 真实服务器,提供服务的服务器 VIP 虚拟IP地址,客户端访问集群的地址 RIP 集群所提供应用程序的地址(HTTP,FTP) DIP 调度器的真实地址 Lvs的类型 Lvs-nat 他通过修改请求报文的目标地址为根据调度算法所挑选出的某RS的RIP来进行转发. 架构特性: (1)  Rs应该使用私有地址,即RIP应该为私有地址,各RS的网关必须执行DIP (2)  请求报文和

RabbitMQ学习系列(四): 几种Exchange 模式

上一篇,讲了RabbitMQ的具体用法,可以看看这篇文章:RabbitMQ学习系列(三): C# 如何使用 RabbitMQ.今天说些理论的东西,Exchange 的几种模式. AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储.同理,消费者也是如此.Exchange 就类似于一个交换机,转发各个消息分发到相

RabbitMQ学习之:(六)Direct Exchange (转贴+我的评论)

From: http://lostechies.com/derekgreer/2012/04/02/rabbitmq-for-windows-direct-exchanges/ RabbitMQ for Windows: Direct Exchanges Posted by Derek Greer on April 2, 2012 This is the fifth installment to the series: RabbitMQ for Windows.  In thelast inst

RabbitMQ学习之:(五)Exchange Type (转贴+我的评论)

From: http://lostechies.com/derekgreer/2012/03/28/rabbitmq-for-windows-exchange-types/ RabbitMQ for Windows: Exchange Types Posted by Derek Greer on March 28, 2012 This is the fourth installment to the series: RabbitMQ for Windows.  In thelast instal

rabbitmq 学习记录 -- 基本概念

派猴子来的救兵 messag queue嘛, 就是生产者往里扔东西, 消费者取走. 但是要涉及到细节,还是有些多的. 基本概念 其实就是官网文档的搬运工. 路由模型 先来看看一条消息的生命线, 生产者把消息发送到exchange, 然后根据exchange的类型和routing key(消息发送时的一个参数), 把这条消息路由到不同的队列中去, 图片中是发到了一个列队, 其实也可以到多个. 然后消费都从队列中把消息取走. 和kafka有些不同, rabbitmq里面的一个队列里面一条消息被一个消

RabbitMQ学习系列(三): C# 如何使用 RabbitMQ

上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实际开发的过程中,怎么调用 用RabbitMQ. 一.客户端 RabbitMQ 有很多客户端API,都非常的好用.我们在一边,一直用的都是 EasyNetQ,所以这里的 demo 只介绍 EasyNetQ 客户端实现.其他的客户端,大家自己去研究吧. EasyNetQ 是一个易于使用的RabbitMQ

RabbitMQ学习及实践2---介绍及简单Java实现

一,基本概念 MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息.MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品. RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协