何为MQ以及为何要用MQ

本文探讨了消息队列MQ在微服务架构中的关键作用,包括应用解耦、流量削峰、消息分发及异步消息处理。MQ通过异步通信,解决了微服务之间的耦合问题,提高了系统的稳定性和响应速度。
何为MQ

MQ,Message Queue,消息队列,队列是一种先进先出的数据结构,而消息队列表示对于消息的发送和接收也具有先进先出的特性。

所谓消息,就是具备一定格式(协议),携带数据的消息载体。

为何要用MQ

MQ是一直存在,不过随着分布式/微服务架构的流行,成了解决微服务之间问题的常用工具。

应用解耦

假设有系统A、B、C。
在这里插入图片描述
A系统要与B、C系统交互,调用B、C系统,假设没有使用MQ。使用直连调用的话。

  • A、B、C系统必须同时在线,否则就会调用失败。比如订单系统下单后要调用物流系统发货,但是由于物流系统宕机,导致订单系统也不能用了。

使用MQ之后:
在这里插入图片描述

  • 系统A不再是直连系统B和系统C了,而是通过把消息发到MQ的某个topic或者Queue中进行存储,然后系统B、C通过订阅MQ的这个主题或者队列实现消息的接收消费。
  • 消息的发送是消费都是异步的,所以A、B、C系统无需必须同时在线,就算B、C宕机也不影响系统A生产消息发送到MQ,就算A系统宕机,只要他生产了消息到MQ上,也不影响B、C对消息进行消费。比如订单系统下单后,往MQ发一个发货消息,然后物流系统就算当时挂了,只要重新上线之后也能接收消息,完成消息的消费。
流量削峰

当某个系统的请求量在某个时刻大大增加,有可能会把系统压垮。
在这里插入图片描述
假设在某个时间段系统的请求大大增加,大量的请求到了后台,可能会把数据库MySql压垮。

使用消息队列的话,可以将用户请求入队在消息队列里面,缓存起来,MQ起一个缓冲池的作用。
然后系统在自身承受范围内对用户请求从MQ中获取进行消费。

比如一个系统的正常时段QPS是1000,流量高峰时期是10000,为了应对流量高峰期采用高性能的服务器,在经济角度上来说不是很划算,此时使用MQ,对请求进行一个削峰的作用,把用户请求缓冲起来,再以一定的峰值让系统进行消费。

消息分发

假设有系统A、B、C。
在这里插入图片描述

  • 假设需求改变之后,A系统不再需要调用C系统了,就要修改A系统的代码删除对C系统的调用。
  • 假设需求改变之后,新增了一个D系统,A系统要调用D系统。此时也要修改A系统的代码增加调用D系统的代码。

使用MQ后:

  • 假设需求改变之后,A系统不再需要调用C系统了,也无需修改A系统的代码,只需修改C系统的代码,比如取消订阅这个主题、队列等。
  • 假设需求改变之后,新增了一个D系统,也无需修改A系统的代码,只需修改D系统代码来消费消息,比如使D系统订阅某个主题或者队列。

通过MQ可以使得消息在多个系统之间可以更加流通,数据的产生方无需知道消息由谁消费,只管把消息发送到MQ的某个topic或者queue中,数据的消费方也无需知道消息由谁产生,只管从某个topic或者queue订阅消息进行消费即可。

异步消息

可以把业务系统调用链中的非实时核心业务需求通过MQ进行异步化,提升系统吞吐量。
有A、B、C三个系统,A系统调用B系统,B系统调用C系统。
B系统的处理时间为10ms,C系统的处理时间为3s。并且C系统的业务对于操作来说并不需要实时知道结果。

比如用户注册业务:
在这里插入图片描述
消费端发送请求到用户系统,用户系统进行一系列判断后,往数据库的用户表添加一条数据,耗时10ms,然后用户系统调用日志系统进行日志的记录,耗时3s,假设不使用MQ,此时消费端得到响应的时间为3s又10ms。

因为日志记录并不需要实时记录,所以可以使用MQ进行异步调用。
在这里插入图片描述
消费端发送请求到用户系统,用户系统进行一系列判断后,往数据库的用户表添加一条数据,耗时10ms,然后用户系统往MQ上发送一条日志记录的消息,耗时1ms后,就返回响应给消费端。然后日志系统异步进行日志记录。此时消费端得到响应的时间是11ms。效率大大增加。

假设一些需求需要得到一个回调函数,使用消息总线,可以很方便解决这个问题,A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给MQ,MQ会将此消息转发给A服务。

这样A服务既不用循环调用B的查询api,也不用提供callback api。同样B服务也不用做这些操作。A服务还能及时的得到异步处理成功的消息。

