1、什么是MQ ?
MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。
在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,它不管。消费者只负责从消息队列中取出数据处理,它不管这是谁发送的数据。
1.1 MQ的优点?
- MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
生产方:订单系统
消费方:库存系统,支付系统,物流系统等
消费方需生产方的数据,生产方把数据给到MQ后,通过MQ与消费方进行通信。 生产方得到解耦。
- 任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
一个下单操作耗时:20 + 300 + 300 + 300 = 920ms
用户点击完下单按钮后,需要等待920ms才能得到下单响应,太慢!
用户点击完下单按钮后,生产方把数据发给MQ后,就可返回响应给客户端。只需等待25ms就能得到下单响应 (20 + 5 = 25ms)。
提升用户体验和系统吞吐量(单位时间内处理请求的数目)。
- 削峰填谷
如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发 量再高就容易宕机。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这个时候数据库肯定卡死了。 消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒1000个消息,这样慢慢写入数据库,这样就不会卡死数据库了。
但是使用了MQ之后,限制消费消息的速度为1000,但是这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被“削”掉了。但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000QPS,直到消费完积压的消息,这就叫做“填谷”。
1.2 MQ的缺点?
-
系统可用性降低
- 系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用?
-
系统复杂度提高
- MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。 如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
-
一致性问题
- A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性
1.3 MQ的方式
实现MQ的大致有两种主流方式:AMQP、JMS。
-
AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,遵循此协议,不受客户端和中间件产品和开发语言限制。2006年,AMQP规范发布。类比HTTP。
-
JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
1.4常见的MQ产品
-
ActiveMQ:基于JMS,Apache
-
RocketMQ:(Rocket,火箭)阿里巴巴的产品,基于JMS,目前由Apache基于会维护
-
Kafka:分布式消息系统,亮点:吞吐量超级高,每秒中数十万的并发。
-
RabbitMQ:(Rabbit,兔子)由erlang语言开发,基于AMQP协议,在erlang语言特性的加持下,RabbitMQ稳定性要比其他的MQ产品好一些,而且erlang语言本身是面向高并发的编程的语言,所以RabbitMQ速度也非常快。且它基于AMQP协议,对分布式、微服务更友好。
2、什么是RabbitMQ ?
RabbitMQ官方地址:www.rabbitmq.com/
2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。
RabbitMQ采用Erlang语言开发。Erlang 语言专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
RabbitMQ 基础架构如下图:
3、 docker环境试下RabbitMQ
我们通过 docker 来跑 RabbitMQ。
搜索 rabbitmq 的镜像,选择 3.11-management 的版本:
这个版本是有 web 管理界面的。
点击 run:
映射容器内的 5672、15672 这俩端口到本地的端口。
15672 是管理界面的,5672 是 mq 服务的端口。
等 rabbitmq 跑起来之后:
就可以在浏览器访问 http://localhost:15672 了:
这就是它的 web 管理界面。
输入 guest、guest 进入管理页面:
4、什么是amqplib ?
amqplib是一个用于与RabbitMQ进行交互的客户端库。它是RabbitMQ官方提供的一个Node.js客户端库,用于在Node.js环境中连接到RabbitMQ服务器并进行消息传递。
amqplib提供了一组API,使开发人员能够创建连接(amp.connect)、通道(connect .channel)、队列(channel.assertQueue),并发送(channel.sendToQueue)和接收消息(channel.consume)。它封装了与RabbitMQ的底层通信细节,使开发人员能够更方便地使用RabbitMQ的功能。
import * as amqp from 'amqplib'
const connect = await amqp.connect(`amqp://localhost:5672`);
const channel = await connect.createChannel();
await channel.assertQueue('aaa');
let i = 1;
setInterval(async () => {
const msg = 'hello' + i;
console.log('发送消息:', msg);
await channel.sendToQueue('aaa', Buffer.from(msg))
i++;
}, 500);
4、相关文章
-
文中使用了docker搭建的RabbitMQ服务器