Rabbitmq学习笔记

Rabbitmq学习笔记

零、什么是消息队列

    在微服务或者分布式系统中,两个或者多个服务之间通信或者一个服务发出消息需要通知给多个服务处理的时候,消息队列是一个很好的解决方案。

    AMQP : Advanced Message Queuing Protocol 高级消息队列协议,是应用层协议的一个开放标准,为面向消息中间件设计。

    何为消息中间件:消息中间件就是用于解决多个服务或者组件之间通信但是各服务之间却不需要知晓发送消息和接收消息的是谁,这样也做到了服务和模块之间的解耦。

一、Rabbitmq又是个啥?

    RabbitMq是一个消息代理中间件,用于接收和转发消息,按照官方文档的解释,可以把兔子看成一个邮局,它做着和邮局一样的事情。就是接收到消息发送方发出的消息,然后根据收件信息(路由名称)将信息推送给消费者;

二、Rabbitmq的主要核心概念

    

Rabbitmq具有以下几个核心概念

0、消息生产者(producer):顾名思义,消息生产者就是产生消息并且将消息发送出来的一方,
1、消息接收者(消费者)(consumer):接收消息并消费的一方
2、队列(Queue):队列,这里的队列是RabbitMq的内部对象,用于存储消息,RabbitMq的消息都存储在Queue中,然后推送给消费者

    

三者关系如下图

图

3、信道(Channel):用于客户端与RabbitMq服务器连接通信的通道,由于RabbitMq服务与客户端之间的连接是需要一条基于TCP连接的长连接,所以Channel是建立在Connection上的一条虚拟连接,RabbitMq所需要处理的每条消息以及指令都需要通过Channel完成,每个Channel都会被指派一个唯一的ID,之所以建立并使用信道,是因为为了减少创建Connection(TCP连接)。
4、交换机(Exchange)和BindingKey(绑定键):绑定键是用于将交换机与队列建立绑定关系所实现的。消息的接受以及发送则需要通过交换机来根据交换机规则进行消息的推送以及处理

    

交换机的几种类型

fanout: 扇形交换机,全方位无差别轰炸,只要是绑定在交换机的消费者均可收到消息,就是这么豪横。
direct: 直连交换机,精准打击,这里是精准找到与消息指定的RoutingKey完全匹配的消费者们(们:这里的消费者可以是多个RoutingKey匹配的消费者)进行推送。形象点如果把性别看作RoutingKey,厕所看作交换机,每个进厕所的人看作队列,而“向前一小步,文明一大步”看作消息的话,那么只有RoutingKey是男的队列(人们)才可以接收到这则消息。
topic:规则交换机,就是该交换机下所有绑定的路由,只要符合消息的RoutingKey规则,则就都可以接收到消息的推送如:我发送的RoutingKey是 sky.nt.lueluelue 则,消息队列绑定的RoutingKey为:>sky...nt. 以及 ..lueluelue等一次类推的所有队列都可以接收到消息推送。
headers:头信息交换机,这个交换机就比较骚了。为啥呢?因为这个交换机不通过RoutingKey来匹配。他是通过消息的Header(头信息)中的某一属性来进行匹配的,当队列与交换机进行绑定的时候,指定一组> 键值对;当发送消息的时候在头信息里面放入这个键值对,则就会接收到消息,反之这接收不到。不过一般都没啥人用,属于核弹级别,看起来很吊,就是没人敢用或者说没有场景来用。
5、消息的持久化(Message acknowledgment):为了避免由于服务器宕机而导致的消息丢失,RabbitMq实现了消息的持久化功能,所谓的消息持久化就是将Rabbitmq服务器内存里面的数据如:交换机、队列、消息存储在硬盘中,以防服务器宕机或者损坏所造成的数据丢失。

Rabbitmq 持久化方式分为如下几种:

0、交换机(Exchange)持久化:在创建交换机的需要指定durableTrue表示开启持久化。
1、队列(Queue)持久化:在创建队列时指定durableTrue即可。
2、消息(Message)的持久化:如果需要开启消息的持久化,则需要将消息的deliveryMode设置成为2即代表消息持久化。但是由于消息会被写入到硬盘,所以对Rabbitmq的性能也是会影响的,而且消息持久化并不能保证消息百分百的不丢失,万一你往磁盘写的时候断电了,或者服务器炸了,消息还是会丢失的。
(注:持久化是各管各的,持久化了交换机就只能持久化交换机,交换机里面的队列还是会丢失的,所以这俩要开就都开。至于消息的话,其实可以考虑存入缓存或者数据库等地方实现持久化)
6、RPC(RPC):消息的回调,因为消息队列是基于异步的消息处理,并且根据消息队列特性,发送者并不知道消费者具体是谁,更别说是否消费成功了,但是在某些时候或者应用场景上面,我们是需要判断这条消息发送出去后是否处理成功了,这个时候我们就用上了Rabbitmq的RPC机制了

Rabbitmq RPC具体实现方法:

在消息的属性(MessageProperties)中,设置两个值:
0、replyTo:这里写需要回调的路由名称,在消息在处理完成以后将会发送消息队列到这个指定的消息中。
1、CorrelationId:当前请求的唯一标识,用于区分消息。

三、死信队列

    Rabbitmq如果出现长时间没有人消费的、被拒绝接收的,队列达到最大长度以后进入队列的,都被称为死信,而死信所归往的地方就被称为死信队列,死信队列与其他队列有何不同呢?并没有什么不同,只不过消息变成死信后会经由死信交换机发送到死信队列上面,然后由死信队列的消费者去处理这些队列。

    那么“死信”被丢到死信队列中后,会发生什么变化呢?如果队列配置了参数 x-dead-letter-routing-key 的话,“死信”的路由key将会被替换成该参数对应的值。如果没有设置,则保留该消息原有的路由key。

    举个栗子:

    如果原有消息的路由key是testA,被发送到业务Exchage中,然后被投递到业务队列QueueA中,如果该队列没有配置参数x-dead-letter-routing-key,则该消息成为死信后,将保留原有的路由keytestA,如果配置了该参数,并且值设置为testB,那么该消息成为死信后,路由key将会被替换为testB,然后被抛到死信交换机中。

    另外,由于被抛到了死信交换机,所以消息的Exchange Name也会被替换为死信交换机的名称。

四、参考链接:

0、 https://www.cnblogs.com/williamjie/p/9481774.html
1、https://www.jianshu.com/p/5c2d8af2c78e
2、https://www.cnblogs.com/eleven24/p/10326718.html
3、https://www.rabbitmq.com/documentation.html
4、https://juejin.cn/post/6844904039193280526
5、https://www.cnblogs.com/mfrank/p/11184929.html
6、https://www.cnblogs.com/williamjie/p/9481774.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值