基于公共业务提取的架构演进——外部依赖防腐篇
背景
有了前两篇的帐号权限提取和功能设置提取的架构演进后,有一个问题就紧接着诞生了,对于诸多业务方来说,关键数据源的迁移如何在各个产品落地?
要知道这些数据都很关键: - 对于帐号,获取不到帐号信息是无法让用户约会和入会的; - 对于权限,用户有没有某个功能,如海外加速,直播、虚拟背景,完全依赖于权限数据; - 对于功能设置,参会人入会是否要静音,是否能开启视频则取决于用户的功能设置项;
这么关键的数据,又做了如此大的调整,从业务方角度不得不考虑两个问题:
- 如何降低各个业务服务的接入难度?
- 即使各个服务都费力的将代码接入,一旦上线后发现问题如何快速补救?
这是一个全局性的问题,需要统一考虑,否则之前看似合理的架构优化却可能因为对接时的实际困难而落不了地。
也就是这些非功能层面的问题,却有可能让一个架构优化中途夭折,我们需要从软件工程层面解决这些问题。
2. 思路
从业务对接的角度来看,我们要解决两个典型问题:
- 如何减少对接的工作量;
- 如何降低对接后的上线风险;
这两个问题,我们通过以下4步来解决。
2.1 代码调用归一化处理
当系统中各个业务层都直接访问DB时,我们是很难作数据源调整的,所以我们首先要作的是:数据访问的归一化处理。简单讲:就是把业务层对DB的访问收扰到一个公共库中,包括两个层面:
- 服务内部,所有业务接口访问帐号设置类数据都通过公共库来访问;
- 系统层面,所有服务访问帐号设置类数据都通过公共库来访问;
如下图所示:

在这个收拢的过程中我们主要做几件事:
- 统一封装数据的访问接口,各个业务都走相同的接口来访问数据;
- 统一数据格式,例如:所有业务访问帐号都返回同一套数据结构体;
- 数据源没有改变,但各个服务由直接依赖DB改为依赖公共库;
2.2 接入新数据源
作了代码调用的归一化处理后,我们接入新数据源基本只需要改动公共库。具体工作为:
- 抽象一套数据访问的接口,让新数据源和老数据源都实现同一套接口;
- 从新数据源获取到数据后,可能需要做下数据格式的转换,让新、老数据源返回的数据格式统一;
抽象接口定义类图如下所示:

这套接口,屏蔽了老数据源和新数据源的获取差异,这样业务服务接入新数据源的工作量能降到最小。
2.3 快速回退支持
通过前面两步,公共库已经提供了新、老两套数据访问接口,业务方可能只需要一行代码改动做个选择即可。这里我们想讨论的一个问题是:当接入新数据源上线后,发现问题如何处理?
- 第一种选择:把版本回退,回退到老数据源的版本,这会带来其它修改(如客户故障修复)也被牵连回退;
- 第二种选择:我们做一个配置开关,通过修改配置,快速回退到老版本,其它修改都不受影响;
不难发现,第二种方式明显更稳妥,配置简单示意如下:
# AccountStore的实现版本选择
AccountStoreMode = v2
可能还需要在AccountStore的初始化代码中作一点改动来支持版本选择,比较简单,这里就不示例了。
2.4 降级处理
回退主要是解决已经出故障后如何快速恢复的问题,也就是不论我们恢复多快,至少已经有一部分用户受到了影响,那是否有什么办法来避免故障发生呢?
有,我们可以做数据获取的降级处理,做法也比较简单:当从新数据源获取不到时,可以尝试从老数据源再获取一次。

