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

基于公共业务提取的架构演进——外部依赖防腐篇

背景

有了前两篇的帐号权限提取和功能设置提取的架构演进后,有一个问题就紧接着诞生了,对于诸多业务方来说,关键数据源的迁移如何在各个产品落地?

要知道这些数据都很关键: - 对于帐号,获取不到帐号信息是无法让用户约会和入会的; - 对于权限,用户有没有某个功能,如海外加速,直播、虚拟背景,完全依赖于权限数据; - 对于功能设置,参会人入会是否要静音,是否能开启视频则取决于用户的功能设置项;

这么关键的数据,又做了如此大的调整,从业务方角度不得不考虑两个问题:

  1. 如何降低各个业务服务的接入难度?
  2. 即使各个服务都费力的将代码接入,一旦上线后发现问题如何快速补救?

这是一个全局性的问题,需要统一考虑,否则之前看似合理的架构优化却可能因为对接时的实际困难而落不了地。

也就是这些非功能层面的问题,却有可能让一个架构优化中途夭折,我们需要从软件工程层面解决这些问题。

2. 思路

从业务对接的角度来看,我们要解决两个典型问题:

  • 如何减少对接的工作量;
  • 如何降低对接后的上线风险;

这两个问题,我们通过以下4步来解决。

2.1 代码调用归一化处理

当系统中各个业务层都直接访问DB时,我们是很难作数据源调整的,所以我们首先要作的是:数据访问的归一化处理。简单讲:就是把业务层对DB的访问收扰到一个公共库中,包括两个层面:

  1. 服务内部,所有业务接口访问帐号设置类数据都通过公共库来访问;
  2. 系统层面,所有服务访问帐号设置类数据都通过公共库来访问;

如下图所示:

在这个收拢的过程中我们主要做几件事:

  1. 统一封装数据的访问接口,各个业务都走相同的接口来访问数据;
  2. 统一数据格式,例如:所有业务访问帐号都返回同一套数据结构体;
  3. 数据源没有改变,但各个服务由直接依赖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"…...

物联网水表有什么弊端吗?

物联网水表作为新一代智能水表&#xff0c;虽然在很大程度上提高了水资源的管理效率&#xff0c;但也存在一定的弊端。在这篇文章中&#xff0c;我们将详细讨论物联网水表的弊端&#xff0c;以帮助大家更全面地了解这一技术。 一、安全隐患 1.数据泄露&#xff1a;物联网水表通…...

安卓 车轮视图 WheelView kotlin

安卓 车轮视图 WheelView kotlin 前言一、代码解析1.初始化2.初始化数据3.onMeasure4.onDraw5.onTouchEvent6.其他 6.ItemObject二、完整代码总结 前言 有个需求涉及到类似这个视图&#xff0c;于是在网上找了个轮子&#xff0c;自己改吧改吧用&#xff0c;拿来主义当然后&…...

升级Redisson版本兼容问题

升级版本&#xff1a;从 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 该框架已经帮我们写好了很多页面样式&#xff0c;如果需要使用&#xff0c;只需要下载对应文件 直接CV拷贝即可 在使用Bootstrap的时候&#xff0c;所有的页面样式只需要通过修改class属性来调节即可 什么是Bootstrap Bootstrap是一个开源的前端框架…...

Flink SQL TopN语句详解

TopN 定义&#xff08;⽀持 Batch\Streaming&#xff09;&#xff1a; TopN 对应离线数仓的 row_number()&#xff0c;使⽤ row_number() 对某⼀个分组的数据进⾏排序。 应⽤场景&#xff1a; 根据 某个排序 条件&#xff0c;计算 某个分组 下的排⾏榜数据。 SQL 语法标准&am…...

k8s之数据卷

一&#xff0c;存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#…...

服务器网络

配置 通常使用ping查看网络 如果能ping通&#xff0c;不能ssh登陆&#xff0c;安装 sudo apt update sudo apt install openssh-server如果已经安装&#xff0c;查看防火墙状态&#xff0c;inactive(不活跃) sudo ufw status sudo ufw allow ssh sudo ufw reload查看ssh状态 s…...

YOLOv8-seg 分割代码详解(一)Predict

前言 本文从 U-Net 入手熟悉分割的简单方法&#xff0c;再看 YOLOv8 的方法。主要梳理 YOLOv8 的网络结构&#xff0c;以及 Predict 过程的后处理方法。 U-Net 代码地址&#xff1a;https://github.com/milesial/Pytorch-UNet YOLOv8 代码地址&#xff1a;https://github.com/…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...