2024后端服务架构升级

news2024/11/16 13:54:31

文章目录

  • 背景
  • 改造方案
    • 新架构图
    • 技术选型
      • 思考
    • 服务拆分
    • 公共组件设计
    • 自部署算法服务
    • 排期计划
  • 全球多活改造
    • 背景
    • 架构图
    • 分布式ID
    • 大表分区处理
      • 范围
      • 使用用途
      • 改造方案
      • 排期计划
      • 升级预算

背景

1、xx业务经过多轮的业务决策和调整,存在非常多技术包袱,带了不好的用户体验和极高的维护成本

2、多套机房部署,服务部署复杂,性能可靠性无法保证

3、多套后端接口,前端接入标准不统一,通用逻辑不一致(扣费、试用、商业化)

4、主要维护业务基于g0实现,服务类型为http无状态服务,部署在美西k8s集群,具备单机房的弹性伸缩能力,服务的高可用可以进一步提升;单机房,欧洲、亚洲用户访问服务存在慢的问题

5、缺失前后端通用业务组件设计,复用性不高

缺失服务端调用链路监控与跟踪;

部分表存在单表过大问题,超5千万量级。

背景总结:

业务的调整,合并多个服务,前端接入多套后端接口,通用的扣费、试用等逻辑不一致,所以服务拆分,以及需要做统一的微服务网关;

之前是多个单机房单体应用,需要提高服务的高可用,以及数据的高可用;

改造方案

新架构图

在这里插入图片描述

技术选型

项目技术选型集成能力
xx服务网关Traefik用户鉴权、限流器
go框架goframe

思考

对于微服务网关的调研,为什么选用这个云原生网关,跟传统网关的区别,以及这个网关服务跟普通服务有什么区别?

服务拆分

序号服务代号拆分定义技术选型
01服务网关xx-gatewayxx全流量网关,支撑xx全部业务流量,提供用户鉴权、限流器、微服务转发基础能力Traefik
02接入层xx-api负责xx产品所有API的注册、参数验证、服务调度goframe
03用户服务xx-usersrv主要负责用户相关业务服务提供主要包含 授权、积分、产品管理模块
04应用服务xx-appsrv主要负责xx业务服务能力提供,主要包含 1、编辑器 2、轻编辑 3、工具箱(媒体处理、AI生成)4、存储服务(凭证、签名、转存、删除、分享)goframe
05用户运营管理后台xx-admin提供xx整理业务运营数据可视化呈现、运营配置、权益流水等Dcat Admin(php)

公共组件设计

序号组件职责
01外部服务调用SDK统一封装外部服务的SDK组件,整合公司中台依赖所有服务,只负责网路请求,重试,相关错误返回给调用方
02任务组件服务统一封装任务组件,支持分布式,实现重试、延迟、定时、回调、任务记录、任务编排相关能力

自部署算法服务

各种算法的部署+ 有个中间服务调度算法任务

例如 视频压缩算法的调用:

在这里插入图片描述

排期计划

序号项目责任人预计上线时间
01整体架构文档方案输出One Two
02代码拆分改造(接入层、用户服务、 应用服务、构建发布改造搭建)One
03服务结构拆分、配置分离、boot、vars、components结合作组件初始化、组件配置化One
04服务网关的搭建One Two
05基础组件搭建,抽出基础组建层,定义相关标准Three
06基础组件搭建,外部云服务SDK封装Three
07基础组件搭建,任务通用组件封装One Two
08基础组件搭建,其他通用组件封装Three
09IBM服务替换接入云平台新接口Three
10接入层代码逻辑迁移Three阶段1改造:6月底,目标:完成框架搭建、完成组件库建设、完成IBM能力的迁移承接
11用户服务和应用服务代码迁移,逻辑改造(服务级的调用方式)Two Three
12数据库的拆分(用户库、应用库)Two阶段2改造:7月中旬,目标:完成微服务架构的改造
13服务网格接入Two
14全局流量管理开发,整体架构多活适配改造与验证One
15全球多活节点部署One
16部分流量的验证One
17全部流量的上线One阶段2改造:7月底,目标:完成全球多活架构的应用

全球多活改造

背景

仅美西一个机房节点提供服务,欧洲|、亚洲用户访问xx服务响应服务慢,影响用户体验;
部分表存在单表过大问题,超5千万量级。