有同学可能有疑问:降级会不会带来数据的正确性问题?
确实有一定的概率,用户的帐号权限已经在新数据源发生变更,降级访问老数据获取到的还是旧数据,如果用户正好要使用依赖此权限项的功能,则有一定概率与用户预期不符。
但是问题在于:当面临帐号都获取不到的产品可用性问题时,个别功能是否符合预期这类局部问题,还有那么重要吗?而且还是一定概率。
这时候我们就要做权衡,评估哪个问题带来的影响更小,两害取其轻。
软件开发中往往很难有完美的方案,有时候因为技术复杂度,有时候因为成本,这时候做权衡就很重要,选一个
我们能够掌控、团队有能力实施、结果有一点折扣但也能接受的方案,往往更实用。
小结
本文以前面两篇文章账号权限提取和功能设置提取为背景,介绍了当外部依赖发生变化时,如何及时调整业务服务的结构设计。通过引入外部依赖防腐层,来减化架构调整带来的对接工作量,并降低对接新数据源的上线风险。
在软件设计中,防腐层往往被描述为一个适配器,用以将外部依赖和内部业务逻辑解耦。还是之前那个观点,名称叫什么不重要,重在能用它解决项目中的实际问题。
防腐层的适用范围远不止于此,其实从长远角度考虑,产品系统中很多模块都应该设计外部依赖防腐层,像数据库、外部服务接口、消息队列、缓存等。这些看似稳定不变的基础设施,却会在某天因为一个市场风向或客户需求,而被公司要求果断的替换掉,例如:信创带来的技术国产化浪潮……
参考阅读
- 从帐号权限提取的视角来看架构演进
- 从功能设置提取的视角来看架构演进
相关文章:
基于公共业务提取的架构演进——外部依赖防腐篇
背景 有了前两篇的帐号权限提取和功能设置提取的架构演进后,有一个问题就紧接着诞生了,对于诸多业务方来说,关键数据源的迁移如何在各个产品落地? 要知道这些数据都很关键: - 对于帐号,获取不到帐号信息是…...
uniapp小程序接入腾讯云【增强版人脸核身接入】
文档地址:https://cloud.tencent.com/document/product/1007/56812 企业申请注册这边就不介绍了,根据官方文档去申请注册。 申请成功后,下载【微信小程序sdk】 一、解压sdk,创建wxcomponents文件夹 sdk解压后发现是原生小程序代…...
Sass 最基础的语法
把每个点最简单的部分记录一下,方便自己查找 官方文档链接 Sass 笔记 1. & 父选择器,编译后为父选择器2. : 嵌套属性3. $ 变量3.1 数据类型3.2 变量赋值3.3. 数组3.4. map 4. 算数运算符5. #{}插值语法5.1 可以在选择器或属性名中使用变量5.2 将有引…...
2023年11月数据库流行度最新排名
点击查看最新数据库流行度最新排名(每月更新) 2023年11月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…...
JavaEE-部署项目到服务器
本部分内容为:安装依赖:JDK,Tomcat,Mysql;部署项目到服务器 什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。 为什么我们需要…...
计算机网络期末复习-Part1
1、列举几种接入网技术:ADSL,HFC,FTTH,LAN,WLAN ADSL(Asymmetric Digital Subscriber Line):非对称数字用户线路。ADSL 是一种用于通过电话线连接到互联网的技术,它提供…...
Redis系列-Redis过期策略以及内存淘汰机制【6】
目录 Redis系列-Redis过期策略以及内存淘汰机制【6】redis过期策略内存淘汰机制算法LRU算法LFU 其他场景对过期key的处理FAQ为什么不用定时删除策略? Ref 个人主页: 【⭐️个人主页】 需要您的【💖 点赞关注】支持 💯 Redis系列-Redis过期策略以及内存淘…...
多语言翻译软件 Mate Translate mac中文版特色功能
Mate Translate for Mac是一款多语言翻译软件,Mate Translate mac可以帮你翻译超过100种语言的单词和短语,使用文本到语音转换,并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版特色功能…...
Python GUI标准库tkinter实现与记事本相同菜单的文本编辑器(一)
介绍: Windows操作系统中自带了一款记事本应用程序,通常用于记录文字信息,具有简单文本编辑功能。Windows的记事本可以新建、打开、保存文件,有复制、粘贴、删除等功能,还可以设置字体类型、格式和查看日期时间等。 …...
Decimal.ToString()堆栈溢出异常
Decimal.ToString() 堆栈溢出异常 导致以下报错: A process serving application pool XXX suffered a fatal communication error with the Windows Process Activation Service. The process id was 7132. The data field contains the error number. Application pool …...
com.genuitec.eclipse.springframework.springnature
Your IDE is missing natures to properly support your projects. Some extensions on the eclipse marketplace can be installed to support those natures. com.genuitec.eclipse.springframework.springnature 移除 <nature>om.genuitec.eclipse.springframework.…...
wangeditor富文本编辑器的使用(vue)
官网 官方demo 参考 安装 yarn add wangeditor/editor yarn add wangeditor/editor-for-vue 封装的富文本组件 <template><div style"border: 1px solid #ccc"><Toolbarstyle"border-bottom: 1px solid #ccc":editor"editorRef"…...
物联网水表有什么弊端吗?
物联网水表作为新一代智能水表,虽然在很大程度上提高了水资源的管理效率,但也存在一定的弊端。在这篇文章中,我们将详细讨论物联网水表的弊端,以帮助大家更全面地了解这一技术。 一、安全隐患 1.数据泄露:物联网水表通…...
安卓 车轮视图 WheelView kotlin
安卓 车轮视图 WheelView kotlin 前言一、代码解析1.初始化2.初始化数据3.onMeasure4.onDraw5.onTouchEvent6.其他 6.ItemObject二、完整代码总结 前言 有个需求涉及到类似这个视图,于是在网上找了个轮子,自己改吧改吧用,拿来主义当然后&…...
升级Redisson版本兼容问题
升级版本:从 3.10.6 升级到3.18.0 报错: java.io.IOException: Unsupported protocol version 252 java.io.IOException: Unsupported protocol version 252at org.jboss.marshalling.river.RiverUnmarshaller.start(RiverUnmarshaller.java:1375)at org.redisson…...
前端框架Bootstrap
前端框架Bootstrap 该框架已经帮我们写好了很多页面样式,如果需要使用,只需要下载对应文件 直接CV拷贝即可 在使用Bootstrap的时候,所有的页面样式只需要通过修改class属性来调节即可 什么是Bootstrap Bootstrap是一个开源的前端框架…...
Flink SQL TopN语句详解
TopN 定义(⽀持 Batch\Streaming): TopN 对应离线数仓的 row_number(),使⽤ row_number() 对某⼀个分组的数据进⾏排序。 应⽤场景: 根据 某个排序 条件,计算 某个分组 下的排⾏榜数据。 SQL 语法标准&am…...
k8s之数据卷
一,存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态&#…...
服务器网络
配置 通常使用ping查看网络 如果能ping通,不能ssh登陆,安装 sudo apt update sudo apt install openssh-server如果已经安装,查看防火墙状态,inactive(不活跃) sudo ufw status sudo ufw allow ssh sudo ufw reload查看ssh状态 s…...
YOLOv8-seg 分割代码详解(一)Predict
前言 本文从 U-Net 入手熟悉分割的简单方法,再看 YOLOv8 的方法。主要梳理 YOLOv8 的网络结构,以及 Predict 过程的后处理方法。 U-Net 代码地址:https://github.com/milesial/Pytorch-UNet YOLOv8 代码地址:https://github.com/…...
【工业级Python边缘推理框架选型白皮书】:基于237个边缘节点实测数据,NPU/GPU/CPU场景下轻量化吞吐量TOP3方案揭晓
更多请点击: https://intelliparadigm.com 第一章:Python边缘计算模型轻量化概述 在资源受限的边缘设备(如树莓派、Jetson Nano、ESP32-S3 搭载 MicroPython 环境)上部署深度学习模型,面临内存占用高、推理延迟大、功…...
这才是我们热血沸腾的组合技啊!
臭猪妞更新文章不更,纪念日更得轻快 附:256天创作纪念日 平常会发一些题解,笔记,不太勤快。 我的第一篇文章是《P5736 【深基7.例2】质数筛题解》(当时只会发题解,也才学到了排序) 现在&#…...
流程型制造业生产优化,未来将如何被大模型技术重构?2026智造深研:实在Agent驱动端到端生产闭环
在2026年的工业版图中,流程型制造业——涵盖化工、冶金、石化、能源等支柱产业,正经历着自工业4.0以来最深刻的范式转移。过去,这些行业依赖于高度确定的工艺包和基于规则的自动化系统;而现在,大模型技术正从底层逻辑上…...
企业安全风险管理新方法:RRR框架解析与应用
1. 企业安全风险管理的新视角:Riches, Ruins & Regulations方法解析在当今数字化时代,企业安全团队面临着一个根本性挑战:如何在有限的资源下,有效保护那些真正可能摧毁企业的关键业务风险?传统安全评估方法往往陷…...
Claude Code:AI智能体如何重塑开发工作流,从命令行到智能协作
1. 从命令行到智能体:为什么Claude Code是开发者的下一个必备工具如果你和我一样,每天有超过一半的时间是在终端里度过的,那么你肯定理解那种在命令行、代码编辑器和浏览器之间不断切换带来的割裂感。传统的开发流程中,我们手动执…...
AI协作新范式:openJiuwen社区首发Coordination Engineering全栈技术体系
AI Agent正在经历一场工程范式的跃迁。从Prompt Engineering,教会模型如何回答问题;到Context Engineering,为Agent注入恰到好处的上下文;再到Harness Engineering,让单个Agent拥有工具调用、记忆管理、任务规划等完整…...
脑机接口新手指南:如何用深度学习(CNN/LSTM/Transformer)搞定SSVEP信号分类?
脑机接口新手指南:深度学习模型在SSVEP信号分类中的实战选择 第一次接触脑机接口(BCI)的研究者,面对EEGNet、C-CNN、SSVEPNet这些名词时,往往会陷入选择困难。SSVEP信号分类不是简单的"哪个模型准确率高就用哪个",而是需…...
论文投稿前让AI预审太好用啦!!!
作为一个拿过2项国自然青年基金、带过3届硕博生的高校青椒,今天给大家聊点掏心窝子的稿件打磨经验,都是我踩了无数坑、熬了无数夜攒出来的干货,不管你是要申基金、写毕业论文还是报专利,都能用得上。首先先给大家列3个科研人最容易…...
springboot+vue3宠物领养系统 原生微信小程序
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点特色功能建议安全考虑项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 后端(SpringBoot&…...
3个步骤告别Switch限制:用大气层系统解锁游戏机隐藏潜能
3个步骤告别Switch限制:用大气层系统解锁游戏机隐藏潜能 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否曾想过,为什么别人的Switch能运行自制软件、修改游戏…...
