MQ的一些理解

文章介绍了消息队列(MQ)的基本概念,如RabbitMQ和Kafka,强调其在系统解耦、异步处理和流量削峰中的作用。同时,指出了MQ可能带来的复杂性、单点故障、延迟和一致性问题,提示在使用MQ时需权衡利弊。
摘要由CSDN通过智能技术生成

前言

最近愈发觉得MQ的重要与强大,在此记录一下MQ的简单理解。

首先,MQ是什么?

**消息队列(Message Queue):**这是计算机科学中常见的概念,用于在分布式系统中传递消息的一种方式。消息队列将消息存储在一个队列中,使得发送者和接收者可以异步地进行通信。一些流行的消息队列系统包括 RabbitMQ 和 Apache Kafka。这两种MQ基本能够满足我们日常开发需求,两者也没有孰强孰弱的说法,只能是各有特设,不同场景需求下选择也当不同。

1.为什么要用MQ

1.1解耦系统组件

举个例子,有ABCDE,五个系统,其中BCD三个系统都要获取A的接口信息才能执行,所以每次运行BCD都需要先请求A,等待A返回后才可继续执行,如果系统D现在不需要接口A的信息了,那么我们需要修改系统A的代码,又或者说再来个系统E,需要依赖A接口,也需要修改A接口。不免显得些许麻烦,但是如果我们使用的MQ,把系统BCDE需要的信息都放到MQ,谁想用就去里面去取,不用就不取。这种结构大大减少了系统之间的耦合度。

1.2异步调用

假设有一个电子商务系统,其中订单处理系统(A)需要调用库存管理系统(B)来查询库存情况。

没有使用异步通信的情况:

  1. 订单处理系统(A)发起请求:当订单处理系统需要查询库存情况时,它直接调用库存管理系统的接口,发送一个请求,并等待响应。
  2. 库存管理系统(B)处理请求:库存管理系统接收到请求后,需要查询数据库或其他资源来获取库存情况。然后,它将响应发送回订单处理系统。
  3. 订单处理系统(A)接收响应并继续执行:订单处理系统接收到库存管理系统的响应后,可以根据返回的库存情况继续执行后续的订单处理逻辑。

在这种情况下**,订单处理系统需要等待库存管理系统的响应才能继续执行,这可能会导致订单处理系统的执行被阻塞,尤其在库存管理系统响应时间较长或出现故障时。这可能影响整个订单处理流程的效率和性能。**

使用异步通信的情况:

  1. 订单处理系统(A)发起异步请求:当订单处理系统需要查询库存情况时,它将请求发送到一个消息队列或事件总线,然后继续执行其他任务。
  2. 库存管理系统(B)订阅并处理请求:库存管理系统订阅消息队列或事件总线,等待订单处理系统发送的请求。一旦收到请求,它可以独立地处理请求,查询库存情况,并将响应发送到另一个消息队列或事件总线。
  3. 订单处理系统(A)接收响应并继续执行:订单处理系统订阅响应消息队列或事件总线,一旦收到库存管理系统的响应,它可以提取响应数据并继续执行订单处理逻辑。

在这种情况下,订单处理系统发送异步请求后不需要等待库存管理系统的即时响应。它可以继续执行其他任务,而不会被阻塞。库存管理系统在独立处理请求后发送响应,而订单处理系统可以在合适的时间获取响应并继续执行。这种异步通信方式可以提高系统的并发性、响应性能和可伸缩性,解耦了订单处理系统和库存管理系统之间的依赖关系,提高了整个系统的效率和性能。

异步调用也是MQ最为惊艳的地方。

1.3流量削峰

大家应该都知道到点抢购功能,即在一定的时间点会有大量的请求,数量根本不是服务器可控的,如果就任他请求然后处理,服务器必定炸。如果使用了MQ,可以把所有的请求消息都放在MQ中,然后按照处理能力,从MQ中获取能力范围内的请求信息去处理。这样,消息肯定也是一定时间内处理不完的,MQ的消息肯定堆积,但是高峰期不可能一直持续,我们只要一直保持高效率的处理请求,堆积的消息绝对可以消费完。

2.引入MQ可能会导致的一些BUG

MQ的优点上面已经说了,缺点又是什么呢?

举例来说,考虑一个在线支付系统,其中订单服务需要将支付请求发送到消息队列,而支付服务订阅并处理这些支付请求。

  1. 复杂性增加:需要设置和管理消息队列服务器,以及处理消息传递的异步模式。这可能需要额外的开发工作和维护成本。使用消息队列引入了额外的复杂性,包括设置和管理消息队列服务器、处理消息传递的异步模式以及处理消息序列化和反序列化等。这可能需要更多的开发和维护工作,并增加了系统的复杂性。
  2. **单点故障:**如果消息队列服务器成为系统的单点故障,可能会导致消息丢失或系统的可用性下降,也就是说本来代码没问题,但是MQ他自己消息丢失了。因此,为了确保高可用性,需要采取适当的容错和冗余措施来防止单点故障。
  3. 延迟:由于涉及到消息的传递和处理,使用消息队列可能会引入额外的延迟。支付请求从订单服务发送到消息队列,然后再由支付服务获取并处理。这些额外的步骤可能导致支付请求的处理时间增加,从而增加整个支付流程的延迟。*使用消息队列引入了额外的通信和处理时间,可能导致消息传递的延迟。尤其在负载较高或处理逻辑复杂的情况下,消息队列的延迟可能会对系统的响应性能产生影响。
  4. 一致性保证:在某些情况下,系统可能需要保证消息的顺序性或一致性。但是,消息队列本身不保证消息的有序传递,因此在设计系统时需要考虑如何处理顺序问题或保证一致性。这点也是MQ最大的弊端。

虽然这些缺点存在,但在许多场景中,正确地使用和管理消息队列仍然可以带来许多好处。对于特定的应用程序和需求。

3.RabbitMQ和Kafka对比

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值