【性能优化下】组织结构同步优化二,全量同步/增量同步,断点续传实现方式

news2025/6/17 7:39:19

看到这一篇文章的 xdm ,应该对组织结构同步有一些想法了吧,如果没有,可以看前面两篇文章,可以通过如下地址查看一下:

  • 【性能优化上】第三方组织结构同步优化一,你 get 到了吗?
  • 坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

这类文章,主要是期望能给 xdm 带来不一样的思考,如有表述不当的地方,还请不吝赐教,期望对你有帮助😀

这篇文章主要是阐述将临时表中的用户组数据/用户数组,按照既定的步骤同步到我们的正式表,过程中遇到异常中断,可以对我们的正式平台无影响,能够保证下一次同步任务过来仍然可以进行断点续传

首先全量同步和增量同步分别指什么?🧐🧐

🔥全量同步

简单理解,全量同步,咱们就是将对方所有的数据,全部同步到我们内部系统中,对于组织结构同步的时候,我们没有必要每一次都是全量的,一般是第一次,无到有的时候会用到全量同步,可以理解为全量覆盖

🔥增量同步

那么增量同步就比较好理解了,此处的增量同步指的是,第三方数据对于目前内部系统数据来说,哪一些是增加或者变动的数据,那么就同步这一部分数据到内部系统中

那么对于我们本次同步组织结构来说,就看内部系统是否已经存在了 /IDaaS 组,如果存在了,那么就走增量同步,如果不存在,则走全量同步

😃😃😃

🔥全量同步基本流程

全量同步的基本流程比较简单,再来回顾一下之前文章的一张总体图

可以看到全量同步和增量同步在我们整个同步流程的第四个阶段,到这个阶段的时候,第三方组织结构的数据已经全部正确的写入到了我们的临时表中

这个时候,我们就需要将临时表中的数据按照我们的逻辑和步骤写入到正式表中

此处阶段,显示判断是否有 /IDaaS 组,如果没有,则在同步记录表中写入 同步类型为 full 全量同步,如果有 /IDaaS 组,则记录同步类型为 incr 增量同步

全量同步比较简单,总共分成两个阶段,一个阶段是全量同步组 full_sync_group,一个是全量同步用户 full_sync_user

序号步骤含义
1full_sync_group全量同步临时表中的组到正式表
2full_sync_user全量同步临时表中的用户到正式表

此处比较简单,同步用户之前,自然是先要将组给同步过来,完全分清楚,对于正式表中,数据是从无到有,所以步骤相对就简单一些

🧐开始全量同步

在进行全量同步前,仍然还是检查当前的同步状态是否是 sync_in,且同步步骤是否是sync_temp_user,若不是则不处理

  1. 检查用户数量是否超过平台最大限制

    1. 若过程中出现 error,则关闭当前任务,不进行同步,并且将同步记录中同步状态设置为同步中断 sync_interrupt,同步记录表中重试次数 +1
    2. 检查临时表有效用户 + 已有正式表中未删除用户的数量是否超过平台最大限制(一般平台会有对于一个租户最多容纳多少用户的限制),更新同步状态为同步失败 sync_fail,并且清空临时数据,通知其他服务处理失败,且关闭当前任务
  1. 校验当前同步步骤是 sync_temp_user 或者 full_sync_group ,则开始正式将临时表的组信息同步到正式表中,并将当前的同步步骤修改为 full_sync_group
  • 这次这样进行判断,如果是 sync_temp_user 说明第一次处理到这里,如果是 full_sync_group 步骤,说明这个步骤之前被中断了,此刻需要断点续传
    • 获取临时表中的组深度,且获取按照深度排序的组列表
    • 按照由浅到深的将组数据写入到正式表中
    • 删除临时用户表
    • 如果过程中出现 error,则在该租户的同步记录中,同步状态标记为 sync_interrupt
  1. 当同步步骤是 full_sync_group 或者 full_sync_user 的时候,则开始将用户从临时表加入到正式用户表中,且将同步步骤修改为 full_sync_user
  • 同理,此处这样的处理逻辑,也是为了断点续传,逻辑之外,关于一个步骤中数据库的处理都是开启事务的
    • 一层一层的去添加用户,先从临时表中查询同一个深度下对应的所有用户
    • 从正式表中读取已经存在的用户
    • 从临时表中按照例如 1000 条每次去读取数据(有效合法用户),写到到正式表中,校验如果用户已经存在于正式表中,则记录冲突用户,且不录入该用户,反之亦然
    • 删除临时表中已经插入到正式表中的用户数据,并在临时表中更新指定用户是非法的
    • 如果过程中出现 error,则在该租户的同步记录中,同步状态标记为 sync_interrupt
    • 同步结束,则将同步状态设为 sync_success同步步骤设置为 sync_end,同时将临时表中非法的组,非法的用户全部读书出来,将非法数据传出去
    • 最终清除临时用户组表,和临时用户表 ,在 redis 中记录下一次需要同步的时间

