【性能优化上】第三方组织结构同步优化一,分状态,分步骤的设计,你 get 到了吗?

news2024/12/25 9:34:02

在工作中,云产品之间自然少不了各种系统的对接,系统对接自然会涉及到各种鉴权,以及需要将对方系统的组织结构同步到己方内部系统中来

当然,有的产品可能会去对接实际的第三方认证源和同步源,但是成本相对比较高,因为对接一个不同的源就需要去实现一套接口和逻辑,虽然流程大同小异,可实际工作量可不小

因此,大多数产品为了方便和节省人力,是会选择对接 IDaaS,让 IDaaS 去对接各种第三方认证源和同步源

此处的 IDaaS 解释一下:

IDaaS 即 Identity as a Service,直译为身份即服务,是一个构建在云上的身份服务

接下来是关于上篇文章谈到的组织结构同步优化的思考,希望能够给 xdm 带来不一样的思考

  • 坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

基本介绍同步流程

之前是自身的系统去和企微,钉钉这样的第三方认证源/同步源进行对接,耗时耗力

现在是将这些工作全部由一个叫做 IDaaS 的模块来完成,可以说他也是一个第三方系统,只是集成了常用的一些第三方平台的认证源和同步源,专门的人做专门的事效率是最高的

基本交互如下:

过去做的很 low 的同步做法

一个消息近 3 w 用户,数据量 6 M 左右

今天主要是分享关于同步的做法,看了上一篇文章,有一点任何和经验的 xdm 就知道,一个消息里面放近 3w 个用户,这种方式处理真的是简直了,不靠谱,风险非常高,对性能也影响很大

平时数据量小的时候没啥感觉,起量了,灾难就来了,因此我们做需求做功能,要考虑在前面,预防这样灾难性的问题以及对真的出现这种问题的时候,要有预案

第三方组织结构同步性能优化需要思考哪些点

那么经历了上次事故,自然下来要认真思考如何处理这种组织结构同步的问题,并且支持的用户量要30 W 起步(此处指的是 一个租户可以承载 30W,而不是整个平台 30W)

那么我们需要考虑如下几个问题:

  • 从 IDaaS 获取数据的顺序,方式如何处理?
  • 服务 A 与 服务 B 的通信方式,提供多少个 RPC 接口来完成一次顺利的组织结构同步?
  • 在同步数据过程中出现了问题,异常中断了我们需要如何恢复之前已经同步了的数据需要如何去处理
  • 如何才能达到同步 30 w 用户无异常,且能顺利同步成功
  • 同步的数据如果不符合平台的规则,需要筛选出来,并注明冲突原因,返回给前端页面

其实将上述问题思考清楚,完整的回答完毕,基本上这个优化方案就可以落地了,那么我们开始吧

从 IDaaS 获取数据的顺序,方式如何处理?

服务 A 去找 IDaaS 进行数据同步的时候,我们可以分成四个阶段

  • 第一阶段,创建任务,保证同一个时间同一个租户只有一个同步任务在执行
  • 第二个阶段,从 IDaaS 处分页获取组再分批次给到 服务 B

在这个阶段的时候,可能会考虑到一次性将组获取过来不就好了吗?一个租户下面也不会有多少用户组吧?

实际上大一点的客户,光组的数据就有 2-3 w 个,甚至很多的,因此还是需要分页去获取,然后分批次推送给服务 B,服务 B 将数据给到临时用户组表中

  • 第三个阶段 ,从 IDaaS 处分页获取用户,并批次给到服务 B,服务 B 将数据给到临时用户表中
  • 第四个阶段,触发并通知可以正式将数据写入到正式表

服务 A 与 服务 B 的通信方式,提供多少个 RPC 接口来完成一次顺利的组织结构同步?

目前来服务 A 作为调用者,那么服务 B 自然是提供 4 个接口,分别为

  • 创建同步任务
  • 同步组
  • 同步用户
  • 写入正式表

在同步数据过程中出现了问题,异常中断了我们需要如何恢复,之前已经同步了的数据需要如何去处理?

那这个时候,对于组织结构同步的话我们需要这样来设计,首先会考虑我们本次的数据同步是属于全量同步,还是属于增量同步

例如,我们同步过用户数据,则在我们自己的平台上会有一个 /IDaaS 的组,同步之前校验平台中是否有这个组,若有,则为增量同步,反之,则是全量同步

对于增加每一个阶段的可靠性,以及程序的健壮性,并且受到异常中断之后,还能够进行断点续传,我们针对每一个阶段设计了这样的流程:

总体说明

总体来说,我们设计 3 张表4 个同步状态,以及 14 个同步步骤

3 张表

其中包含一张同步记录表,一张临时用户表,一张临时用户组表

同步记录表存放这些关键字段

  • 基本的租户 id
  • 记录重试次数
  • 同步类型
  • 当前的同步状态
  • 当前的同步步骤

临时用户组表存放这些 关键字段

  • 基本的租户 id
  • 组 id
  • 组名
  • 父组 id
  • 是否合法
  • 非法原因

