RabbitMQ系列-简介

RabbitMQ 简介

RabbitMQ 介绍

人如其名,除了像兔子一样跑的很快以外,具有以下特点:
1.开源、性能优秀,稳定性保障
2.提供可靠性消息投递模式、交互模式
3.与Spring AMQP完美整合,API丰富(spring-boot融合)
4.集群模式丰富,表达式配置,HA模式,镜像队列模型(稳定可靠)
5.保证数据不丢失的前提做到高可靠性、可用性(稳定可靠)

典型应用场景:

异步处理

系统暂时把消息放入消息中间件中,等到需要的时候再去处理。先返回消息确认ID,然后再进行消息处理
eg 1.注册,注册会记住用户的信息,但是当前用户的注册线索可以被销售进行统计,这是后面无关紧要要做的事情,可以发消息进行异步处理,注册流程已经完成,用户无感知后面的逻辑
eg 2.会员,用户注册会员后,会发邮件或者短信恭喜用户,这些是不必要的事情,如果采用串行方式,先注册,等待邮件,等待短信,反馈用户注册成功,异步时候,注册完成,反馈用户,邮件、短信异步消息处理,简化流程

流量削峰

秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
eg 1.秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
可以控制活动人数,超过此一定阀值的订单直接丢弃
可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)

应用解耦。

eg 1.某个服务A需要给许多个服务(B、C、D)发送消息
此时,当服务B 不需要发送消息了,服务A需要改代码再次部署;
下次,当新加入一个服务E 需要服务A的消息的时候,也需要改代码重新部署;
另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?
使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
eg 2.订单系统
用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口,如果库存有问题,那就要回滚,导致订单失败
采用MQ消息队列,用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。用户美滋滋
库存系统:订阅下单的消息,获取下单消息,进行入库操作,就算库存系统出现故障,消息队列持久化可靠性也能保证消息的可靠投递,不会导致消息丢失,完美解耦

RabbitMQ 组件介绍

在这里插入图片描述

Queue

消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。

  1. 持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统断电crash,数据丢失
  2. 临时队列,queue中的数据在系统重启之后就会丢失
  3. 自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除
Exchange

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

Exchange有4种类型:

  1. Direct
    直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue
  2. Fanout
    广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。
  3. Topic
    主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和 #.user.stock.#的队列。
    ( * 表是匹配一个任意词组,#表示匹配0个或多个词组)
  4. Headers
    消息体的header匹配(ignore)
Binding

所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

Virtual host

在rabbitmq server上virtual hosts (vhosts)。每一个vhost本质上是一个rabbitmq server,分别管理各自的exchange和bindings。vhost 和 rabbitmq的关系就像 是mysql和数据库的关系, vhost就是数据库,一个mysql可以包含多个独立的数据库, vhost 实现租户隔离,不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个 vhost。

猜你喜欢

转载自blog.csdn.net/u010134642/article/details/106631186