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

news2025/2/22 1:24:48

背景

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

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

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

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

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

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

2. 思路

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

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

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

2.1 代码调用归一化处理

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

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

如下图所示:

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

  1. 统一封装数据的访问接口,各个业务都走相同的接口来访问数据;
  2. 统一数据格式,例如:所有业务访问帐号都返回同一套数据结构体;
  3. 数据源没有改变,但各个服务由直接依赖DB改为依赖公共库;

2.2 接入新数据源

作了代码调用的归一化处理后,我们接入新数据源基本只需要改动公共库。具体工作为:

  • 抽象一套数据访问的接口,让新数据源和老数据源都实现同一套接口;
  • 从新数据源获取到数据后,可能需要做下数据格式的转换,让新、老数据源返回的数据格式统一;

抽象接口定义类图如下所示:

这套接口,屏蔽了老数据源和新数据源的获取差异,这样业务服务接入新数据源的工作量能降到最小。

2.3 快速回退支持

通过前面两步,公共库已经提供了新、老两套数据访问接口,业务方可能只需要一行代码改动做个选择即可。这里我们想讨论的一个问题是:当接入新数据源上线后,发现问题如何处理?

  • 第一种选择:把版本回退,回退到老数据源的版本,这会带来其它修改(如客户故障修复)也被牵连回退;
  • 第二种选择:我们做一个配置开关,通过修改配置,快速回退到老版本,其它修改都不受影响;

不难发现,第二种方式明显更稳妥,配置简单示意如下:

# AccountStore的实现版本选择
AccountStoreMode = v2

可能还需要在AccountStore的初始化代码中作一点改动来支持版本选择,比较简单,这里就不示例了。

2.4 降级处理

回退主要是解决已经出故障后如何快速恢复的问题,也就是不论我们恢复多快,至少已经有一部分用户受到了影响,那是否有什么办法来避免故障发生呢?

有,我们可以做数据获取的降级处理,做法也比较简单:当从新数据源获取不到时,可以尝试从老数据源再获取一次。

有同学可能有疑问:降级会不会带来数据的正确性问题?

确实有一定的概率,用户的帐号权限已经在新数据源发生变更,降级访问老数据获取到的还是旧数据,如果用户正好要使用依赖此权限项的功能,则有一定概率与用户预期不符。

但是问题在于:当面临帐号都获取不到的产品可用性问题时,个别功能是否符合预期这类局部问题,还有那么重要吗?而且还是一定概率。

这时候我们就要做权衡,评估哪个问题带来的影响更小,两害取其轻。

软件开发中往往很难有完美的方案,有时候因为技术复杂度,有时候因为成本,这时候做权衡就很重要,选一个我们能够掌控团队有能力实施结果有一点折扣但也能接受的方案,往往更实用。

小结

本文以前面两篇文章账号权限提取和功能设置提取为背景,介绍了当外部依赖发生变化时,如何及时调整业务服务的结构设计。通过引入外部依赖防腐层,来减化架构调整带来的对接工作量,并降低对接新数据源的上线风险。

在软件设计中,防腐层往往被描述为一个适配器,用以将外部依赖和内部业务逻辑解耦。还是之前那个观点,名称叫什么不重要,重在能用它解决项目中的实际问题。

防腐层的适用范围远不止于此,其实从长远角度考虑,产品系统中很多模块都应该设计外部依赖防腐层,像数据库、外部服务接口、消息队列、缓存等。这些看似稳定不变的基础设施,却会在某天因为一个市场风向或客户需求,而被公司要求果断的替换掉,例如:信创带来的技术国产化浪潮……

参考阅读

  • 从帐号权限提取的视角来看架构演进
  • 从功能设置提取的视角来看架构演进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1188531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

番外篇:Linux中好玩的指令(Ubuntu环境)

前言 我知道,Linux的学习总是枯燥乏味的,今天给大家带来一些好玩的指令,供大家娱乐开心,整理不易,希望大家能够多多支持一下。 1. lolcat指令 输入以下命令即可安装lolcat: sudo apt-get install lolcat 安…

sql注入学习笔记

sql注入原理 掌握sql注入漏洞的原理掌握sql注入漏洞的分类 万能用户名 777 or 11 #原句 select userid from cms_users where username ".$username." and password".md5 ( $password ) ."输入过后为 select userid from cms_users where username …

8-1、T型加减速控制【51单片机控制步进电机-TB6600系列】

摘要:本节介绍步进电机T型加减速的控制方法,本小节主要内容为该控制方法的推导与计算。目前各平台对该控制方法介绍的文章目前较多,但部分关键参数并未给出推导过程,例如误差系数0.676的推导等,本节在现有文章框架下&a…

【算法练习Day43】最佳买卖股票时机含冷冻期买卖股票的最佳时机含手续费

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 最佳买卖股票时机含冷冻期买…

银行转账截图p图制作,电子回执单,建设的,用易语言开发的,分享源码

闲着很无聊,刚好网上找到了一个默认,当然这个模版图我加了水印,只能是娱乐用,做不了啥坏事哈,然后软件是用易语言开发的,一个画板一些标签编辑框快照生成功能实现了这个软件,下面看下我的界面。…

