MQ基础入门

  • Post author:
  • Post category:其他

1.什么是MQ

MQ(Message Queue)消息队列,是基础数据结构中

\color{red}{“先进先出”}

的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息(详情请见添加链接描述)。
通俗来讲,本质还是个队列,只不过此队列中存放的是message,也是一种跨进程的通信机制,用于上下游传递消息。
小张发微信给小王,小张为上游,小王为下游。

2.MQ的功能

2.1.流量削峰

通常用在高并发场景中,如电商项目的订单系统。假设订单系统的处理极限是10w/s,但高峰时期访问量可能是20w/s,不做处理订单系统必定会宕机,因此当订单超过10w我们限制访问订单系统,在用户与订单系统之间使用mq做缓冲,此法虽保护了订单系统,但订单必定存在等待时长。
在这里插入图片描述

2.2.应用解耦

以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性。
在这里插入图片描述

2.3.异步处理

有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完,以前一般有两种方式,A 过一段时间就去调用 B 的查询 api 查询。或者 A 提供一个 callback api,B 执行完之后调用 api 通知 A 服务。这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供 callback api。同样B 服务也不用做这些操作。A 服务还能及时的得到异步处理成功的消息。
在这里插入图片描述

3.分类

3.1.ActiveMQ

Apache ActiveMQ是最流行的开源、多协议、基于 Java 的消息代理。它支持行业标准协议,因此用户可以从各种语言和平台的客户端选择中受益。从用 JavaScript、C、C++、Python、.Net 等编写的客户端连接。使用无处不在的AMQP协议集成您的多平台应用程序。使用STOMP over websockets在您的 Web 应用程序之间交换消息。使用MQTT管理您的 IoT 设备。支持您现有的JMS基础架构及其他基础架构。ActiveMQ 提供了支持任何消息传递用例的能力和灵活性(来源于ActiveMQ官网添加链接描述)。
单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息丢失数据概率较低

3.2.Kafka

为大数据而生的消息中间件,以其

T

P

S

\color{red}{百万级 TPS }

TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用。
Kafka 主要特点是基于Pull 的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于

\color{red}{日志收集和传输}

,适合产生

\color{red}{大量数据}

的互联网服务的数据收集业务。

3.3.RocketMQ

Apache RocketMQ 是一个统一的消息传递引擎,轻量级的数据处理平台。
天生为

\color{red}{金融互联网领域}

而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况

3.4.RabbitMQ

RabbitMQ 拥有数以万计的用户,是最受欢迎的开源消息代理之一。RabbitMQ 是轻量级的,易于在本地和云端部署。它支持多种消息传递协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模、高可用性的要求。RabbitMQ 在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发工具。


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