临时用户表中存放这些关键字段

  • 基本的租户 id
  • 用户 id
  • 用户名
  • 组 id
  • 是否合法
  • 非法原因

可以看出,3 张表主要都是通过租户 id 来进行匹配的

4 个同步状态

- sync_in同步中
- sync_interrupt同步中断
- sync_fail同步失败
- sync_success同步成功

14 个同步步骤(全量+增量)

同步临时数据步骤

1sync_begin同步开始
2sync_temp_group同步组信息到临时组
3sync_temp_user同步用户到临时表

全量步骤

4full_sync_group全量同步临时表中的组到正式表
5full_sync_user全量同步临时表中的用户到正式表

增量步骤

6incr_sync_markup_group标记组步骤
7incr_sync_markup_user标记用户步骤
8incr_sync_delete_user从正式表中删除用户步骤
9incr_sync_add_group将临时表中的组写入到正式表中
10incr_sync_move_user处理正式表中移动用户
11incr_sync_add_user将临时表中的用户添加到正式表中
12incr_sync_edit_user编辑正式表中的用户
13incr_sync_delete_group删除正式表中的组
14sync_end增量同步结束

接下来我们可以按照上述提供的四个接口来进行阐述上述同步状态和同步步骤都是如何使用的,本次先写前 3 个接口,结果是将第三方的数据全部同步到 服务 B 得了临时表中,且标记好数据是否合法,也是为下一篇留下一个伏笔

创建同步任务

本接口旨在控制一个租户同一时间只能有一个同步任务

  • 校验请求是否有同步记录,如果有,则校验同步状态同步中(sync_in) 或者是 同步中断(sync_interrupt) ,则本次不进行同步
  • 校验平台中是否有 /IDaaS 组,若有则记录同步类型为全量同步(full) ,若没有则记录同步类型为 增量同步(incr)
  • 将同步记录写入到同步记录表中,同步状态为 同步中(sync_in) ,同步步骤为同步开始(sync_begin)

原因如下

此处校验同步状态同步中(sync_in) 或者是 同步中断(sync_interrupt) ,则本次不进行同步,原因如下:

  1. 若触发当前接口,发现租户同步记录中同步状态为 sync_in ,则说明已经有任务在处理同步任务了,无需再次执行
  1. 同步状态为 sync_interrupt,说明这条同步记录之前异常中断,那么本次任务也无需再次执行,另外一边会有一个定时任务去扫同步记录表中的 sync_interrupt 同步状态的数据,轮训去读取后,进行组织结构同步

同步组数据到临时表

本接口旨在将第三方用户组数据全部同步到临时用户组表中,并标记合法与非法数据

  1. 校验当前同步记录的状态是 sync_in,否则不进行处理
  1. 开启事务

    1. 校验当前数据若是第一页数据,若是,则清空临时用户组表,且在同步记录表中记录同步步骤为 sync_temp_group

    2. 若不是第一页数据,则校验同步记录表中的同步步骤是否是 sync_temp_group

      1. 若是,则继续,将第三方的数据逐页进行基本校验后,将数据逐页写入到临时用户组表中,且标记每一条数据合法和非法
      2. 若不是,则返回错误信息,让调用者结束整个流程,此处的调用者即 服务 A

同步用户数据到临时表

本接口旨在将第三方用户数据全部同步到临时用户表中,并标记合法与非法数据

  1. 校验当前同步记录的状态是 sync_in,否则不进行处理
  1. 开启事务

    1. 校验当前数据若是第一页数据,若是,则清空临时用户表,且在同步记录表中记录同步步骤为 sync_temp_user

    2. 若不是第一页数据,则校验同步记录表中的同步步骤是否是 sync_temp_user

      1. 若是,则继续,将第三方的数据逐页进行基本校验后,将数据逐页写入到临时用户表中,且标记每一条数据合法和非法
      2. 若不是,则返回错误信息,让调用者结束整个流程,此处的调用者即 服务 A

总结

通过上述 3 个接口,配合使用上述说到的同步状态和同步步骤,目前为止,就可以将第三方组织结构的所有数据快速高效的放到 服务 B 的临时表中

对于这些临时数据,如果出现了异常中断,那么若再次触发同步任务,我们清空临时数据,写入本次第三方组织结构数据即可

那么对于如何将临时表数据,写入到正式表中,才是真正的大头

不过也不复杂,对于写入数据到正式表的时候,分成全量同步和增量同步来进行处理,并按照每一个步骤进行校验和处理,就可以达到断点续传的效果,且效率比之前的方案快了不止一点点,详情可以查看下一篇文章

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

关于线上问题的情况,可以查看如下文章:

  • 坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?
  • 【性能优化下】组织结构同步优化二,全量同步/增量同步,断点续传

关于认证的相关内容可以查看文章:

  • OAUTH之钉钉第三方授权
  • JWT身份认证(附带源码讲解)

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

【数据结构】对称二叉树 另一颗树的子树(六)

目录 一,对称二叉树 题目详情: 解题思路: 思路实现: 源代码: 二,另一颗树的子树 题目详情: 解题思路: 思路实现: 源代码: 前言: 接下来…

