首页 > 其他分享 >一个组织创建后工作台发生了什么

一个组织创建后工作台发生了什么

时间:2023-06-05 16:05:07浏览次数:48  
标签:初始化 异步 创建 工作台 组织 模板


一、业务介绍

当管理员在钉钉创建出一个组织后,工作台会发生什么样的变化?工作台又是如何实现千人千面的?工作台如何解决初始化的性能问题?今天这篇文章来分享工作台初始化的一些技术实践。

二、产品流程

一个组织创建后工作台发生了什么_初始化

三、竞品对标

产品特征/对标

企业微信工作台

飞书工作台

钉钉工作台

产品

一个组织创建后工作台发生了什么_初始化_02

一个组织创建后工作台发生了什么_java_03

一个组织创建后工作台发生了什么_初始化_04

角色工作台

不支持

不支持

支持

行业模板

不支持

不支持

支持

创建速度

管理能力

动态卡片能力

四、时序图

从高度抽象模块来说,主要分成了以下几个步骤:

  1. 监听通讯录组织创建消息
  2. 查询命中的模板
  3. 创建工作台门户对象
  4. 生成模板对象Schema数据结构
  5. 异步安装依赖的资源
  6. 资源回写Schema数据结构
  7. 发布工作台

具体时序图如下图所示:

一个组织创建后工作台发生了什么_数据结构_05

五、核心技术难点

如何实现千行千面

理论上来说,对于不同的用户来创建组织,要形成一些的规则来命中指定的模板,就可以实现千行千面。实现的方式有多种,但是一般来说除了算法的叠加外,可以采用一些通用性的规则:

  • 基于行业的模板命中规则

即配置行业和模板的对应关系,当组织选择了特定行业,直接加载对应的模板

  • 基于人数的模板命中规则

即配置用户创建组织选择的规模人数,来选择对应的模板。一般用于解决特定的大组织架构问题

  • 基于组织来源的模板命中规则

即根据组织创建时选择的渠道码,来选择对应的模板,这种一般用于线下部署有指定来源的情况,这种更为精准,用于地推业务场景

  • 基于ABTEST的模板中规则

用于对于同一个规则下,配置一个或者多个模板,主要用于控制变量来确认不同模板对于同类对象的效果

  • 算法规则

根据用户登录钉钉的已有行为(诸如已创建的组织)来实现算法推荐用户工作台模板,不过经验证,在2B类的场景里,纯算法适用场景相对不多,还是要结合组织和用户特征做较为精准的规则匹配更为合适

如何解决性能瓶颈


许多研究都表明,用户最满意的打开网页时间,是在2秒以下。 用户能够忍受的最长等待时间的中位数,在6~8秒之间。这就是说,8秒是一个临界值。


文章:网页打开速度的心理学 - 阮一峰的网络日志

第一个难点就是性能问题,如何在管理员初始化组织之后,能够较快的初始化出组织工作台是一个极大的挑战。

由于需要初始化一个工作台,一般需要执行几个步骤:

  • 初始化布局
  • 初始化官方应用开通
  • 初始化三方应用营销态
  • 初始化应用内实例
  • 更新OAURL
  • 四端推送
  • ...

由于行业化本身比较复杂,需要实现各种资源分发逻辑,因此实际验证下来需要5秒以上才能完成整个工作台的初始化。因此这个时间是个用户极度体验不好的时间。

其中有三个入手优化点,第一是异步化创建工作台,第二个方式是提供足够多产品引导,第三个就是工作台本身资源异步初始化。

  • 异步化创建工作台

异步化创建工作台比较好理解,即当用户选择好行业、规模、角色后,就发送出异步消息,服务端线上监听异步组织创建消息开始进行初始化。从同步创建工作台优化成异步创建工作台。这也是最简单最容易想到的一个方案,也是用消息解耦的一个典型用例。

  • 优化产品引导

第二个方式是从产品上的引导,由于组织命中的千行千面数据需要同步复制到目标组织,往往由于应用的开通、模板的生成、布局的生成等造成复制耗时极高。在性能问题无法较好解决前,可以通过添加产品引导来优化链路。比如一些存储系统上传或者下载文件就会有明显的loading态来提示用户。

一个组织创建后工作台发生了什么_架构_06

  • 异步生产工作台资源

第三个方式是先基于完全复制或者部分复制生成组织的模板,先展现给用户,然后异步线程去开通应用、模板的生成等。

如何解决初始化依赖未完成问题

