参考:黑马程序员 b站

1. MQ介绍

1.1 MQ 基本概念

MQ: Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。
分布式系统通信两种方式:

  • A 直接远程调用 B

image.png

  • A、B通过 借助第三方 完成间接通信 (MQ为这种方式)

image.png

1.2 MQ 优势和劣势

1)优点(作用)

1. 应用解耦:提升系统容错性和可维护性

image.pngimage.png
系统耦合越高,容错性就越低,可维护性也越低

2. 异步提速:提升用户体验和系统吞吐量

image.png
用户点击下单按钮后需要等待 920ms (耗时太长)
image.png
用户点击下单按钮后只需要等待25ms就能得到下单响应
提升了用户体验和系统吞吐量(单位时间内处理请求的数目)

3. 削峰填谷:提升系统稳定性

image.pngimage.png
image.png
使用了MQ之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。使用MQ后,可以提高系统稳定性。

2)缺点

1. 系统可用性降低

系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用?

2. 系统复杂度提高

MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。

  • 如何保证消息不被重复消费?(幂等性问题)
  • 怎么处理消息丢失情况?
  • 如何保证消息传递的顺序性?

    3. 一致性问题

    A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?

3) 总结

既然MQ有优势也有劣势,那么使用MQ需要满足什么条件呢?

  1. 产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了,继续往后走,即所谓异步成为了可能。
  2. 容忍短暂的不一致性
  3. 确实是用了有效果。即解耦、提速、削峰这些方面的收益,超过加入MQ、管理MQ这些成本

1.3 常见的 MQ 产品

目前业界有很多的MQ产品,例如RabbitMQ、RocketMQ、 ActiveMQ、 Kafka、 ZeroMQ、 MetaMq等,也有直接使用Redis充当消息队列的案例,而这些消息队列产品,各有侧重。在实际选型时,需要结合自身需求及MQ产品特征,综合考虑。
image.png
主流MQ有: ActiveMQ、 RabbitMQ(效率高)、 RocketMQ(分布式)、 kafka(大数据领域)

  • RabbitMQ(效率高);并发性能强、延时低、管理界面丰富
    • 基于erlang语言开发;
    • 单机吞吐量 万级;
    • 时效:us级(更快)
  • RocketMQ(分布式);功能完备、扩展性好;Alibaba开发
    • 基于java语言开发;
    • 单机吞吐量 十万级;
    • 时效:ms级

1.4 RabbitMQ 简介

RabbitMQ 是基于 AMQP 协议使用 Erlang 语言开发的一款消息队列产品。

AMQP,即(Advanced Message Queuing Protocol, 高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面对消息的中间件设计。基于此协议的客户端与消息中间件可传递信息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。AMQP中的角色如下:
image.png
Exchange:用来分发消息
Queue:用来储存消息
Routes:具体分发到那个queue

2007年,Rabbit 技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。RabbitMQ 采用Erlang语言开发。Erlang语言由Ericson设计,专i门]为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
RabbitMQ 基础架构如下:
image.png
RabbitMQ中的相关概念:

  • Broker: 接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
  • Virtual host: 出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ Server 提供的服务时,可以划分出多个 vhost, 每个用户在自己的 vhost 创建 exchange / queue 等
  • Connection: publisher/consumer 和 broker 之间的TCP连接
  • Channel: 如果每一次访问 RabbitMQ 都建立一个 Connection, 在消息量大的时候建立TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method 包含了channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立TCP connection 的开销
  • Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有: direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
  • Queue: 消息最终被送到这里等待 consumer 取走
  • Binding: exchange 和 queue 之间的虚拟连接, binding 中可以包含 routing key。Binding 信息被保存到exchange中的查询表中,用于message的分发依据

RabbitMQ提供了6种工作模式:
简单模式、work queues、 Publish/Subscribe 发布与订阅模式、Routing路由模式、Topics 主题模式、RPC 远程调用模式(远程调用,不太算MQ;暂不作介绍).
image.png
注意每一种工作模式的应用场景特点.

1.5 JMS

  • JMS,即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
  • JMS 是Java EE 规范中的一种,类比 JDBC
  • 很多消息中间件都实现了JMS规范,例如: ActiveMQ. RabbitMQ 官方没有提供JMS的实现包,但是开源社区有

1.6 小结

  1. RabbitMQ 基于AMQP协议使用 Erlang 语言开发的一款消息队列产品。
    2. RabbitMQ 提供 了6种工作模式,我们学习5种。这是今天的重点。
    3. AMQP 是协议,类比 HTTP。
    4. JMS 是 API 规范接口,类比 JDBC。

2. Rabbit的安装和配置