RabbitMQ入门

1:RabbitMQ介绍

RabbitMQ是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。支持多种语言,包括java、Python、ruby、PHP、C/C++等。

1:MQ:MQ是 message queue 的简称,是应用程序和应用程序之间通信的方法。
2:AMQP:advanced message queuing protocol ,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息并不受客户端/中间件不同产品、不同开发语言等条件的限制。

官网:https://www.rabbitmq.com/

2:应用场景

RabbitMQ作为一款热门的消息队列中间件,具备高效可靠的消息异步传递机制,主要用于不同系统间的数据交流和传递,在企业解决方案、金融支付、电信、电子商务、社交、即时通信、视频、物联网、车联网等众多领域都有广泛应用。

# 异步通信
	将业务中属于非核心或不重要的流程部分,使用消息异步通知的方式发给目标系统,这样主业务流程无需同步等待其他系统的处理结果,从而达到系统快速响应的目的。

	如网站的用户注册场景,在用户注册成功后,还需要发送注册邮件与注册短信,这两个流程使用RabbitMQ消息服务通知邮件发送系统与短信发送系统,从而提升注册流程的响应速度。

3:串行发送注册邮件与短信流程

image

4:借助消息队列异步发送注册邮件与短信流程

image

5:错峰流控与流量削峰

在电子商务系统或大型网站中,上下游系统处理能力存在差异,处理能力高的上游系统的突发流量可能会对处理能力低的某些下游系统造成冲击,需要提高系统的可用性的同时降低系统实现的复杂性。电商大促销等流量洪流突然来袭时,可以通过队列服务堆积缓存订单等信息,在下游系统有能力处理消息的时候再处理,避免下游订阅系统因突发流量崩溃。消息队列提供亿级消息堆积能力,3天的默认保留时长,消息消费系统可以错峰进行消息处理。

另外,在商品秒杀、抢购等流量短时间内暴增场景中,为了防止后端应用被压垮,可在前后端系统间使用RabbitMQ消息队列传递请求。

6:消息队列应对秒杀大流量场景

image

7:系统解耦

以电商秒杀、抢购等流量短时间内暴增场景为例,传统做法是,用户下单后,订单系统发送查询请求到库存系统,等待库存系统返回请求结果给订单系统。如果库存系统发生故障,订单系统获取不到数据,订单失败。这种情况下,订单系统和库存系统两个子系统高耦合。

8:系统高耦合

image

引入RabbitMQ消息队列,当用户下单后,将消息写入到RabbitMQ消息队列中,然后返回用户下单成功。

库存系统订阅下单的消息,消费下单消息,然后进行库操作。即使库存系统出现故障,也不影响用户下单。

image

9:高可用

镜像队列是开源RabbitMQ 2.6.0版本新增的一个功能,允许集群将队列镜像到其他节点上,当集群某一节点宕机后,队列能自动切换到镜像中的其他节点,保证服务的可用性。

普通队列,由于队列以及队列内容仅存储在单节点上,当该节点故障后,对应的队列不可用。

RabbitMQ引入镜像队列机制,将队列镜像到集群中的其他节点上,每一个镜像队列包含一个主队列和多个从队列,并分布在集群的不同节点上。

10:RabbitMQ的核心概念

1:生产者(Producer):发送消息的应用。
2:消费者(Consumer):接收消息的应用。
3:队列(Queue):存储消息的缓存。
4:消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
5:连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
6:通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
7:交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
8:绑定(Binding):绑定是队列和交换机的一个关联连接。
9:路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。

11:RabbitMQ的五种消息发送方式

生产者(Producer)发送>>>中间件>>>消费者(Consumer)接收消息。
RabbitMQ包括五种队列模式
1:简单队列
2:工作队列
3:发布/订阅
4:路由
5:主题、rpc等

11.1:简单队列

1:生产者将消息发送到队列,消费者从队列获取消息。
2:一个队列对应一个消费者。

image

11.2:工作队列

1:一个生产者,多个消费者。
2:一个消息发送到队列时,只能被一个消费者获取。
3:多个消费者并行处理消息,提升消息处理速度。
	注意:channel.basicQos(1)表示同一时刻只发送一条消息给消费者。

image

11.3:发布/订阅模式(Publish/Subcribe)

将消息发送到交换机,队列从交换机获取消息,队列需要绑定到交换机。
1:一个生产者,多个消费者。
2:每一个消费者都有自己的一个队列。
3:生产者没有将消息直接发送到队列,而是发送到交换机。
4:每一个队列都要绑定到交换机。
5:生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的。
6:交换机类型为“fanout”。

注意:交换机本身没有存储消息的能力,消息只能存储到队列中。

image

11.4: 路由模式 Routing

路由模式是发布/订阅模式的一种特殊情况。

1:路由模式的交换机类型为“direct”。
2:绑定队列到交换机时指定 key,即路由键,一个队列可以指定多个路由键。
3:生产者发送消息时指定路由键,这时,消息只会发送到绑定的key的对应队列中。

image

11.5:主题模式 Topic

1:将路由键和某模式进行匹配。此时,队列需要绑定到一个模式上。
2:符号“#”匹配一个或多个词,“*”匹配不多不少一个词。
3:绑定队列到交换机指定key时,进行通配符模式匹配。

image

12:RabbitMQ四种交换机

 有4种不同的交换机类型:
 1:扇形交换机:Fanout exchange
 2:直连交换机:Direct exchange
 3:主题交换机:Topic exchange
 4:首部交换机:Headers exchange

12.1:扇形交换机

1:扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。
2:扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。
3:因为广播不需要“思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

image

12.2:直连交换机

直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。这样当一个交换机绑定多个队列,就会被送到对应的队列去处理。

image

12.3:主题交换机

发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用*.#.*.....的格式,每个部分用.分开,其中:

1:*表示一个单词
2:#表示任意数量(零个或多个)单词。

当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息。

image

12.4:首部交换机

 定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写入队列。绑定交换机和队列的时候,Hash结构中要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串(string)
posted @ 2022-04-19 13:56  Layzer  阅读(24)  评论(0编辑  收藏  举报