架构图

美西作为中心节点,使用DTS双向同步其他节点数据库
每个机房可设置一个私有库,不做同步,用于存储隐私数据相关
美西机房设置ECS从库,用于灾备用途
在这里插入图片描述

分布式ID

所有的业务表更改ID属性,取消自增ID,更改为分布式ID,用于解决ID主键冲突的问题。

第一阶段:修改表ID属性

alter table activity modify id bigint unsigned NOT NULL ;
alter table share_reports modify id bigint unsigned NOT NULL ;
alter table share_reports modify share_id bigint unsigned NOT NULL DEFAULT '0' COMMENT '# 分享ID';
alter table ab_cate modify id bigint unsigned NOT NULL ;
alter table products modify id bigint unsigned NOT NULL ;
alter table feedback modify id bigint unsigned NOT NULL ;
alter table products_store modify id bigint unsigned NOT NULL ;
alter table system_configs modify id bigint unsigned NOT NULL ;
alter table portrait_categories modify id bigint unsigned NOT NULL ;
...

采用开源的雪花算法生成分布式ID,参考链接:https://github.com/bwmarrin/snowflake
分布式ID生成单独放在公共服务里生成
修改业务,手动控制插入表的ID的值,用GORM的callbck事件实现

数据平滑过渡:https://www.zhihu.com/question/391373815

大表分区处理

范围

库:xxx_api
表:tasks、resources

CREATE TABLE `tasks` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `task_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 任务ID',
  `type` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 任务类型',
  `subtype` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 任务子类型',
  `params` json DEFAULT NULL COMMENT '# 参数',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '# 状态: 1创建失败 2执行中 3成功 4失败 5关闭 6超时',
  `ws_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# WS_ID',
  `take_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 理论耗时',
  `spend_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 真实耗时',
  `estimate_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 预估耗时',
  `download` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 下载次数',
  `device` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 移动设备: 0未知 1PC 2WAP',
  `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# IP',
  `err_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '# 错误描述',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deduction` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否扣费:0否 1是',
  `srv_params` json DEFAULT NULL COMMENT '# 服务参数',
  `offline` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否离线:0否 1是',
  `vip` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# VIP:0-否, 1-是',
  `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 产品ID',
  `bucket` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# oss的bucket:0美西 1乌兰 2dx',
  `offline_task` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否离线处理任务:0否 1是',
  `offline_email` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 离线任务接收邮箱',
  `offline_send` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否发送邮件:0否 1是',
  `offline_unread` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否更新未读:0否 1是',
  `display` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否展示:0否 1是',
  `preview` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否预览任务:0否 1是',
  `external` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 第三方标识,0中台 1阿里云 2dx的pixpic',
  `template` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 模板',
  `step` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 分步',
  `lora_id` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# lora模型id',
  `verify_kind` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 权益',
  `platform` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 平台',
  `version` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 版本',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `tasks_ws_id_index` (`ws_id`) USING BTREE,
  KEY `tasks_status_index` (`status`) USING BTREE,
  KEY `tasks_task_id_index` (`task_id`) USING BTREE,
  KEY `tasks_created_at_index` (`created_at`) USING BTREE,
  KEY `tasks_type_index` (`type`),
  KEY `tasks_subtype_index` (`subtype`)
) ENGINE=InnoDB AUTO_INCREMENT=41056984 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='# 任务表';
CREATE TABLE `resources` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ws_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# WS_ID',
  `task_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 任务表ID',
  `task_type` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 任务类型',
  `task_subtype` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 任务子类型',
  `meta` json DEFAULT NULL COMMENT '# 文件元信息',
  `url` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 文件访问地址',
  `expired` timestamp NULL DEFAULT NULL COMMENT '# 文件过期时间',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '# 状态: 0无效 1有效',
  `source_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 资源类型: 0其它 1输入资源 2输出资源',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `is_delete` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 是否删除:0否 1是',
  `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 名称',
  `format` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '# 输入格式',
  `size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 原始大小',
  `bucket` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 地区:0美西 1乌兰',
  `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '# 产品ID',
  `external` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '# 第三方标识,0中台 1阿里云',
  `detail` json DEFAULT NULL COMMENT '# 补充信息',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `resources_ws_id_index` (`ws_id`) USING BTREE,
  KEY `resources_task_id_index` (`task_id`) USING BTREE,
  KEY `resources_created_at_index` (`created_at`) USING BTREE,
  KEY `resources_task_type_index` (`task_type`) USING BTREE,
  KEY `resources_expired_index` (`expired`) USING BTREE,
  KEY `resources_format_index` (`format`),
  KEY `resources_task_subtype_index` (`task_subtype`),
  KEY `resources_url_index` (`url`)
) ENGINE=InnoDB AUTO_INCREMENT=87350171 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='# 资源表';

