为什么说,MQ,是互联网架构的解耦神器?

开发 开发工具
作为技术人,每每在心中骂上下游,骂兄弟部门,明明不应该联动,却要被动配合,就可能有潜在的耦合。今天一起来看一个,用错RPC的耦合场景。

什么是耦合?

耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。

[[419744]]

感官上,怎么发现系统中的耦合?

作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动配合,就可能有潜在的耦合。

今天一起来看一个,用错RPC的耦合场景。

一个架构常识:当调用方需要关心执行结果,通常使用RPC调用。

  1. ret = PassportService::userAuth(name, pass); 
  2. switch(ret){ 
  3.  case(YES) : return YesHTML(); 
  4.  case(NO) : return NoHTML(); 
  5.  case(JUMP) : return 304HTML(): 
  6.  default : return 500HTML(); 

上一篇《明明服务化了,为啥耦合更加严重了?》提到,执行结果的处理和业务强相关,则switch case应该放在上游业务方,而不应该放到底层通用服务。

登录页面调用passport服务,会根据passport服务的返回结果,区别执行登录成功,登录失败,执行错误。调用方关注执行结果时,不宜使用MQ通讯。

如果强行使用MQ通讯,调用方不能直接告之用户登录成功又或失败,阻塞住等待MQ通知回调不但使得编码复杂,还会引入消息丢失的风险,中间多加入一层,多此一举,基本没有人这么玩。

但如果调用方不关心执行结果,却仍然使用RPC调用,会引发上下游极大的耦合与瓶颈。

场景还原

有一个通用的上游服务,例如“帖子发布”服务,负责公司通用的帖子发布业务。有一些个性化的业务关心“用户发布帖子”这个事件,例如:

  • 用户发布帖子后,大数据部门要更新用户的画像;
  • 用户发布帖子后,信息质量部门要异步检查帖子是否合规;
  • 招聘业务最近在做用户促活,如果用户发布的是招聘帖子,要增加积分;

个性化下游关注这个事件,但下游对事件的执行结果,“帖子发布”服务却并不关心,如果“帖子发布”服务通过RPC的方式去通知下游,就会有很大的问题。

耦合为何存在?

帖子发布服务,这本来应该是一个非常基础的服务,上游upper通过RPC调用将事件同步给事件关注业务方biz1/biz2/biz3:

(1)一旦有新的业务需求要关注这个事件,修改代码的是通用上游upper,此时通用服务的owner就在心里骂娘了“为何有需求的是你,修改代码的却是我”;

(2)一旦业务侧出问题,会影响上游通用基础服务,此时通用服务的owner又在心里骂娘了“我ca,稳定性的KPI,全被兄弟部门毁了”;

(3)一旦业务侧接口升级,上游基础服务需要配合升级,此时通用服务的owner可能又会抱怨“为何被动升级的人总是我”;

架构不合理,简直痛不欲生。

如何解耦呢?

如果事件发出方不关心订阅方的执行结果,不能用RPC,应该用MQ。

MQ能够做到上下游物理上和逻辑上都解耦:

(1)物理上解耦,增加MQ之后,上游互不知道彼此的存在,不会建立物理连接了,大家都只与MQ建立物理连接;

(2)逻辑上解耦,事件发布方甚至不用知道哪些下游订阅了这个消息,新增消息的订阅方只需要连接MQ就行了,不需要上游关注;

MQ是一个非常常见的物理上解耦、逻辑上也解耦的利器。

  • 关注下游执行执行结果,用RPC。
  • 不关注下游执行结果,用MQ,不用RPC。

这只是一个很小的优化点,但对于通知解耦却是非常有效。

希望每天收获一点点,架构就能美好一点点。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文 

 

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2017-12-26 15:52:31

MQ互联网耦合

2018-01-01 06:41:44

耦合互联网架构配置中心

2016-09-22 15:01:59

微服务互联网架构

2019-12-26 07:39:36

互联网架构ip

2018-11-05 11:22:00

物联网平台物联网IOT

2020-09-09 16:20:16

区块链比特币数字货币

2021-09-23 22:34:03

区块链互联网技术

2022-05-13 09:49:05

区块链互联网模型

2017-05-19 10:01:53

互联网

2019-05-13 10:30:34

互联网架构容量

2019-03-18 07:08:53

高可用互联网架构分布式

2016-09-22 15:55:39

互联网架构容量设计

2016-12-06 11:56:13

互联网架构高可用

2019-04-10 14:10:02

高并发分布式系统架构

2017-01-11 21:40:03

互联网架构高并发

2019-11-28 16:09:29

架构模板存储

2022-06-09 08:01:43

秒杀系统互联网架构

2012-09-19 15:43:21

云时代

2018-08-26 05:16:19

互联网LoRa网络运营商

2018-11-07 06:35:50

互联网服务化高可用架构
点赞
收藏

51CTO技术栈公众号