本文转载自微信公众号「Java极客技术」,作者鸭血粉丝。转载本文请联系Java极客技术公众号。
阿粉之前看了一场架构师之路沈剑老师的一场直播,最近又重温了一下,根据自己的认知总结了一下,分享给大家。
MQ 想必大家或多或少都用过,接入 MQ 之后的整体架构如下:
可以看到使用 MQ 之后,上下游通信就变成图上的这种方式。
这种跨进程的通信方式,我们还有一种常用的解决方案,使用 Dubbo 等这类 RPC 服务。
理论上使用 RPC 的跨进程通信的场景,使用 MQ 也能解决,当然反过来也能说通。
那为什么不都用 RPC,或者 MQ 来解决那?
这其实都是业务场景决定的,抛开业务场景来谈架构都是耍流氓!没有全能的架构,只要适合的架构。
下面我们来看看哪些场景适合 RPC,而哪些场景适合 MQ。
RPC 场景
使用 RPC 的场景一般都是上游服务需要实时依赖下游服务的返回。
我们以一个登录服务为例,架构图如下:
用户发起的登录请求首先由对外的 WEB 服务接受,然后 WEB 服务服务调用用户服务查询用户信息,然后比对用户密码。
也就是说我们的 WEB 应用需要实时依赖用户服务返回的用户信息,如果没有返回,这次登录将会失败。
假如这个场景我们用 MQ 代替, WEB 应用发送 MQ 消息之后,然后流程就结束了,此时 WEB 应用无法拿到用户信息。
所以说对于这种需要强依赖下游返回的场景,使用 MQ 将会带来以下不足:
MQ 场景
上游不关心下游结果的场景举个例子,在我们第三方支付系统中,每支付成功一笔,都需要计算手续费。
这个场景我们显然可以使用 RPC 完成调用,但是实际上,支付系统是不关心的计费系统的结果,两个系统不存在直接强依赖的关系。
大家可以想象一下,用户实际上已经收到银行卡扣款短信了,但是支付系统因为计费系统失败,导致对外返回是失败的结果。这对于用户来讲,不能接受啊。我都付钱了,你却告诉我支付异常。
所以对于这种场景,直接使用 RPC 调用由以下几点不足:
那一定要用 MQ 解决吗?
其实不一定,对于我们上面举的场景,我们其实可以使用异步 RPC 或者线程池异步调用 RPC 就可以解决。
毕竟增加一个 MQ, 系统就变得更加复杂,我们还要单独运维 MQ,这对于小团队来讲,工作量还是很大的。
但是这种方式,还是解决不了,增加一个下游系统,上游系统还要改动的代码囧境。
增加 MQ 解耦
这个场景使用 MQ 解耦,带来几点优点:
数据驱动的定时任务场景举个例子,支付公司每日都需要对账,主要目的是核实自己系统的应收的钱与支付渠道端是否一致,主要流程分为以下几步:
定时任务下载渠道对账文件,下载方式可能为 Http 接口下载,也有可能 SFTP 下载
定时任务解析对账文件,然后将对账数据入库
定时任务将自己本端支付数据与对账数据核对
上面的定时任务使用 Spring-Schedule 调度,假设各个定时任务下载时间如下所示:
上图中三个任务,任务二需要依赖任务一完成,而任务三又需要依赖任务二完成。
我们之前使用这种模式,通常会碰到几个问题:
使用 MQ解耦
使用 MQ 解耦之后架构图如下:
这种方式,只要任务一的定时任务准时启动,任务一完成之后发送 MQ 消息,任务二收到之后就会启动任务,结束之后再发送消息给 MQ。任务三流程同任务二
使用这种方式存在优点为:
总结
对于上游需要关注下游返回结果的场景,不适合使用 MQ。
适合使用 MQ 的场景有:
上游不关心下游结果的场景
数据驱动的定时任务依赖
前言 微服务成了互联网架构的标配模式,对微服务之间的调用的流量治理和管控就尤...
本文介绍如何查看已有的实例自定义数据。 前提条件 您已配置实例自定义数据。详...
本教程将指引您搭建一个IPv4网段的VPC,并为VPC中的ECS绑定一个弹性公网IP访问In...
北京怎么申请 域名 ?网站是现在任何企业、商家不可或缺的部分,在互联网中任何...
全球权威咨询机构 IDC 发布 《中国视频云市场跟踪(2020 下半年)》报告: 阿里...
蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友。...
我们一般写应用都需要有后台管理系统,那么uni-app也不例外。 本次内容假设我们...
【混合云一体机升级发布】 https://yqh.aliyun.com/live/apsara_stack_appliance...
很多企业普遍认为,迁移到云端会扩大攻击面,因此,在云端存储数据不如在本地存...
Web Function 使用体验 (请在 PC 端访问) Web Function 产品文档:https://clo...