消息队列:RabbitMQ

目录

1、什么是rabbitMQ

1.1、AMQP

1.2几种MQ的对比

​编辑

2、快速入门

2.1、安装RabbitMQ(使用虚拟机安装)

2.2、使用RabbitMQ准备

2.3、交换机(Exchange)的概念

2.3.1、交换机作用

2.3.2、交换机的四种类型

一、直连交换机 Direct exchange

二、主题交换机  Topic exchange 

三、扇形交换机  Fanout exchange

四、首部交换机  Headers exchange

默认交换机

死信交换机

3、交换机代码实例

4、死信交换机的延申

4.1、死信队列 (延迟队列)


1、什么是rabbitMQ

一款基于AMQP用于软件之间通信的中间件 。消费并不需要确保提供方存在,实现了服务之间的高度解耦

1.1、AMQP

Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

1.2几种MQ的对比

消息队列:RabbitMQ

2、快速入门

2.1、安装RabbitMQ(使用虚拟机安装)

   先下拉镜像

docker pull rabbitmq:management

  运行一个容器把RabbitMQ运行起来  开放端口 15672(管理)   5672客户端使用

docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /home/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management

参数说明:

–hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

 -e:指定环境变量:

RABBITMQ_DEFAULT_VHOST:默认虚拟机名

RABBITMQ_DEFAULT_USER:默认的用户名

RABBITMQ_DEFAULT_PASS:默认用户名的密码

2.2、使用RabbitMQ准备

所需依赖

org.springframework.boot
spring-boot-starter-amqp

yml文件配置

消息队列:RabbitMQ

2.3、交换机(Exchange)的概念

2.3.1、交换机作用

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

消息队列:RabbitMQ

2.3.2、交换机的四种类型
一、直连交换机 Direct exchange

直连交换机的路由算法非常简单: 将消息推送到binding key与该消息的routing key相同的队列。

消息队列:RabbitMQ

      

直连交换机X上绑定了两个队列。第一个队列绑定了绑定o键range, 第二个队列有两个绑定键: black和green。

在这种场景下,一 个消息在布时指定了路由键为orange将会只被路由到队列Q1 I 路由键为black 和green的消息都将被路由到队列Q2。其他的消息都将被丢失。同一个绑定键可以绑定到不同的队列上去, 可以增加一个交换机X与队列Q2的绑定键,在这种清况下,直连交换机将会和广播交换机有着相同的行为, 将消息推送到所有匹配的队列。一个路由键为black的消息将会同时被推送到队列Q1和Q2。

直连交换机缺点:

直连交换机的 routing_key方案非常简单 ,如果我们希望一 条消息发送给多个队列 ,那么这个交换机需 要绑定上非常多的 routing_key.

假设每个交换机上都绑定一堆的 routing_key连接到各个队列上。那么消息的管理 就会异常地困难。

二、主题交换机  Topic exchange 

主题交换机的特点:

发送到主题交换机的 消息不能有任意的 routing key,  必须是由点号分开的一串单词,这些单词可以是任意的,但通常是与消息相关的一些特征。

如以下是几个有效的routing key:

“stock.usd.nyse”, “nyse.vmw”, “quick.orange.rabb 代”, routing key的单词可以 有很多,最大限制是255 bytes。

Topic 交换机的 逻辑与 direct 交换机有点 相似 使用特定路由键发送的消息 将被发送到所有使用匹配绑定键绑定的队列 ,然而 ,绑定键有两个特殊的情况:

*表示匹配任意一个单词#表示匹配任意—个或多个单词 

消息队列:RabbitMQ

如:

routing key quick.orange.rabbit-> queue Ql, Q2

routing key lazy.orange.elephant-> queue Ql,Q2

延申:

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

三、扇形交换机  Fanout exchange

特点:

扇形交换机是最基本的交换机类型,它所能做的事清非常简单广播消息。

扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要'思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

