当前位置: 首页 > backend >正文

从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 没有优劣之分,关键看你的业务是 "必须等对方说完话才能继续",还是 "可以先布置任务,稍后看结果"。就像木匠工具箱里的锯子和锤子,选对工具的前提,是先想清楚你要做什么家具。​

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

http://www.xdnf.cn/news/6650.html

相关文章:

  • 大模型相关技术综述
  • 蒟蒻编程日志
  • 高速光耦在通信行业的应用(五) | 5Mbps通信光耦的特性
  • RabbitMQ 扇形交换器工作原理详解
  • 校园社区小程序源码解析
  • 【打破信息差】萌新认识与入门算法竞赛
  • 12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建
  • Python训练打卡Day25
  • 算法基础 -- 小根堆构建的两种方式:上浮法与下沉法
  • Node打包报错:Error: error:0308010C:digital envelope routines::unsupported
  • rk3576 gstreamer opencv
  • c++ 类的语法4
  • 我用 Appuploader绕过 Mac,成功把 iOS 应用上线了 App Store
  • 51单片机串口
  • 现场血案:Kafka CRC 异常
  • HANA数据库死锁
  • PYTHON训练营DAY27
  • qt5.14.2 opencv调用摄像头显示在label
  • CS016-4-unity ecs
  • MySQL查询不区分大小写问题剖析
  • 58. 区间和
  • Multimodal models —— CLIP,LLava,QWen
  • java输入输出类
  • MySQL MCP 使用案例
  • ubuntu 更新华为源
  • windows下authas调试tomcat
  • 突发,苹果发布下一代 CarPlay Ultra
  • WEB安全--Java安全--shiro721反序列化漏洞
  • 快速选择算法:优化大数据中的 Top-K 问题
  • 本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能