使用用途

任务记录

任务输入输出资源记录

主要查询场景

1、where task_id=xxxxx and xxx
2、where ws_id=xxxx and xxxx

改造方案

  • 1、task表:

增加分区字段part_id bigint类型,注册用户分区字段写入wsid, 临时用户分区字段写入时间年月:202403

增加full_task_id,基于taskid+分区字段拼接,如:taskid: ead-6a038265-175e-4d4f-92a6-88aa93014493 part_id: 336736560,拼接后的full_task_id: ead-6a038265-175e-4d4f-92a6-88aa93014493_P336736560

full_task_id 会暴露给外部,基于full_task_id mi服务自动解析出 part_id 和 taskid

增加字段:

ALTER TABLE mediaio_api`.`tasks

ADD COLUMN full_task_id`varchar(180)NOTNULLDEFAULT''COMMENT '# 全信息taskid',`

ADD COLUMN part_id`bigintUNSIGNED NOT` `NULL` `DEFAULT` `0 COMMENT'# 分区ID'`,

DROP PRIMARY KEY``,

ADD PRIMARY KEY (id,part_id) USING BTREE;

ALTER TABLE `mediaio_api`.`tasks` PARTITION BY HASH (part_id)
PARTITIONS 191
;

创建分区:

  • 2、resources表,基于task_id hash分区

变更字段