软件安全测试怎么做?如何确保软件授权安全

在数字化不断演进的今天,软件安全测试变得至关重要。它验证了软件是否容易受到网络攻击,并检验恶意或意外输入对操作的影响。安全测试的目标是保障系统和信息的安全性和可靠性,确保它们不接受未授权的输入。 一、安全测试准备 开发者必须认识…

报名开启丨2023 SpeechHome 语音技术研讨会

2023 SpeechHome 语音技术研讨会将于11月18日—11月19日,在北京举办,同时举行开源语音技术交流会和第八届Kaldi技术交流会。 欢迎大家报名参加(报名链接在文末)! 本届研讨会覆盖5大主题,包括语音前沿技术…

Hadoop 视频分析系统

视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…

c++ 模拟进制之间的转换

c 模拟进制之间的转换 废话少说&#xff0c;直接上图 效果图 代码 #include<iostream> using namespace std;// 10进制转n进制 n>2 8 16 string _10to_n(int num,int n2){string res "";int yushu;char c;while( num!0 ){yushu num%n;switch (yushu) …

RPA处理重复工作,助力高效资金管理

在瞬息万变的市场竞争中&#xff0c;众多企业开展多元化经营以获取最大的经济效益。然而&#xff0c;企业的多元化经营程度越高&#xff0c;协调活动可能造成的决策延误也越多&#xff0c;其资金管理往往将面临更大的考验。随着新技术的发展&#xff0c;更多具备多元产业的企业…

华为云分布式数据库GaussDB,做金融数字化的坚实数据底座

本篇为大家分享下GaussDB的商业进展以及产品能力升级方面的最新情况。 1. 华为云GaussDB正在从金融覆盖到更多行业 从2019年开始&#xff0c;在华为内部通过持续的锤炼&#xff0c;推出了融合多项技术的自主创新的GaussDB数据库&#xff0c;而且陆续完成了华为公司内部核心系统…

Grafana安装配置

配置文件路径 /etc/grafana/grafana.ini 一、Grafana 安装 https://grafana.com/grafana/download?editionoss&pgget&plcmtselfmanaged-box1-cta1 以centos为例 #安装 sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.2.0-1.x86_64.rpm#修改端…

RT-Thread提供的网络世界入口 -net组件

作为一款在RTOS领域对网络支持很丰富的RT-Thread&#xff0c;对设备联网功能的支持的工具就是net组件。 位于/rt-thread/components/net路劲下&#xff0c;作为一款基础组件&#xff0c;env与Studio的工程配置项界面的配置项都依赖该目录下的Kconfig。 我们对网络功能的选择&am…

STM32 GPIO

STM32 GPIO GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口&#xff0c;也就是我们俗称的IO口 根据使用场景&#xff0c;可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V 数据0就是低电平&#xff0c…

【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架

万冬阳 公司&#xff1a;中国科学院软件所 小组&#xff1a;知识体系工作组 简介 Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库&#xff0c;它是对OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09; ArkUI进行深度定制的组件框架。Easyui可扩…

等保测评怎么做?有哪些流程?

现在很多信息系统想要上线都需要做等保测评&#xff0c;如果不能通过等保测评&#xff0c;不仅系统不允许上线&#xff0c;同时一旦出现了网络安全事件&#xff0c;相关企业还需要承担重要的责任。目前如果是为政府、事业单位、国企等开发系统&#xff0c;等保测评报告也是重要…

怎么在web显示模型的动态应力图?

要在网页上显示模型的动态应力图&#xff0c;需要执行几个步骤。动态应力图通常涉及有限元分析 (FEA) 模拟中的应力和应变数据的可视化&#xff0c;可以使用 Python、JavaScript 等工具以及 Three.js、Plotly 或 D3.js 等库来渲染图一个网页。以下是该过程的概述&#xff1a; …

互联网是如何运作的?以前端角度出发(b站objtube的卢克儿听课笔记)

1、你是如何用你的计算机设备发送数据和接受数据的呢&#xff1f; 例如我们是如何访问到哔哩哔哩的数据的 当你的设备开始连接到互联网时&#xff0c;会被分配一个IP地址。 而哔哩哔哩的服务器也接入到互联网&#xff0c;它也将被分配一个IP地址。 我们常说你访问某个网站&a…

数据库|Binlog故障处理之drainer周期性罢工

目录 一、背景 二、故障现象 三、分析过程 四、解决方案 五、思考 六、总结 一、背景 最近&#xff0c;用户反馈我们的生产环境TiDB集群的drainer频繁发生故障。故障表现为服务崩溃无法启动&#xff0c;或者数据在运行过程中丢失&#xff0c;给我们的业务带来了很大的困扰…

uniapp刻度尺的实现(swiper)滑动打分器

实现图&#xff08;百分制&#xff09;&#xff1a;滑动swiper进行打分&#xff0c;分数加减 <view class"scoring"><view class"toggle"><view class"score"><text>{{0}}</text><view class"scoreId&quo…