从RPA项目说说RPC和MQ的使用。

去年我负责一个 RPA(机器人流程自动化)项目,帮某电商公司搭建订单处理系统。项目里有个场景特别有意思:当用户下单后,系统需要同时触发库存扣减、物流调度、积分发放三个模块。一开始我们想都没想,直接用 RPC(远程过程调用)把三个接口串起来 ------ 毕竟这是最直观的做法,就像打电话一样,主系统调用库存接口,等库存扣减成功后,再调用物流接口,最后处理积分。​

但上线后很快出了问题:物流系统偶尔会因为运力调度延迟响应,导致整个订单处理流程卡住,甚至引发库存系统的连接池耗尽。更麻烦的是,积分模块后来新增了复杂的规则校验,每次修改都要同步调整主系统的调用逻辑,就像几个人手拉手跳舞,一个人绊倒整个队列都得停。这时我才意识到,当初对 "是否关注下游执行结果" 这个核心问题的判断太草率了 ------ 这个决策背后,藏着分布式系统设计中最关键的解耦哲学。​

一、RPC:像打电话一样的 "同步强依赖"​

我们可以把 RPC 比作打电话:你拨打对方号码(发起调用),必须等对方接通(服务响应),才能继续说下一件事。如果对方占线(服务忙),你只能一直等待或者听到忙音(超时报错)。这种模式有两个核心特点:​

1. 同步阻塞:结果必须即时反馈​

比如在银行转账场景,你调用 "扣款接口" 后,必须等对方确认 "收款账户到账" 才能完成交易。如果中间任何一个环节卡住,整个流程就会停滞。就像你去餐馆点菜,必须等厨师告诉你 "这道菜卖完了",才能决定换什么菜,没法先去做别的事。​

2. 强一致性依赖:上下游命运绑定​

还是用订单系统举例,主系统和库存、物流、积分模块通过 RPC 连接,就像用绳子把几艘船绑在一起:库存系统的网络波动会直接拖慢主系统,积分模块的代码修改可能引发主系统的调用异常。这种强耦合在系统规模较小时没问题,但一旦业务复杂,就像绑在一起的船遇到风暴,很容易全军覆没。​

适用场景:必须知道 "做没做成" 的关键步骤​

比如金融交易中的账户余额校验、电商中的库存实时锁定、火车票订票系统的座位抢占,这些场景必须即时确认下游操作是否成功,因为任何延迟或失败都会直接影响业务结果。就像你点外卖时,必须等商家确认接单才能付款,不能先付钱再不管有没有人接单。​

二、MQ:像发邮件一样的 "异步弱关联"​

后来我们在订单系统中引入了 MQ(消息队列),整个流程变成了这样:主系统下单后,把 "库存扣减"" 物流调度 ""积分发放" 三个任务打包成消息,扔进 MQ 这个 "邮箱",然后立刻告诉用户 "订单提交成功",再也不用等下游处理结果。实现这个还引入了一个叫"领域事件"的模型。下游系统各自从邮箱里取消息,慢慢处理 ------ 这就是 MQ 的核心逻辑,像发邮件一样:​

1. 异步解耦:发件人不用等收件人回复​

你发一封邮件给同事,不需要等对方读完并回复,就可以继续做其他事。MQ 也是如此:主系统发送消息后,不需要等待下游系统处理,甚至不需要知道下游系统是否存在(只要消息格式正确)。比如电商的短信通知系统,用户下单后发送 "通知短信" 的任务扔进 MQ,即使短信网关暂时故障,消息也会在队列中等待,等网关恢复后自动处理,不会影响主订单流程。​

2. 逻辑解耦:上下游独立进化​

用了 MQ 之后,我们的积分模块后来新增了 "会员等级校验"" 活动权益计算 " 等复杂逻辑,只需要修改积分系统自己的消息消费逻辑,主系统完全不需要改动。就像你给朋友写信,只要信封上的地址(消息格式)不变,朋友家里怎么装修(下游系统如何实现)都不影响你发信。这种解耦让每个系统可以独立升级、扩容,甚至替换成不同技术栈的实现(比如 Java 系统和 Python 系统通过 MQ 通信)。​

