RabbitMQ原理&RabbitMQ各组件作用&RabbitMQ使用场景

RabbitMQ原理

RabbitMQ介绍

  • MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表
  • producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息
  • RabbitMQ是一个遵循AMQP协议的消息中间件,它从生产者接受消息并传递给消费者,在这和过程中,根据路由规则就行路由、缓存和持久化
  • 业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制,在实际生产中应用相当广泛

Rabbitmq系统最核心的组件:ExchangeQueue

  • clientA生产消息,发送给服务器端的Exchange1
  • Exchange1收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
  • Queue1收到消息,将消息发送给订阅者Client1
  • Client1收到消息,发送ACK给队列确认收到消息
  • Queue1收到ACK,删除队列中缓存的此条消息
    在这里插入图片描述

RabbitMQ各组件作用:

# 1、Publisher:是Message的生产者,Publisher这个Clients产生了一些Message。

# 2、Consumer:Message的消费者,Publisher产生的Message,最终要到达Consumer这个Clients,进行消费。

# 3、Exchange:指定消息按什么规则,路由到哪个Queue,Message消息先要到达Exchange,在Server中承担着从Produce接收Message的责任。

# 4、Queue:到达Exchange的消息,根据制定的规则(Routing key)到达对应的Queue,
#    在Server中承担着装载Message,是Message的容器,等待被消费出去。

# 5、Routing key:在Exchange和Queue之间隐藏有一条黑线,可以将这条黑线看成是Routing key,
#    Exchange就是根据这些定义好的Routing key,将Message送到对应的Queue中去,是Exchange和Queue之间的桥梁。

# 6、Broker:之前一直不理解这个Broker,其实Broker就是接收和分发消息的应用,也就是说RabbitMQ Server就是Message Broker。

# 7、VirtualHost:虚拟主机,一个Broker里可以开有多个VirtualHost,它的作用是用作不同用户的权限分离。 

# 8、Connection:是Publisher/Consumer和Broker之间的TCP连接。
#    断开连接的操作只会在Publisher/Consumer端进行,Broker不会断开连接,除非出现网络故障或者Broker服务出现问题,Broker服务宕了。

# 9、Connection: Channel: 如果每一次访问RabbitMQ就建立一个Connection,那在消息量大的时候建立TCP Connection的开销就会很大,
#    导致的后果就是效率低下。

Queue(组件1)

  • 消息队列,提供了FIFO的处理机制,具有缓存消息的能力,rabbitmq中,队列消息可以设置为持久化,临时或者自动删除
  • 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
  • 设置为临时队列,queue中的数据在系统重启之后就会丢失
  • 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

Exchange(组件2)

  • Exchange类似于数据通信网络中的交换机,提供消息路由策略
  • rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange
  • 一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY
  • Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue
  • 和Queue一样,Exchange也可设置为持久化,临时或者自动删除

RabbitMQ使用场景

1、异步处理

  • 在注册服务的时候,如果同步串行化的方式处理,让存储数据、邮件通知等挨着完成,延迟较大
  • 采用消息队列,可以将邮件服务分离开来,将邮件任务之间放入消息队列中,之间返回,减少了延迟,提高了用户体验

2、应用解耦

  • 电商里面,在订单与库存系统的中间添加一个消息队列服务器,在用户下单后,订单系统将数据先进行持久化处理
  • 然后将消息写入消息队列,直接返回订单创建成功,然后库存系统使用拉/推的方式,获取订单信息再进行库存操作

3、流量削锋

  • 秒杀活动中,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列
  • 服务器在接收到用户请求后,首先写入消息队列,这时如果消息队列中消息数量超过最大数量,则直接拒绝用户请求或返回跳转到错误页面
  • 秒杀业务根据秒杀规则读取消息队列中的请求信息,进行后续处理

4、日志处理:Kalfka消息中间件

RabbitMQ如何保证可靠消费

确认种类

1)一种是消息发送确认

  • 这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递
  • 发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列

2)第二种是消费接收确认

  • 这种是确认消费者是否成功消费了队列中的消息

消息发送确认(第一种)

  • 如果设置了Mandatory属性则当消息不能被正确路由到队列中去时将会触发ReturnCallback
  • 是否到达交换器
  • 是否到达队列

1)ReturnCallback接口当消息从交换器发送到对应队列失败时触发(比如根据发送消息时指定的routingKey找不到队列时会触发)
2)一旦消息被投递到所有匹配的队列之后Broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了

消费接收确(确认)

  • 一旦发布一条消息生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息
  • 当消息最终得到确认之后,生产者应用可以通过回调ACK方法来处理该确认消息
  • 如果RabbitMQ因为自身内部错误导致消息丢失,生产者应用可以通过回调NACK方法来处理该确认消息
发布了81 篇原创文章 · 获赞 65 · 访问量 6180

猜你喜欢

转载自blog.csdn.net/weixin_45139342/article/details/105474942