RabbitMQ:从认识MQ到安装,学习消息模型等

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ:从认识MQ到安装,学习消息模型等相关的知识,希望对你有一定的参考价值。

RabbitMQ

1.初识MQ

1.1.同步和异步通讯

微服务间通讯有同步和异步两种方式:

同步通讯:就像打电话,需要实时响应。

异步通讯:就像发邮件,不需要马上回复。

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。

我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:

  • 性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。
  • 资源消耗:整个调用链中的每个服务在等待响应过程中,不能释放这次请求占用的资源,高并发场景下会极度浪费系统资源。
  • 级联失败:最大的问题是,如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障

异步调用则可以避免上述问题,而异步通讯的实现方案包括:

  • 请求回调式:

调用者会直接请求服务提供者,服务提供者接收到请求后,直接返回——收到请求,正在处理。服务提供者在处理完成请求后,再向调用者提前注册的回调地址(callback)发起请求,返回执行结果。

这种方式在调用其它公司接口时经常用到,例如微信、支付宝支付场景。

这种方式调用者与提供者之间依然会有耦合。

  • 事件驱动模式

我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。

在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速

  • 故障隔离:服务没有直接调用,不存在级联失败问题

  • 调用间没有阻塞,不会造成无效的资源占用

  • 耦合度极低,每个服务都可以灵活插拔,可替换

  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理
  • 需要依赖于Broker的可靠、安全、性能

好在现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是我们今天要学习的MQ技术。

1.2.技术对比

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

比较常见的MQ实现:

ActiveMQ

RabbitMQ

RocketMQ

Kafka

1.3.安装RabbitMQ

我们在Centos7虚拟机中使用Docker来安装。

方式一:在线拉取

docker pull rabbitmq:3-management

方式二:从本地加载

在课前资料已经提供了镜像包:

上传到虚拟机中后,使用命令加载镜像即可:

docker load -i mq.tar

执行下面的命令来运行MQ容器:

docker run \\
 -e RABBITMQ_DEFAULT_USER=itcast \\
 -e RABBITMQ_DEFAULT_PASS=123321 \\
 --name mq \\
 --hostname mq1 \\
 -p 15672:15672 \\
 -p 5672:5672 \\
 -d \\
 rabbitmq:3-management

1.4.RabbitMQ消息模型

RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种:

但是其实3、4、5这三种都属于发布订阅模型,只不过进行路由的方式不同。

以上是关于RabbitMQ:从认识MQ到安装,学习消息模型等的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ:惰性队列

RabbitMQ:生产者消息确认消息持久化消费者消息确认消费失败重试机制

认识并安装RabbitMQ(以Windows系统为例)

MQ-RabbitMq安装

RabbitMQ 消息队列学习

RabbitMQ