前面,我们在黑点点评中秒杀场景中,首次了解到消息队列MQ,它主要解决了秒杀场景中异步场景,提升了并发性,吞吐量。可是还是对消息队列又很多的疑惑?
消息队列是什么
消息队列是一种通信协议或中间件,允许生产者将消息放入中间队列中,然后由其他消费者从队列中异步获取并处理。
我们可以从定义中看出消息对立中角色分为两种,生产者和消费者,生产者就是消息的生产放,将消息构建好后,放入消息队列中,消费者就是收到消息后对消息进行相应的业务处理,并返回结果和确认信号。
例如,双11期间淘宝面临数百万的秒杀场景
当用户们完成了秒杀业务,系统都会产生相应的请求,请求其他模块处理业务,扣款模块进行扣款,订单服务产生相应的订单,积分模块返回相应的积分,而在传统的涉及场景中,所有的请求都会直接进入后端的数据库和库存系统,甚至大部分的业务还会串行处理,若每一个业务的响应时间都是200s,则这几个业务的响应时间加起来就有1s。所以这样的设计不符合高并发,高性能,高可用的场景要求
而当我们引入了消息队列,首先会将所有的用户请求放入消息队列中,然后并行的分发给相对应的模块处理,异步处理请求,这就降低了响应时间,符合高性能的特点,同时这个过程叫做异步,即各个模块在队列中拿到消息后异步处理,降低了时间延迟
第二个特点是削峰,消息队列在中间起到了缓冲的作用,防止大量的请求冲垮了后端,消息队列接收到大量的消息后,会根据后面的模块处理情况慢慢消费。
第三个特点是解耦,每个模块之间相互独立,即使有一个模块崩溃了,也不会影响其他的模块,可以通过后续的分布式服务解决。
消息队列有哪些
目前主流的mq模型由四种:
-
RabbitMQ:基于AMQP协议,支持复杂路由机制和高可靠性消息传递。
-
Apache Kafka:分布式流平台,适用于大数据量、低延时场景,具有高吞吐量。
-
ActiveMQ / Artemis:Java领域常用的消息中间件,支持多种协议。
-
RocketMQ:由阿里巴巴开发的分布式消息中间件,适合大规模消息处理场景。
RocketMQ 的架构设计注重高可用性、可伸缩性和低延迟,主要包括以下几个核心组件:
-
Producer
负责构建并发送消息到 Broker。Producer 支持同步、异步以及单向发送,灵活应对不同业务场景下的性能和可靠性需求。 -
Broker
Broker 是消息存储和传递的核心组件,主要负责接收 Producer 发送的消息、将消息持久化到存储介质,以及根据消费请求将消息分发给 Consumer。Broker 支持多种存储策略,如内存与磁盘混合存储,并通过双写等机制保证消息不丢失。 -
Consumer
消费者订阅指定的 Topic 来接收消息。RocketMQ 支持集群消费、广播消费以及顺序消费等多种消费模式,满足业务对消息顺序性和分发策略的不同要求。 -
NameServer
NameServer 作为轻量级的路由注册中心,负责维护 Broker 的地址信息及路由信息。Producer 和 Consumer 在发送和接收消息时,会先从 NameServer 获取最新的 Broker 信息,从而实现动态路由和负载均衡。 -
消息模型
RocketMQ 支持多种消息传递模型:-
点对点模型:一个消息只被一个消费者消费(集群消费)。
-
发布订阅模型:消息可以被多个消费者订阅和消费(广播消费)。
-
顺序消息:在某些场景下,消息顺序性非常重要,RocketMQ 提供了严格和局部顺序消费的能力。
-