计算机视觉:从图像识别到深度学习

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉是人工智能领…

每日一面系列之volatile 的理解

volatile 是 Java 虚拟机提供的轻量级的同步机制,有三大特点:保证可见性;不保证原子性;禁止指令重排 保证可见性 当多个线程操作共享数据时,彼此是不可见的。由此提出 JMM (java 内存模型) J…

爬虫异常处理实战:应对请求频率限制和数据格式异常

作为一名资深的爬虫程序员,今天我要和大家分享一些实战经验,教你如何处理爬虫中的异常情况,包括请求频率限制和数据格式异常。如果你是一个正在进行网络爬虫开发的开发者,或者对异常处理感兴趣,那么这篇文章将帮助你更…

01强化学习的数学原理:大纲

01强化学习学习路线大纲 前言强化学习脉络图章节介绍Chapter 1:Basic ConceptsChapter 2:Bellman EquationChapter 3:Bellman Optimality EquationChapter 4:Value Iteration / Policy IterationChapter 5:Monte Carlo…

数据结构与算法--图

数据结构与算法--图 1 图的基本概念 2 无向图和有向图 3 图相关的关键术语 4 图的相关性质 5 图的存储 4.1 邻接表法 4.2 邻接矩阵法 6 图的代码表示 1 图的基本概念 图(Graph) 是由一个顶点集V和一个弧集E构成的网状数据结构,记作 G ( V , E ) G (V ,E…

RPC框架学习

一、设计目标 RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

多线程知识汇总

IntentService 多线程的应用在Android 开发中是非常常见的,常用方法主要有: 集成Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentService IntentService 定义: Android 里的一个封装类,继承四大组件之一 ser…

Android 跨进程通信并传输复杂数据

前言 AIDL (Android Interface Definition Language) 支持以下数据类型: 基本数据类型:int、long、float、double、boolean、char、byte。 字符串类型:String。 集合类型:List、Map、Set。 Parcelable 类型:实现了 Par…

linux 文件锁

建议锁,强制锁,记录锁的概念 建议锁: 如果某一个进程对一个文件持有一把锁之后,其他进程仍然可以直接对文件进行操作(open, read, write)而不会被系统禁止,即使这个进程没有持有锁。只是一种编程上的约定。建议锁只对遵守建议锁准则的进程生…

@JsonFormat、@JSONField、@DateTimeFormat详细解说

JsonFormat、JSONField、DateTimeFormat详细解说_jsonfield format_xinlianluohan的博客-CSDN博客 三者出处 1、JsonFormat来源于jackson,Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以…

CSS SASS calc() 计算表达式或使用变量

calc()是css的一个函数,可用于元素计算长度,比如div宽度想要减去一个固定宽度后并自适应,可以写为calc(100% - 60px) 注意“-”两边有空格 sass已经是常用的预编译语言,允许使用变量等规则,如果…

上海亚商投顾:沪指窄幅震荡微跌 两市成交金额创年内新低

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡,创业板指盘中跌超1%,黄白二线有所分化。华为星闪概念股午后拉升&…

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构 1.N26接口是MME和5GS AMF之间的CN间接口,以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的,用于互通。N26支持在S10上支持的功能的子集(对于互通是必要的)。 2&#xf…

面试题:HTTPS 是如何保证传输安全的?又被问了!

文章目录 1. HTTP 协议1.1 HTTP 协议介绍1.2 HTTP 中间人攻击1.3 防止中间人攻击 2. HTTPS 协议2.1 HTTPS 简介2.2 CA 认证体系 总结 1. HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&…

Android13 大屏设备底部显示TaskBar并NavagatonBar居右

Android 13大屏设备时底下显示任务栏以及虚拟按键靠右的问题, 当前需求是去掉底部任务栏的显示,并把虚拟按键导航栏居中显示。 修改前的效果: 修改后的效果: 通过查看源码逻辑,可以发现只需把isTablet相关的逻辑和…

Mybatis 映射器中映射方法接受多个参数(@Param)

前面我们介绍了使用Mybatis映射器进行数据的增删改查操作;本篇我们继续介绍在Mybatis映射器的映射方法中如何使用多个参数。 如果您对Mybatis使用映射器进行数据的增删改查操作不太了解,建议您先进行了解后再阅读本篇,可以参考: …

【数据结构】二叉树的构建与基本操作实现

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.前序建立二叉树 2.销毁二叉树 3.统计 …

uni-app 之 picker选择器

uni-app 之 picker选择器 同步滚动&#xff1a;开 uni-app 之 picker选择器 一、普通选择器 二、多列选择器 三、时间选择器 四、日期选择器 一、普通选择器 <template><view><picker change"bindPickerChange" :value"index" :range&q…

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理 在过去十年中&#xff0c;航天器一直是现代技术进步的先决条件。迄今为止&#xff0c;为了更好地完成各种实际任务&#xff0c;已经在航天器姿态控制领域进行了大量研究。航天器一旦进入太空&#xff0c;就容易出现不确定…