初步认识 MQ

MQ全程为 Message Queue,即消息队列。

RabbitMQ 是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列)协议实现的消息队列。

消息 (Message) 是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON 等,也可以很复杂,比如内嵌对象。

消息队列中间件 (Message Queue Middleware ,简称为 MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流, 并基于数据通信来进行分布式系统的集成。

通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

常见的中间件

  • ActiveMQ
  • RabbitMQ
  • Kafka
  • Rocket

消息中间件主要作用

  • 解耦

    • 业务解耦,减少对业务、系统的依赖性。
  • 削峰

    • 使用消息中间件能够使关键组件支撑突发访问的压力,不会因为突发的超负荷请求而崩溃。例如下单,抢购,发券活动。
  • 解耦

    • 很多时候应用不想也不需要立即处理消息,可以把消息放入队列以后慢慢消费它,例如发短信,发邮件,记日志,落库。

消息中间件场景

  • 分布式事物
  • 跨系统数据传递
  • 高并发的流量削峰
  • 大数据分析与传递
  • 数据的分发和异步处理

Rabbit工作原理

消息队列运转流程

Rabbit组成成员

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

交换机类型

  • 直接式交换器类型(Direct): 该类交换器需要精确匹配 Routing Key 与 Binding Key,如消息的 Routing Key = Cloud,那么该条消息只能被转发至 Binding Key = Cloud 的消息队列中去。

  • 广播式交换器类型(Fanout): 该类交换器不分析所接收到消息中的 Routing Key,默认将消息转发到所有与该交换器绑定的队列中去。

  • 主题式交换器(Topic Exchange): 该类交换器通过消息的 Routing Key 与 Binding Key 的模式匹配,将消息转发至所有符合绑定规则的队列中。