有一个观点已经被说烂了:使用 MQ 可以帮助业务系统解耦。

想法很简单,在业务状态流转时,如果没有 MQ,那么其它系统想要知道状态变了,那就需要核心流程系统去主动做通知。

比如电商系统里订单从创建到处理中状态切换了,客服系统需要知道,风控系统需要知道,用户系统也需要知道。

一个典型的依赖关系

这里的通知通过 RPC 来进行,下游系统需要的数据可以在这次 RPC 里携带上,也可以在请求的时候让下游系统自己去查。

下游系统增加的时候,核心业务的代码也需要修改,比如新做了一个积分系统,现在订单状态流转积分系统也想知道。

下游增加新系统时

核心系统需要不停地增加调用关系来迎合下游新增的业务方需求。这些边边角角的计算逻辑和订单系统本身没啥关系,但是因为下游需要拿到这些数据,我们就需要自己用 RPC 去调用下游的接口。这确实不太合理。

当下游系统发生事故时,很容易让核心系统也跟着一起躺了:

下游炸了上游也得炸

这种情况下,核心系统对下游系统的依赖主要是因为 core system mentions downstream system,和单系统内的耦合是一样的。

解决这种耦合的最简单的方法,在单模块的情况是用依赖反转,在分布式场景下,就是引入消息队列:

用消息队列解除上游对下游的依赖

在修改之后,每次订单流转只要将 domain event 发送到消息队列就可以了。下游系统有计算需求,自己去订阅相关的 topic 即可。

有了消息队列时下游增加新系统

讲到这里就结束,那就是童话故事了。在一开始的图中,我们存在的依赖是双向的:

双向依赖

核心系统依赖下游系统是因为调用关系,下游系统依赖核心系统是因为下游系统要使用核心系统的数据。

我们使用 MQ 只是解开了单个方向上的依赖,核心系统没有对下游系统的调用了。

有一个方向的依赖被解除了

这样下游系统在崩溃的时候,也就不太容易影响到核心系统的稳定性。

隐式依赖导致事故

但下游系统对核心系统的数据依赖是不可能解除的,如果核心系统修改了产生 domain event 的代码,还是会导致下游系统出故障,很多情况下出故障都是一死死一片:

上游的 domain event 出问题的时候

大点的互联网公司经常是核心服务一做重构,下游服务哀鸿遍野。

数据依赖对于核心系统来说并不是一个可以显式看到的依赖,所以对于核心系统来说,这是外部对我的隐式依赖。

看不见的依赖是很可怕的,所有人都会慢慢地逐渐忽视它,直到事故发生的那一天。

核心系统对下游系统重新建立依赖

虽然梦做的很好,但核心系统在服务用户的过程中,往往也是要给用户返回一些实时计算的数据的,这部分数据从哪里来?

很多就是从下游计算系统来,比如说,我的订单流转系统,现在要在用户积分达到某个条件的时候,做一些特殊逻辑。

随着业务的发展,我们最初解除掉的依赖,又重新被建立了。

回到原点

环形依赖回来了!这下两个系统可能又会变成你挂我也挂的情况了。兜兜转转,我们重新回到了原点。

推荐阅读:

我用休眠做并发控制,搞垮了下游服务

几个预防并发搞垮下游服务的方法

觉得有用就点一下  ????????????

消息队列解耦是骗小孩儿的相关推荐

  1. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  2. ibm mq并发访问队列_消息队列之九问九答

    问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...

  3. weblogic jms消息 删除_消息队列与消息中间件概述:消息中间件核心概念与技术选型...

    什么是消息? "消息"是在两台计算机间传送的数据单位. 消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 什么是队列? 队列(Queue)队列是一种先进先出 ...

  4. Kafka和其他消息队列

    消息队列(Message Queue) 消息: 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列:一种特殊的线性表(数据元素首尾相接),特殊之处在于只允许在首部 ...

  5. Kafka简介与消息队列

    消息队列的好处: 消息队列(Message Queue) 消息: 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列:一种特殊的线性表(数据元素首尾相接),特殊之 ...

  6. kafka消息队列学习笔记

    消息队列: (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端.这个模型的特点是 ...

  7. Java 消息队列、缓存、同步(个人理解:空谈)

    Java 消息队列.缓存.同步. 消息队列 我的理解:消息队列,将消息存入消息队列,然后就OK了. 系统之间原先调用通用接口,但引入了消息队列后,系统之间调用MQ消息队列. 好处:响应快,能累积请求, ...

  8. 应用消息队列设计可以解决哪些实际问题?

    消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ ...

  9. 【后端】消息队列--Kafka篇

    文章目录 kafka高性能原因 架构层面 IO层面 Kafka 设计目的 为何使用消息系统 概念 1.kafka Partition分区机制 1.1 分区个数选择 1.2 分区写入策略 1.3 top ...

最新文章

  1. 报名 | 2019清华大数据系统软件峰会
  2. java基础(九) 可变参数列表介绍
  3. CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/23
  4. abap 生成流水号每天从1开始_条码软件如何制作循环流水号
  5. 记一些茅塞顿开的事情
  6. cc压力测试_中小型网站如何防范CC攻击?
  7. 使用Java泛型和反射机制编写Excel文件生成和解析的通用工具类
  8. Mac翻译系列软件推荐一:欧路词典 for Mac
  9. matlab 线性方程 lu分解法_数值计算笔记-LU分解
  10. android游戏中期检查表,中期检查表教师评语
  11. ubuntu-22.04.1磁盘分区和挂载
  12. Java 与或非 判断
  13. html+css 模仿制作百度注册页面
  14. ArcGIS使用(一)创建ArcGIS应用
  15. Hotel booking -探索性数据分析(EDA)一(seaborn matplot pyecharts)
  16. 【前端】JS的BOM和DOM,事件,表单验证案例
  17. 黑龙江省计算机一级考试科目,黑龙江省2021年3月全国计算机等级考试时间和科目调整...
  18. 卡尔一键放技能--dota
  19. 软件测试职业发展规划
  20. 黑马程序员——构造器和方法

热门文章

  1. Apache Flink 漫谈系列(06) - 流表对偶(duality)性
  2. JS经常使用正則表達式【分享】
  3. Linux 6.5选包截图
  4. 让自己慢下来(2)-朋友们的回复
  5. 查找系列合集-二分查找
  6. 【十四】jvm 性能调优实例
  7. Python入门很难吗? 为什么越来越多的人都学Python?
  8. The Distribution File System
  9. Flask安装首页显示
  10. 几种SQL取日期部分的方法