首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一句话说清:什么时候用RPC,什么时候用MQ(第63讲)

一句话说清:什么时候用RPC,什么时候用MQ(第63讲)

作者头像
架构师之路
发布于 2025-05-14 03:20:18
发布于 2025-05-14 03:20:18
1240
举报
文章被收录于专栏:架构师之路架构师之路

《架构师之路:架构设计中的100个知识点》

63. MQ-架构解耦利器

很多人说,MQ是架构解耦利器,能用MQ就不要用RPC,这个观点对吗?

什么时候用RPC?

当调用方需要关心执行结果,通常使用RPC调用。

图片
图片

登录页面调用passport服务,会根据passport服务的返回结果,区别执行登录成功,登录失败,执行错误。

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

switch(ret){

case(YES) : return YesHTML();

case(NO) : return NoHTML();

case(JUMP) : return 304HTML():

default : return 500HTML();

}

调用方关注执行结果时,使用RPC。

如果强行使用MQ进行上下游解耦呢?

图片
图片

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

那能否一律使用RPC调用呢?

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

场景还原

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

1. 用户发布帖子后,大数据部门要更新用户的画像;

2. 用户发布帖子后,信息质量部门要异步检查帖子是否合规;

3. 招聘业务最近在做用户促活,如果用户发布的是招聘帖子,要增加积分;

4. …

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

图片
图片

耦合为何存在?

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

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

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

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

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

如何解耦呢?

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

图片
图片

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

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

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

稍作总结

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

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

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

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

知其然,知其所以然。

思路比结论更重要。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ios线程和GCD和队列同步异步的关系
  进程是指在系统中正在运行的一个应用程序。比如同时打开QQ、Xcode,系统就会分别启动2个进程。截图
