MQ,互联网架构解耦神器

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

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

image.png

ret = PassportService::userAuth(name, pass);

switch(ret){

 case(YES) : return YesHTML();

 case(NO) : return NoHTML();

 case(JUMP) : return 304HTML():

 default : return 500HTML();

}

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

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

image.png

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

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

场景还原

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

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

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

image.png

耦合为何存在?

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

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

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

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

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

如何解耦呢?

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

image.png

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

  • 物理上解耦,增加MQ之后,上游互不知道彼此的存在,不会建立物理连接了,大家都只与MQ建立物理连接
  • 逻辑上解耦,事件发布方甚至不用知道哪些下游订阅了这个消息,新增消息的订阅方只需要连接MQ就行了,不需要上游关注

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

关注下游执行执行结果,用RPC;

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

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

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

你痛过吗,你被迫实现过本不应该你来实现的需求么?那帮转下。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
5月前
|
XML 数据库 数据格式
微服务技术系列教程(15) - SpringCloud - 互联网网站架构演变过程
微服务技术系列教程(15) - SpringCloud - 互联网网站架构演变过程
41 0
|
3月前
|
消息中间件 存储 JSON
RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
40 0
|
9天前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
30 0
RabbitMQ入门指南(二):架构和管理控制台的使用
|
26天前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
48 0
|
1月前
|
消息中间件 存储 Cloud Native
深度剖析 RocketMQ 5.0,架构解析:云原生架构如何支撑多元化场景?
了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管控链路、数据链路、客户端和服务端如何交互;学习 RocketMQ 如何实现数据的存储,数据的高可用,如何利用云原生存储进一步提升竞争力。
140040 1
|
1月前
|
消息中间件 缓存 API
|
3月前
|
存储 缓存 监控
【分布式】大型互联网项目架构目标
【1月更文挑战第25天】【分布式】大型互联网项目架构目标
|
3月前
|
达摩院 Java Apache
惊动“达摩院”的分布式架构笔记:火于互联网,据说来自于清华
一个星期前,一本Java架构笔记突然在互联网上爆火。因为内容的深度和广度,甚至连阿里最牛的研发中心都被惊动了,而且作者一周后直接被阿里挖走后定级P8,据说作者来自于清华。
|
3月前
|
消息中间件 存储 网络协议
MQ - 09 RabbitMQ的架构设计与实现
MQ - 09 RabbitMQ的架构设计与实现
64 0
|
4月前
|
消息中间件 前端开发 架构师
华为架构师复盘2024最全2340页面试题jvm+spring+redis+MQ+微服务
包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!