🔥增量同步基本流程

增量同步的话,相对步骤就会多一些,看起来可能会觉得复杂,实际上按照如下步骤走的话,会很清晰并不复杂

序号步骤含义
1incr_sync_markup_group标记组步骤
2incr_sync_markup_user标记用户步骤
3incr_sync_delete_user从正式表中删除用户步骤
4incr_sync_add_group将临时表中的组写入到正式表中
5incr_sync_move_user处理正式表中移动用户
6incr_sync_add_user将临时表中的用户添加到正式表中
7incr_sync_edit_user编辑正式表中的用户
8incr_sync_delete_group删除正式表中的组
9sync_end增量同步结束

那么对于增量同步为什么需要那么多步骤才能保证咱们顺利同步?才能保证咱们可以断点续传??

实际上稍加思考的话,我们就需要考虑这些问题:

  • 同步数据,自然是需要先同步组
  • 那么对于组的增删改查,用户的增删改,我们需要按照这样的顺序处理呢?
  • 思考之后,自然是

    • 删除正式表中的用户(避免后续冲突,此步骤说明最新的同步数据中没有这一部分用户)
    • 添加组
    • 移动用户 (如果移动的目的组不存在的话,那还玩什么??所以添加组要放在这个步骤的前面
    • 添加用户
    • 编辑用户
    • 删除组

🧐开始处理增量同步数据

下面关于校验步骤的位置,理由都是为了确定当前执行的步骤是正确的,并且为了做到断点续传

  1. 开始标记组

    1. 校验当前同步步骤是 sync_temp_user 或者 incr_sync_markup_group,则当前的同步步骤修改为 incr_sync_markup_group
    2. 读取原有正式表中的组,读取临时表中的组数据
    3. 通过标记,找到新增的组,找到删除的组,并在临时用户组表中标记新增的组,在正式表中标记删除的组
  1. 开始标记用户

    1. 校验当前同步步骤是 incr_sync_markup_group 或者 incr_sync_markup_user,则将当前步骤修改为 incr_sync_markup_user
    2. 获取原有正式表中的非IDaaS组下的用户,读取临时表中的用户,通过读取出来的临时表中的用户去读取正式表中的数据,标记哪一些用户是新增的,哪一些是修改的,哪一些是移动的(组变动了),在正式表中标记删除的用户
  1. 开始处理正式表,临时表中的标记数据

    1. 删除用户 ,检查当前步骤是 incr_sync_markup_user 或者是 incr_sync_delete_user 才进行,且更新步骤为 incr_sync_delete_user
    2. 新增用户组,校验同步步骤是 incr_sync_delete_user 或者是 incr_sync_add_group 才进行,且更新步骤为 incr_sync_add_group
    3. 移动用户,校验同步步骤是incr_sync_add_group 或者是 incr_sync_move_user 才进行,且更新步骤为 incr_sync_move_user
    4. 删除用户组,校验同步步骤是 incr_sync_move_user 或者是 incr_sync_delete_group 才进行,且更新步骤为 incr_sync_delete_group
    5. 新增用户,校验同步步骤是 incr_sync_delete_group 或者是incr_sync_add_user 才进行,且更新步骤为 incr_sync_add_user
    6. 修改用户,校验同步步骤是 incr_sync_add_user 或者是 incr_sync_edit_user 才进行,且更新步骤为 incr_sync_edit_user
    7. 如果过程中出现 error,则在该租户的同步记录中,同步状态标记为 sync_interrupt
    8. 同步结束,则将同步状态设为 sync_success ,同步步骤设置为 sync_end,同时将临时表中非法的组,非法的用户全部读书出来,将非法数据传出去
    9. 最终清除临时用户组表,和临时用户表 ,在 redis 中记录下一次需要同步的时间

自然,对于每一个步骤的实现方式根据实际情况来定,这只是一个例子,主要是理解,整个流程的 3 张表4 个同步状态,以及 14 个同步步骤

是怎么保证断点续传的?

可以看到对于每一个步骤都在我们的操控范围内,还记的最开始创建同步任务的时候吗?

这个 同步中断 就是用于断点续传的

可以这样来实现 断点续传

  • 后台会启动一个定时任务,定时去扫同步记录表中 同步状态是 sync_interrupt 状态的记录
  • 根据每一条记录是全量同步还是增量同步,来走不同的同步路径
  • 再根据每一条同步记录中的同步步骤,就可以接着中断之前的步骤来进行同步数据了

自然,细心的同学还发会发,同步记录表中有重试次数这个字段,用法是每中断一次,这个字段值 +1,如果发现已经 3 次了,那么就会删除这条记录,若之后再次触发该租户的同步任务,则从 0 开始同步即可

至此,关于本次组织结构同步的内容更新完毕,如果对你能够带来一些思考的话,欢迎冒个泡吧

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 【性能优化上】第三方组织结构同步优化一,你 get 到了吗?
  • 坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?
  • OAUTH之钉钉第三方授权
    可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

Java中synchronized:特性、使用、锁机制与策略简析

目录 synchronized的特性互斥性可见性可重入性 synchronized的使用方法synchronized的锁机制常见锁策略乐观锁与悲观锁重量级锁与轻量级锁公平锁与非公平锁可重入锁与不可重入锁自旋锁读写锁 synchronized的特性 互斥性 synchronized确保同一时间只有一个线程可以进入同步块或…

函数扩展之——内存函数

前言:小伙伴们又见面啦。 本篇文章,我们将讲解C语言中比较重要且常用的内存函数,并尝试模拟实现它们的功能。 让我们一起来学习叭。 目录 一.什么是内存函数 二.内存函数有哪些 1.memcpy (1)库函数memcpy &…

交换机端口镜像详解

交换机端口镜像是一种网络监控技术,它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上,以便进行流量监测、分析和记录。通过端口镜像,管理员可以实时查看特定端口上的流量,以进行网络故障排查、安全审计和性能优…

已解决 Microservice Error: Circuit Breaker: Service is temporarily unavailable

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

【操作系统】聊聊磁盘IO是如何工作的

磁盘 机械磁盘 主要是由盘片和读写磁头组成。数据存储在盘片的的环状磁道上,读写数据前需要移动磁头,先找到对应的磁道,然后才可以访问数据。 如果数据都在同一磁道上,不需要在进行切换磁道,这就是连续IO,可…

离散数学之 一阶逻辑等值演算与推理

一阶逻辑等值式与置换规则 基本等值式 这里用到了量词辖域的收缩 未完待续

电工三级证(高级)实战项目:PLC控制步进电机正反转

实训目的 了解使用PLC代替传统继电器控制回路的方法及编程技巧,理解并掌握步进电动机的运行方式及其实现方法。通过实验进一步加深理解步进电机控制的特点以及在实际中的应用。 控制要求 PLC设备:Siemens S7-200 要求:打开开关K0(I0.0)得电,启动PLC程…

【xshell和xftp连接Ubuntu教程】

一、下载xshell和xftp 下载地址 https://www.xshell.com/zh/free-for-home-school/ 二、连接xshell 输入ip,端口号 输入用户名,密码 出现这个使用就行了 三、连接xftp 同上,输入ip,端口,用户名,密码 连接成…

拓扑关系如何管理?

在设备对接涂鸦的云端过程中,一部分设备由于自身资源或硬件配置,无法直接连接云端。而是需要通过网关进行中转,由网关代理实现和云端进行数据交互,间接实现设备接入云端。这样的设备也称为子设备。 要想实现网关代理子设备接入云…

C++跳坑记:位移超出范围的处理

在C编程中,数据类型的选择不仅影响内存占用和性能,还可以对某些操作的结果产生意想不到的影响。今天,我将分享一个关于C在不同变量类型下位移操作结果的发现。 位移操作是C中常见的对整数的高效操作之一。然而,我们可能会忽视一个…

单播与多播mac地址

MAC 地址(Media Access Control Address)是一个用于识别网络设备的唯一标识符。每个网络设备都有一个独特的 MAC 地址,用于在局域网中进行通信。 单播MAC地址:单播MAC地址用于单播通信,即一对一的通信模式。当设备发送…

day4_QT

day4_QT qt绘制钟表 qt绘制钟表 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(1000,1000);this->setStyleSheet("background-color:…

Word中对象方法(Methods)的理解及示例(下)

【分享成果,随喜正能量】当你的见识多了,眼界宽了,格局大了,所有的磨难都将不再是磨难,而是助你成长的阶梯。 。 《VBA之Word应用》(10178982),是我推出第八套教程,教程…

pnpm入门教程

一、概述 1、更小 使用 npm 时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用 pnpm 时,依赖会被存储在内容可寻址的存储中。 2、更快 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。目录结构计算。 node_modules 目录结构是…

编程(47)----------Spring AOP

AOP是Spring中, 个人认为较为抽象的一个思想. 一般来说, 学习一个新东西, 第一件事是先看看这个知识点的定义是什么. 同时要注意, 同一事物的定义可以有很多, 毕竟定义没有绝对的对与错, 只有准确与否. 而初次接触AOP的定义, 第一感觉可能就是抽象, 或者说看不懂, 这里面也有…

刷题日记——将x减到0的最小操作数

将x减到0的最小操作数 题目链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 题目解读 题目要求移除元素总和等于参数x,这道题给我的第一感觉就是从数组的两边入手,对数据进行加和删除,但是这里有一…

SVN状态图标不显示

问题可能点1:图标覆盖 1、右键找到设置 2、找到图标覆盖 3、重启TortoiseSVN 问题可能点2:注册表图标顺序太靠下,被占用 1、windowsr, 输入regedit进入注册表 2、找到一下目录 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cu…

servlet中doGet方法无法读取body中的数据

servlet中doGet方法不支持读取body中的数据。

警惕!多本SCI/SSCI被剔除,9月SCI/SSCI期刊目录已更新~(附下载)

【SciencePub学术】 2023年9月20日,科睿唯安更新了Web of Science核心期刊目录。 继上次SCI期刊目录和SSCI期刊目录更新之后,本次9月更新共有9本期刊发生变动: • SCIE:有3本期刊不再被SCIE期刊目录收录(Editorial De-listing/Pr…

Python 之 shadow 爆破密码脚本编写

文章目录 Linux shadow 爆破脚本Linux shadow 爆破初探Linux shadow 爆破进阶 Linux shadow 爆破脚本 Linux shadow 爆破初探 目的是为了明白其shadow爆破原理 # Linux shadow爆破初探 1import crypt#shadow文件中的一条用户数据 shadow_line "ghui:$y$j9T$DQ2d2fD138…