文章目录

  • 前言
  • 一、MQ是什么?
  • 1.1基本概念
  • 1.2MQ的优势和劣势
  • 优势
  • 应用解耦
  • 异步提速
  • 削峰填谷
  • 劣势
  • 二、常见的MQ产品
  • 总结



前言

实习之MQ学习历程


一、MQ是什么?

1.1基本概念

MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信(分布式系统:A、B两系统职责不一样,但是组合起来是一个大的系统,我们就称之为分布式系统)
分布式系统的通信问题:
有两种通信方式1.直接远程调用 2.发送者(生产者)发送给中间者(中间件),由中间者发送给接收者(消费者)。MQ属于第二种

mns消息队列测试 mq消息队列介绍_java


mns消息队列测试 mq消息队列介绍_java_02

1.2MQ的优势和劣势

优势

1.应用解耦
2.异步提速
3.削峰填谷

应用解耦
我们写代码都追求高内聚低耦合,因为耦合度降低了可维护性就提高了

mns消息队列测试 mq消息队列介绍_网络_03


由订单系统之间耦合三个子系统,会出现两个问题:


1.容错性低:列如库存系统产生异常导致库存系统挂掉,那么在用户下订单的时候整个链路走不通,可能导致订单系统出现问题


2. 可复用性低:例如要新增模块,那么只能在订单系统上修改

通过中间件解决直接通过远程调用的时带来得弊端

mns消息队列测试 mq消息队列介绍_java_04

1.当用户发送订单给MQ,MQ就直接返回订单成功的响应 而后续的三个子系统只需要在MQ中把订单系统的数据拿出来,在自己的系统里去消费,从而把订单系统与三个子系统隔离起来了,子系统挂掉也没有关系,因为数据存在MQ中,只要子系统恢复以后,再从MQ中拿到数据执行,最终数据肯定正常,容错性提高
2.增加新模块 新模块也只用在MQ中拿数据 订单系统不需要改代码

异步提速

mns消息队列测试 mq消息队列介绍_订单系统_05

1.直接通过远程调用,会依次调用三个子系统,子系统没问题则存入数据库 耗时920ms

mns消息队列测试 mq消息队列介绍_网络_06

加入MQ中间件时,则只需要存入库操作与给MQ发送数据操作 就返回成功信息给前端,而三个子系统是否执行成功不影响,子系统再慢慢从mq拿数据执行 只需要消费25ms 提高了系统的吞吐量

削峰填谷

mns消息队列测试 mq消息队列介绍_mns消息队列测试_07

当请求远超A系统最大处理请求时,回导致A系统挂掉

mns消息队列测试 mq消息队列介绍_网络_08


当请求超过A系统最大请求时:因为用户对接的是MQ,然后A系统再慢慢从MQ拉取最大处理请求量处理请求 提高了系统的稳定性

劣势
1.系统可用性降低
系统引入的外部依赖越多,系统稳定性越差,一旦MQ宕机,就会对业务造成影响
2.系统复杂度提高
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用,需要考虑消息有没有被重复消费,消息丢失,与顺序问题。
3.一致性问题
A系统处理完业务,通过MQ给子系统发消息数据,子系统有些处理成功有些失败,如何保证消息数据处理的一致性

mns消息队列测试 mq消息队列介绍_大数据_09

二、常见的MQ产品

RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等、Redis也可以直接充当消息队列

mns消息队列测试 mq消息队列介绍_网络_10

总结

使用MQ条件

1.生产者不需要从消费者处获取反馈,引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走,即所谓异步成为了可能
容许短暂的不一致性。
解耦、提速、削峰这些方面的收益超过加入MQ、管理MQ这些成本