四、首部交换机  Headers exchange

首部交换机和扇形交换机都不需 要路由键routingKey,交换机时通过 Headers 头部来将消息映射到队列的 ,有点像 HTTP的 Headers.

Hash结构中要求携带一个键 “x-match”, 这个键的Val ue可以是any或者all, 这代表消息携带的 Hash是需要全部匹配(all), 还是仅匹配一个键(any) 就可以了。相比直连交换机 ,首部交换机的优势是匹配的规则不被限定为字符串(string)而是 Object 类型。

all: 在发布消息时携带的所有Entry必须和绑定在队列上的所有 Entry完全匹配any: 只要在发布消息时携带的有一对键值对 headers满足队列定义的多个参数 arguments的其中一 个就能 匹配上 ,注意这里是键值对的完全匹配,只匹配到键了,值却不—样是不行的;

默认交换机

实际上是— 个由 RabbitMQ预先声明好的名字为空字符串的直连交换机 (direct exchange) 。它有一个特殊的属性使得它对于简单应用特别有用处 :那就是每个新建队列 (queue)  都会自动绑定到默认交换机上,绑定的 路由键(routing key) 名称与队列名称相同。

消息队列:RabbitMQ

当你声明了一个名为“hello”的队列,RabbitMQ会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为“hello”。

当携带着名为“hello”的路由键的信息被发送到默认交换机的时候,此消息会被默认交换机路由至名为“hello”的队列中

类似amq.*的名称的交换机:这些是RabbitMQ默认创建的交换机。这些队列名称被预留做RabbitMQ内部使用,不能被应用使用,否则抛出403错误

死信交换机

RabbitMQ作为一个高级消息中间件,提出了死信交换器的概念。

这种交互器专门处理死了的信息(被拒绝可以重新投递的信息不能算死的)。

消息变成死信一般是以下三种情况:

①、消息被拒绝,并且设置requeue参数为false。

②、消息过期(默认情况下Rabbit中的消息不过期,但是可以设置队列的过期时间和信息的过期的效果)

③、队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时)

当满足上面三种情况时,消息会变成死信消息,并通过死信交换机投递到相应的队列中。我们只需要监听相应队列,就可以对死信消息进行最后的处理。

3、交换机代码实例

消息队列:RabbitMQ

routhingkey:路由规则

消息队列:RabbitMQ

消息队列:RabbitMQ

测试

消息队列:RabbitMQ

 使用扇形交换机时

rabbitTemplate.converAndSend("fanoutExchange","","hello") //中间必填

4、死信交换机的延申

4.1、死信队列 (延迟队列)

死信,在官网中对应的单词为“Dead Letter”,它是 RabbitMQ 的一种消息机制。 一般来说,生产者将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,如果它一直无法消费某条数据,那么可以把这条消息放入死信队列里面。等待 条件满足了再从死信队列中取出来再次消费,从而避免消息丢失。

死信消息的三种来源:

    1)消息被拒绝(basic.reject(单条))/ basic.nack(多条))并且requeue=false;

    2)消费消息时程序出现了异常;

    3)消息过期(x-message-ttl); TTL(Time To Life)

    4)队列中有消息数量超过了最大值(x-max-length);

    5)队列中的消息容量超过了队列的最大空间(x-max-length-bytes);

死信队列使用流程图

消息队列:RabbitMQ

消息的确认默认情况下是自动确认的如果想改为手动可以在配置文件中添加

(manual)为手动处理信息

消息队列:RabbitMQ

消息的确认模式有:

        ①:AcknowledgeMode.NONE:自动确认

        ②:AcknowledgeMode.AUTO:根据情况确认

        ③:AcknowledgeMode.MANUAL:手动确认

//手动确认消息  Boolean 是否重新入队
channel.basicAck(tag,true)
//手动拒绝消息  Boolean 是否重新入队
channel.basicReject(tag,false);

 

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/51dfb2a06b.html