这是一个理论上不会出现,但是实际上经常会出现的问题。即工作台初始化依赖了大量的外部调用,比如查询组织通讯录管理员、查询通讯录用户数、查询微应用等。往往因为初始化的时候,由于通讯录、微应用本身逻辑复杂而形成大量的模块内异步调用,因此在生成工作台的时候,往往会因为外部依赖查询异常而导致工作台本身异常,比如查不到管理员就无法开通应用。因此解决思路有如下:

  • 降低外部依赖

一个很简单的方式,就是降低外部依赖,比如可以将从消息体中取得管理员的信息;

  • 消息重试

采用消息队列的自动重试机制,当处理逻辑发生异常时,向外抛异常来解决;这里要尤其注意,大部分消息中间件有重试时延,如果时延过长会导致整体工作台创建链路严重延迟

  • 内存重试

内存模板化代码,在强依赖外部接口的方式使用内存重试,可以设定重试次数、重试间隔等。

一个组织创建后工作台发生了什么_架构_07

思考

工作台作为组织数字化的入口,承载非常重要的入口和协同功能,因此如何快速给结合用户特点初始化一个个性化的组织工作台,是非常重要的。

公众号:ali老蒋。


标签:初始化,异步,创建,工作台,组织,模板
From: https://blog.51cto.com/u_15990596/6416775

相关文章

  • 002_创建应用程序
     /*一:应用程序:1创建程序2注册程序,3定义模型,4注册模型5数据库迁移6创建admin*/ 一:应用程序:1创建程序1:输入命令: pythonmanage.pystartapplearning_logs'''pythonmanage.pystartapplearning_logs在Dj......
  • 【GIT】本地创建一个 git 仓库,并推送到远程仓库
    步骤1.在本地创建一个空文件夹如:我建一个map空文件夹2.gitinit在map目录下,将这个文件夹设置为git管理的本地仓库3.gitadd.复制一个文件到map目录下,然后执行gitadd.,这样就将文件存放到了暂存区4.gitcommit-m“firstcommit”将暂存区中存放的文件提交到git本地仓库5.在远端......
  • visual studio 2010 c++ 创建com组件
    在VisualStudio2010中创建COM组件需要执行以下步骤:1. 打开VisualStudio2010,选择“新建项目”。2. 在弹出的对话框中选择“VisualC++”-->“Win32”-->“Win32项目”,并选择“DLL”作为应用程序类型。3. 单击“下一步”按钮。在下一个页面上,选择“ATL”,然后单击“完......
  • 在 PowerShell 中创建测试证书并使用测试证书给程序签名
    在PowerShell中创建测试证书并使用测试证书给程序签名在开发和测试过程中,有时您可能需要创建测试证书并使用它来给程序进行签名。这篇博客将介绍如何在PowerShell中创建测试证书并使用它给程序签名的步骤。步骤1:打开PowerShell在开始菜单中搜索"PowerShell"并管理员......
  • PostgreSQL中使用动态SQL-实现自动按时间创建表分区
    PostgreSQL中通过继承,可以支持基本的表分区功能,比如按时间,每月创建一个表分区,数据记录到对应分区中。按照官方文档的操作,创建子表和index、修改trigger等工作都必须DBA定期去手动执行,不能实现自动化,非常不方便。尝试着通过在plpgsql代码中使用动态SQL,将大表分区的运维操作实现......
  • Springboot 链接DataSource前检查或创建库,并设置时区及sql_mode
    /**Copyright(c)2022.AsiacomTechnologyInc.Allrightsreserved*/importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Configuration;......
  • IBM MQ 创建以及常见问题
    消息队列+发送队列+消息通道接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行startchannle(chlname)重启通道。常用的MQ命令 66.0.42.240用户mqm/mqm88.0.52.40mq队列服务器:mqm/1qaz2wsx二代:88.0.65.91vlog/1qaz2wsx监控:/cnaps/maintain/bin管理台:adm......
  • JS中创建对象的几种常见的方式
    创建对象方式//方式1varobj1={"name":"方式1"}//方式2varobj2={name:"方式2"}//方式3varobj3=newObject({"name":"方式3"});//方式4varobj4=newObject();obj4.name="方式4"//方式5:通过对象构造器创建对象fu......
  • 04.如何创建并运行java线程
    评:原文链接译者:章筱虎校对:方腾飞Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。可以用如下方式用java中创建一个线程:查看源代码打印帮助1Treadthread=newThread();执行该线程可以调用该线程的start()方法:查看源代码打印帮助1thre......
  • web项目创建后WEB-INF下面没有出现web.xml的解决方法
    提供两种解决方案:第一种:创建完项目后,需要手动创建出web.xml第一步:选取创建的项目名称右击第二步:eclipse的同学找到javaEETools中的下图画圈部分。MyEclipse的同学找到"MyEclipse"中的下图画圈部分。......