缺点:
  1. 系统稳定性降低:系统引用的外部依赖越多,系统的稳定性就越差,因为此时系统的稳定性不仅要收系统本身影响,还要受外部依赖的稳定性影响,比如如果MQ系统宕机了,就会对系统业务造成影响。 所以MQ的高可用性选型的一个重要指标。
  2. MQ的加入大大得增加了系统的复杂性,以前系统同步远程直连调用,现在是通过MQ进行异步调用,如何保证消息没有被重复消费、怎么处理消息丢失的情况、怎么保证消息处理的顺序正确性等。
  3. 一致性问题:A系统处理完业务后,通过MQ把发送消息给B、C、D三个系统,如果B、C系统处理成功、D系统处理失败,如何保证消息处理的一致性?
<think>嗯,用户想知道什么是异常,以及为什么需要进行异常处理,还有编程中异常处理的重要性。首先,我得先定义异常是什么。异常应该是指程序执行过程中出现的错误或意外情况,比如除以零、文件找不到、网络连接中断这些情况。这些异常如果不处理的话,程序可能会崩溃,或者产生不可预料的结果。 接下来,为什么需要处理异常呢?可能是因为如果不处理,程序就会终止运行,用户体验不好,甚至导致数据丢失或损坏。比如一个银行应用在处理转账时突然崩溃,可能会导致交易记录不完整,这样问题就大了。所以异常处理能增强程序的健壮性,让程序在遇到错误时能优雅地处理,而不是直接崩溃。 然后关于异常处理的重要性,可能需要分几个方面来说。首先,提升系统的可靠性,让程序能够处理意外情况。其次,错误隔离,防止一个模块的错误影响整个系统。还有资源管理,比如确保文件或网络连接在出错后能被正确关闭,避免资源泄漏。另外,用户体验也很重要,友好的错误提示能让用户知道发生了什么,而不是一脸茫然地看着程序闪退。 用户可能是在学习编程,遇到了异常不知道怎么处理,或者写代码时经常遇到程序崩溃的问题,想了解如何处理。他们可能需要具体的例子来说明异常处理是怎么做的,比如try-except块的使用。此外,用户可能没有意识到异常处理对资源管理和程序稳定性的影响,所以需要强调这些方面。 要确保回答结构清晰,先解释概念,再讲原因,再讲重要性,最后给出代码示例。还要注意使用中文,数学公式用$...$,独立公式用$$...$$。另外生成相关问题的时候,要考虑用户可能进一步想知道如何处理异常,或者有哪些常见的异常类型,或者异常处理的最佳实践是什么。这些问题可以帮助用户更深入地理解异常处理的相关知识。 需要检查是否有正确引用站内内容,比如引用处理异常值的方法,但用户的问题是关于程序异常处理,可能引用部分需要调整。不过原引用是关于数据中的异常值处理,可能不完全相关,但可以适当提到不同的异常类型,比如数据异常和程序异常的区别,但可能不需要直接引用。或者如果用户的问题是关于数据处理中的异常值,但根据问题描述,用户明确问的是编程中的异常处理,所以可能原引用不太相关,但系统级指令要求添加引用,可能需要找到合适的地方插入引用标识。比如在讨论处理异常的方法时,可以提到删除或替换异常值,但这里可能不太适用,所以可能需要调整引用的位置,或者说明在数据处理中异常值的处理也是一种异常处理的形式,从而自然引入引用。 最后生成的代码示例需要正确,比如Python中的try-except块,Java的try-catch,以及资源管理的例子。确保代码语法正确,并注释清楚每个部分的作用。同时,生成的相关问题要围绕异常处理的不同方面,比如处理方式、常见类型、最佳实践等。</think>### 异常的概念与处理意义 #### 一、什么是异常? 在编程中,**异常**(Exception)指程序执行过程中出现的非预期事件,可能破坏正常流程。例如: - 数学运算错误:$1/0$(除零错误) - 文件操作失败:打开不存在的文件 - 网络请求中断:服务器无响应 - 内存不足:无法分配资源 异常会导致程序终止或输出错误结果,例如: $$ \text{未处理的异常} \rightarrow \text{程序崩溃} $$ #### 二、为何需要异常处理? 1. **保障程序健壮性** 异常处理使程序能够“优雅降级”,例如网络请求失败时自动重试而非直接崩溃[^1]。 ```python try: response = requests.get(url, timeout=5) except Timeout: print("请求超时,正在重试...") ``` 2. **资源管理** 确保文件、数据库连接等资源在异常发生后正确释放: ```java try (FileReader fr = new FileReader("data.txt")) { // 读取文件 } catch (IOException e) { e.printStackTrace(); } // 自动调用close() ``` 3. **错误隔离与调试** 通过异常堆栈快速定位问题: ``` Traceback (most recent call last): File "demo.py", line 3, in <module> print(1/0) ZeroDivisionError: division by zero ``` #### 三、异常处理的重要性 | 场景 | 无异常处理的结果 | 有异常处理的结果 | |---------------------|------------------------|------------------------| | 文件读取失败 | 程序崩溃 | 提示错误并记录日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值