什么是消息队列(MQ)

其实字面意思很清楚了,存放消息的队列。
由于它的应用场景在服务器方面被重新定义而名声大噪,它的价值也被由原先的通信而重新定义,成为高并发场景下,分布式系统解耦合,任务异步,流量削峰的利器。

其实消息队列属于一种中间件。

MQ(message queue):面向消息的中间件(message-oriented middleware)是指利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储、流量削峰,异步通信,数据同步等功能。

发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题topic中,在合适的时候,消息服务器回将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系;尤其在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。

解耦合

  • 传统做法

    - 传统的做法是,订单系统调用库存系统的接口。如下图:

 - 传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合

如何解决以上问题呢?

  • 使用消息队列

    - 引入应用消息队列后的方案,如下图:

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
  • 在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦.

举个新例子:

比如说某一个系统A要与其他系统打交道(即调用其中的方法),如果其它系统改变或者新增系统,那么A系统都会改变,这样的话耦合度比较高,比较麻烦。


使用消息队列来解决这个问题。

我们A系统将产生的数据发入消息队列中,其它的系统再去消息队列来进行消费,那么其他系统的减少或者新增系统即与A系统关系不大了,这样来实现解耦的功能。

异步

场景说明:用户注册后,需要发注册邮件和注册短信
  • 传统做法

    - 串行:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信

- 并行:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信

其实让我想我也就只能想到并行。

  • 使用消息队列

    • 将不是必须的业务逻辑,异步处理。改造后的架构如下:

举个新例子

某一个用户使用系统A,但是A要调用系统B,C,D,但是每一个系统返回的时间是不一样的,你必须要等待全部返回后才可以响应用户。


如果我们这里采用消息队列,当用户发送请求后,我们把数据传给消息队列,然后再直接响应给用户我已经发送了信息。

流量削峰

场景说明:商品秒杀业务,一般会因为流量过大,导致流量暴增,应用挂掉
  • 传统做法

    - 限制用户数量
    
  • 使用消息队列

    - 用户的请求,服务器接收后,首先写入消息队列,秒杀业务


举个新例子

<think>好的,我现在需要回答用户关于消息队列MQ的基本概念和工作原理的问题。首先,我得回忆一下消息队列的核心定义,确保自己理解正确。消息队列,即Message Queue,是一种用于在应用程序之间传递消息的中间件技术。它的主要作用是解耦生产者和消费者,提高系统的可扩展性和可靠性。接下来,要解释工作原理。可能需要分步骤来说明,比如生产者发送消息到队列,队列存储消息,消费者从队列获取消息处理。这里要注意使用正确的术语,比如Broker、Topic、Partition等,但用户可能只需要基础层面的理解,所以保持简洁。然后,用户提到的系统级指令要求使用中文回答,并且数学公式用$...$,独立公式用$$...$$。不过消息队列可能涉及的技术术语较多,暂时可能用不到数学公式,但如果有涉及性能指标的地方,比如吞吐量计算,可能需要用公式。例如,吞吐量可以表示为$T =\frac{N}{t}$,其中N是消息数量,t是时间。不过不确定是否需要,先标记可能的位置。 用户还要求生成相关问题,需要根据回答内容提出三个相关问题。例如,消息队列的常见协议,如何保证消息不丢失,应用场景有哪些。需要检查LaTeX语法是否正确,比如变量和公式的格式。例如,如果有提到消息积压率,可能会写成$P= \frac{Q_{pending}}{Q_{total}}$,但如果没有相关数学内容,可能不需要。这里可能需要避免不必要的公式,除非明确涉及计算。 另外,要确保回答结构清晰,分点说明定义、工作原理、核心组件、优势。每个部分用简短的段落,可能使用加粗标题。例如:**定义**:消息队列是……用于异步通信…… **工作原理**:1.生产者发送消息到队列2.Broker存储和管理消息3.消费者订阅并处理消息**核心组件**:生产者、Broker、消费者、队列/主题**优势**:解耦、异步、削峰填谷、可靠性需要引用的话,在末尾添加引用标识,比如[^1]。但用户没有提供具体引用来源,可能需要虚构或省略,但根据示例,可能需要在某些地方添加,比如提到持久化机制时引用某个资料。最后生成相关问题,比如:1.消息队列如何保证消息的顺序性? 2.常见的消息队列产品有哪些?3.如何解决消息重复消费的问题? 检查是否满足所有要求:中文回答,结构清晰,正确术语,相关问题。确保没有使用Markdown格式,但用户示例中在代码块用了```,可能需要用类似方式展示组件或流程,但根据用户问题,可能不需要代码示例,而是文字描述。</think>### 消息队列 MQ 的定义与工作原理 **定义** 消息队列(Message Queue, MQ)是一种**异步通信中间件**,允许应用程序通过发送和接收消息实现解耦的交互模式。生产者将消息发送到队列,消费者从队列中获取并处理消息,消息传递过程由消息代理(Broker)管理[^1]。 **工作原理** 1. **生产者发送消息** 生产者(Producer)将消息按指定格式(如JSON、Protocol Buffers)发送到消息队列,并指定目标队列或主题(Topic)。例如,订单系统生成订单后发送消息到“订单队列”$$ \text{Producer} \xrightarrow{\text{消息}} \text{Broker} $$ 2. **消息存储与路由** 消息代理(Broker)负责持久化存储消息,并根据预设规则(如路由键、Topic匹配)将消息分发到对应队列。例如,RabbitMQ通过Exchange路由消息到不同队列[^2]。 3. **消费者订阅与处理** 消费者(Consumer)订阅队列并拉取消息,处理完成后向Broker发送确认(ACK)。若处理失败,消息会重新入队或进入死信队列(Dead Letter Queue)。 **核心组件** - **生产者/消费者**:消息的发送方和接收方 - **Broker**:核心服务,负责消息存储、路由和传递(如Kafka、RocketMQ) - **队列/Topic**:逻辑存储单元,支持点对点(Queue)或发布订阅(Topic)模式 **优势** - **解耦**:生产者和消费者无需同时在线或直接通信 - **异步处理**:生产者发送消息后即可继续执行,无需等待消费者响应 - **削峰填谷**:通过缓冲消息应对流量突增,避免系统过载 - **可靠性**:支持持久化、重试机制和事务消息 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值