ALTER TABLE `mediaio_api`.`resources`
MODIFY COLUMN `task_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '# 任务表ID' AFTER `ws_id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`, `task_id`) USING BTREE;

创建分区

ALTER TABLE `mediaio_api`.`resources` PARTITION BY HASH (task_id)
PARTITIONS 383
;
  • 3、 users 表

变更字段:

ALTER TABLE `mediaio_api`.`users`
MODIFY COLUMN `ws_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '# WSID' AFTER `password`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`, `ws_id`) USING BTREE;

创建分区

ALTER TABLE `mediaio_api`.`users` PARTITION BY HASH (ws_id)
PARTITIONS 191
;

排期计划

序号项目责任人预计上线时间备注
01数据拖敏1dTwo
02分布式ID改造1dTwo
03全局路由流量跨机房异常兼容3dThree范围:1、任务状态轮询 ; 改造方案:1、出现夸机房流量,当redis没有命中,需要使用mysql记录作为兜底,保证业务接口正常。
04大表分区处理3dOne
05单元节点部署验证5dOne

升级预算

在这里插入图片描述

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

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

相关文章

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司(下称中车时代电气)是中国中车旗下股份制企业,其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲,走好两条钢轨,走出两条钢轨。中车时代电气秉承“双…

Flink系列三:Flink架构、独立集群搭建及Flink on YARN模式详解

一、Flink架构 Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,例如Hadoop yarn,但也可以设置作为独立集群甚至库运行。 Flink 集群剖析 Flink 运行时由两种类型的进程组成&…

【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law

相关博客 【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law 【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分:知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大…

Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成

一、控制块缓存页 Buffer Pool中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是16KB。为了更好的管理这些在Buffer Pool中的缓存页,InnoDB为每一个缓存页都创建了一些所谓的控制信息,这些控制信息包括该页所属的表空间编号、页号、缓存…

自动控制:自治系统与非自治系统的稳定性分析

自动控制:自治系统与非自治系统的稳定性分析 在自动控制领域,理解自治系统和非自治系统的区别对于分析系统稳定性至关重要。自治系统的运动方程只与系统的状态有关,而非自治系统的运动方程则与系统的状态和时间都有关系。本文将探讨非自治系…

SqlServer2016企业版安装

前言 好久没有知识的累积,最近工作上遇到新的SqlServer2016安装,记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…

3. 使用tcpdump抓取rdma数据包

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包 目录 系列文章一、准备工作1. 源码编译tcpdump2. 安装wireshark 二、Tcpdump抓包三、Wireshark分析 一、准备工作 1. 源码编译tcpdump 使用 tcpdump…

动物收容所

题目链接 动物收容所 题目描述 注意点 若没有可以收养的动物,则返回[-1,-1]收纳所的最大容量为20000编号随着收养动物的增加自增 解答思路 利用队列先进先出的特点将猫和狗分别存进两个队列中,关键是dequeueAny这个方法中如果此时猫和狗的队列中都有…

【算法无用系列】电影推荐——余弦相似度计算用户相似度原理

【算法无用系列】通过余弦相似度计算电影、用户相似度 话不多说,本文通过电影推荐系统中,基于余弦相似度算法计算出用户相似和电影相似原理。希望可以帮助一些代码不懂的同学一些思路。 记录用户电影评分数据 一般情况来说,会根据用户的行为…

安装Ubuntu桌面系统(虚拟机)

VirtualBox创建虚拟机(为安装Ubuntu桌面系统)-CSDN博客 虚拟机的创建方法如上链接。当虚拟机开始引导之后,便正式开始Ubuntu桌面版的安装过程。Ubuntu桌面版界面做得很漂亮,操作起来也方便,很适合作为入门Linux的操作…

探索安全之道 | 企业漏洞管理:从理念到行动

如今,网络安全已经成为了企业管理中不可或缺的一部分,而漏洞管理则是网络安全的重中之重。那么企业应该如何做好漏洞管理呢?不妨从业界标准到企业实践来一探究竟!通过对业界标准的深入了解,企业可以建立起完善的漏洞管…

Java+SVNCloud+Mysql课程设计

文章目录 1、主要内容2、所需准备3、与sql访问的中间类:SqlMessage4、窗口界面5、main方法 1、主要内容 课程设计,主要通过Javas wing创建窗口,jdbc连接云端mysql数据库进行基本操作,支持随机生成数据并用动态展示数据结果。 先…

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程) 3.4 函数式 Web 3.4 函数式 Web 个人写过 go 类似于 go gin 框架 1、场景 场景: User RESTful - CRUD GET/user/1 获取1号用户GET/users 获取所有用户POST/user 清求体携带JSON,新…

Java注解使用与自定义

一、什么是注解 注解是元数据的一种形式,它提供有关程序的数据,该数据不属于程序本身。注解对其注释的代码操作没有直接影响。换句话说,注解携带元数据,并且会引入一些和元数据相关的操作,但不会影响被注解的代码的逻…

程序员自我修养

目录 一、技术能力二、持续学习三、问题解决能力四、代码质量五、团队合作六、责任心七、时间与任务管理八、适应变化九、客户导向十、安全性意识十一、文档撰写十二、伦理与法律意识十三、健康生活 程序员作为现代技术行业的核心成员,不仅需要掌握扎实的技术技能&…

在 Java 项目中扫描识别图片中的文字(详细教程)

目录 需求: 步骤: 1、maven配置(pom.xml): 2、下载依赖文件: 3、代码: post进行测试: 测试图片: 测试结果: 需求: 上传图片文件进行扫描…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin,不排序使用…

Windows 2000 Server:安全配置终极指南

"远古技术,仅供娱乐" 💭 前言:Windows 2000 服务器在当时的市场中占据了很大的比例,主要原因包括操作简单和易于管理,但也经常因为安全性问题受到谴责,Windows 2000 的安全性真的那么差吗&#x…

kube-promethesu调整coredns监控

K8s集群版本是二进制部署的1.20.4,kube-prometheus对应选择的版本是kube-prometheus-0.8.0 Coredns是在安装集群的时候部署的,采用的也是该版本的官方文档,kube-prometheus中也有coredns的监控配置信息,但是在prometheus的监控页…

主流 RTOS 实时操作系统介绍

主流 RTOS 实时操作系统介绍 1 介绍1.1 概述1.2 RTOS 应用领域1.3 知名实时系统VRTXpSOSOS-9embOSAzure RTOS 【ThreadX 】OpenWrt 【路由】Mbed OS 【ARM 公司开发】VxWorks 【KUKA、ABB、etc】LynxOSQNXNucleusTHREADXuC/OS –II/III 【Silicon Labs 收购,更新频率…