适用场景:不需要即时结果的 "异步任务"​

比如用户注册后的欢迎短信发送、电商中的订单日志记录、视频平台的转码处理(上传视频后,系统把转码任务扔进 MQ,用户可以先查看其他内容,不用等转码完成)。这些任务的特点是:主系统只需要 "触发动作",不需要立刻知道 "有没有做完",甚至允许一定的延迟(比如短信晚发几分钟不影响用户体验)。​

三、如何选择:关键看 "是否关心下游结果"​

回到最初的 RPA 项目,我们最终做了这样的调整:​

库存扣减必须用 RPC,因为这是订单成立的前提,必须即时确认库存是否足够;​

物流调度和积分发放改用 MQ,因为用户只要知道订单提交成功即可,物流什么时候分配、积分什么时候到账,不需要即时反馈。​

这个决策背后有三个核心判断标准:​

**1. 结果时效性:是否需要即时响应?**​

如果下游操作的结果会直接影响当前业务流程(比如付款必须等银行返回成功),用 RPC;如果可以后续处理(比如生成报表、发送通知),用 MQ。​

**2. 系统容错性:是否允许部分失败?**​

RPC 模式下,下游任何一个环节失败都会导致整个流程回滚(比如订单系统调用库存成功,调用物流失败,就需要回滚库存),这对事务一致性要求极高。而 MQ 模式下,主系统只负责发送消息,下游处理失败可以通过重试队列、人工干预等方式解决,不会影响主流程。就像你网购时,商家先扣库存,即使物流系统暂时故障,也可以后续人工处理发货,不需要立刻取消订单。​

**3. 业务扩展性:未来是否会频繁变动?**​

如果下游模块可能经常修改(比如积分规则频繁调整),或者需要新增更多下游系统(比如后来又要对接客服系统、风控系统),MQ 的解耦优势就会非常明显。因为每次新增需求,只需要让新系统监听对应的消息队列即可,主系统不需要任何改动,就像往邮箱里多添加几个收件人,发件人不用改邮件内容。​

四、从技术工具到架构思维:解耦的本质是 "责任分离"​

MQ 和 RPC 的选择,本质上是分布式系统设计中 "同步耦合" 与 "异步解耦" 的权衡。就像现实中的团队协作:​

RPC 相当于开会讨论,必须等所有人达成共识才能推进(强一致性) ;​
MQ 相当于发布任务清单,每个人按自己的节奏处理,最后汇总结果(最终一致性) 。​

理解这一点,即使不是技术人员,也能在工作中找到类似的场景:比如公司的审批流程,紧急的财务报销需要即时审批(类似 RPC),而常规的办公用品申请可以提交后先去工作,等审批通过再领取(类似 MQ)。这种 "是否需要即时反馈" 的思维,其实贯穿在所有需要多环节协作的场景中。​

最后小结

当年的 RPA 项目教会我最重要的一点:技术工具从来不是目的,而是解决业务问题的手段。MQ 和 RPC 没有优劣之分,**关键看你的业务是 "必须等对方说完话才能继续",还是 "可以先布置任务,稍后看结果"。**就像木匠工具箱里的锯子和锤子,选对工具的前提,是先想清楚你要做什么家具。​

如果你正在设计一个系统,或者遇到了类似的流程卡顿问题,不妨回到最本质的问题:这个环节,我真的需要知道下游有没有立刻做完吗? 想清楚这一点,或许就能找到更优雅的解耦方案。毕竟在分布式系统的世界里,"不把所有鸡蛋放在一个篮子里" 的智慧,和生活中的道理并无不同。

相关推荐
isyangli_blog3 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008113 小时前
FastAPI APIRouter
开发语言·python
Benszen3 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆3 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木3 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充3 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~3 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6164 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草4 小时前
反射、Tomcat执行
java·开发语言
雪的季节5 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt