RabbitMQ介绍

  • Post author:
  • Post category:其他

一、RabbitMQ 介绍

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

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

        消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC 的调用等等。

官网:Messaging that just works — RabbitMQ

二、RabbitMQ应用场景

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

 异步通信

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

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

图1串行发送注册邮件与短信流程

RabbitMQ的应用场景1

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

RabbitMQ的应用场景2

错峰流控与流量削峰

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

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

图3消息队列应对秒杀大流量场景

RabbitMQ的应用场景3

系统解耦

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

图4系统高耦合

RabbitMQ的应用场景4

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

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

图5系统解耦

RabbitMQ的应用场景5

高可用

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

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

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

三、RabbitMQ的核心概念

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

四、RabbitMQ五种消息发送模式

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

1、简单队列

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

 2、工作队列

  1. 一个生产者,多个消费者。
  2. 一个消息发送到队列时,只能被一个消费者获取。
  3. 多个消费者并行处理消息,提升消息处理速度。

        注意:channel.basicQos(1)表示同一时刻只发送一条消息给消费者。

 3、发布/订阅模式(Publish/Subcribe)

        将消息发送到交换机,队列从交换机获取消息,队列需要绑定到交换机。

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

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

 4、路由模式(Routing)

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

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

 5、主题模式(Topic)

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

 五、RabbitMQ四种交换机

        有4种不同的交换机类型:

  • 扇形交换机:Fanout exchange
  • 直连交换机:Direct exchange
  • 主题交换机:Topic exchange
  • 首部交换机:Headers exchange

扇形交换机

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

 直连交换机

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

主题交换机

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

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

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

首部交换机

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


版权声明:本文为qq_40298351原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。