tandaxia
2018/09/27
2.7K0
ios线程和GCD和队列同步异步的关系
2018 - iOS 面试题汇总一般面试题BAT面试题
金三银四,相信最近很多人都在跳槽。那么面试题自然还是要看下的,在这我就把我手里收集到的面试题(朋友面试,网上收集等等)进行了汇总,希望可以帮到正在或者准备面试的你,同时我也可以自己在过一遍一般面试题 1.堆和栈的区别 1.内存管理范围 只有oc对象需要进行内存管理 非oc对象类型比如基本数据类型不需要进行内存管理 2.内存管理本质 因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release OC对象存放于堆里面(堆内存要程序员手动回收) 非OC
陈雨尘
2018/06/07
6.6K0
iOS-多线程详解
欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 2.线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程,称为主线程) 一个进程(程序)的所有任务都在线程中执行 3. 进程和线程的比较 1.线程是CPU调用(执行任务)的最小单位。 2.进程是CPU分配资源的最小单位。 3.一个进程中至少要有一个线程。 4
xx_Cc
2018/05/10
2.3K0
iOS基础问答面试题连载(三)-附答案
2016-11-2319:56:15 发表评论 3,614℃热度 1.请简单说明多线程技术的优点和缺点? 2.请简单说明线程和进程,以及他们之间的关系? 3.请简单说明在iOS开发中有哪些多线程的实现方案? 4.请简单说明主线程的作用,以及使用注意点? 5.请简单列出NSThread线程的几种状态,并说明状态转换的逻辑? 6.请简单说明如何简单的解决多线程访问同一块资源造成的线程安全的问题,以及注意点? 7.请简单介绍下什么是原子和非原子属性? 8.请简单介绍下GCD这门技术? 9.请简
timhbw
2018/05/03
9220
iOS开发者多线程学习之旅
说到锁,我们再来看看苹果爸爸的给出干货Synchronization Costs and Performance
CC老师
2019/01/23
4630
iOS 开发--怎样高效的使用多线程
多线程技术在移动端开发中应用广泛,GCD 让 iOS 开发者能轻易的使用多线程,然而这并不意味着代码就一定高效和可靠。深入理解其原理并经常结合业务思考,才能在有限的线程控制 API 中最大化发挥并发编程的能力,也能轻易的察觉到代码可能存在的安全问题并优雅的解决它。
猿_人类
2019/08/16
1K0
iOS多线程:『RunLoop』详尽总结RunLoop
本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Complete-learning-RunLoop.html 文中可能有部分错误,博主过两天整理并更新。 RunLoop 文章目录 RunLoop简介 1.1 什么是RunLoop? 1.2 RunLoop和线程 1.3 默认情况下主线程的RunLoop原理 RunLoop相关类 2.1 CFRunLoopRef 2.2 CFRunLoopModeRe
程序员充电站
2018/05/31
2.2K0
iOS面试知识总结之基本概念总结
凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知识很好的表述出来。闲暇之余我把一些常见的
梧雨北辰
2018/04/24
1.2K0
iOS面试知识总结之基本概念总结
iOS - 多线程(一):初识
安全+效率:因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。
师大小海腾
2020/04/16
7250
2017年5月iOS招人心得(附面试题)
在2017年5月中旬,技术老大让我招两个1-2年的iOS开发,把简历的筛选和第一轮技术面试的任务交给了我。于是便自己准备了这套面试题。
用户2932962
2018/08/30
5970
2017年5月iOS招人心得(附面试题)
iOS多线程——你要知道的NSOperation都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不明白的读者还请自行查阅。本系列文章将分以下几篇文章进行讲解,读者可按需查阅。 iOS
WWWWDotPNG
2018/04/10
1.7K0
iOS多线程——你要知道的NSOperation都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
面试iOS 机会在自己手中
前言 面试是我们工作的敲门砖,正好现在也到了我们金九银十的招聘季,在这我汇出32个面试题希望能帮到正在面试的你。 加油(同样有不足的地方还望指出我们一起商讨,有兴趣的可以加我的iOS交流群: 6423
编程怪才-凌雨画
2020/09/15
6260
面试iOS 机会在自己手中
iOS 从实际出发理解多线程
前言 ----       多线程很多开发者多多少少相信也都有了解,以前有些东西理解的不是很透,慢慢的积累之后,这方面的东西也需要自己好好的总结一下。多线程从我刚接触到iOS的时候就知道这玩意挺重要的,但那时也是能力有限,没办法很好的理解它,要是只是查它的概念性的东西,网上一搜一大把,我们再那样去总结就显得意义不大了。这篇文章从我刚开始构思着去写的时候,就希望自己能换个角度去写,想从实际问题出发总结多线程,那就从第三方以及自己看到的一些例子还有前段时间读的多线程和内存管理的书中分析理解总结一下多线程。 这几
Mr.RisingSun
2018/02/06
8100
iOS 从实际出发理解多线程
iOS多线程:『NSOperation、NSOperationQueue』详尽总结
本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文更新时间:2018年03月06日17:27:55 笔者对之前写的原文重新整理,修改了部分内容,又增加了许多关于 NSOperation、NSOperationQueue 的知识及用法,希望大家喜欢。 本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。 通过本文,您将了解到: NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用
程序员充电站
2018/05/31
1K0
iOS_多线程四:NSThread + performSelector + 总结
(3)、performSelector隐式创建 (顺便说一下performSelector其他方法)
mikimo
2022/07/20
5630
阿里、字节:一套高效的iOS面试题( 多线程 GCD底层原理篇)
dispatch_group_create() + dispatch_group_wait()
会写bug的程序员
2020/06/18
5K0
阿里、字节:一套高效的iOS面试题( 多线程 GCD底层原理篇)
iOS property的多线程问题解析
先解析提供的要素: a.nonatomic的NSArray属性; b.异步执行,gcd并发队列; c.多个block,对myNumberArr的多次读写操作;
落影
2020/08/25
1.3K0
iOS property的多线程问题解析
iOS 之 异步绘制原理
这其中的工作都是在主线程中完成的,这就导致了主线程频繁的处理 UI 绘制的工作,如果要绘制的元素过多,过于频繁,就会造成卡顿。
网罗开发
2021/04/07
3.5K0
iOS 之 异步绘制原理
iOS 如何高效的使用多线程
多线程技术在移动端开发中应用广泛,GCD 让 iOS 开发者能轻易的使用多线程,然而这并不意味着代码就一定高效和可靠。深入理解其原理并经常结合业务思考,才能在有限的线程控制 API 中最大化发挥并发编程的能力,也能轻易的察觉到代码可能存在的安全问题并优雅的解决它。
波儿菜
2018/12/28
1.8K0
iOS 面试策略之语言工具-Objective-C
Objective-C 是苹果为 iOS 和 Mac 开发量身定制的语言。它随着 iPhone 的出现而大火,直到今天国内外大多数的 App 依然是用 Objective-C 在写。
会写bug的程序员
2021/05/07
7850
iOS 面试策略之语言工具-Objective-C
推荐阅读
相关推荐
ios线程和GCD和队列同步异步的关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档