V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wholve
V2EX  ›  问与答

toB 业务,老板让优化首页展示速度,请教大神帮忙

  •  
  •   wholve · 2023-03-02 14:40:27 +08:00 · 1399 次点击
    这是一个创建于 614 天前的主题,其中的信息可能已经有所发展或是发生改变。

    具体说一下我们的业务,我们的主要业务是低代码表单。表单的可见范围来自多个维度 1.指定人员 2.指定部门,子部门 3.通过外部接口(指定规则) 4.全员可见

    根据以上的维度,我去判断每个人的权限时,需要根据当前登录人与每个表单去比对,是否有权限,这样造成的结果就是表单的数量越多,就会造成查询速度越慢

    现在已经优化过一版: 全部表单加缓存 并且通过异步去匹配部门,异步去匹配规则 虽然有些成效,但还是不能满足 200ms 以内返回

    有想过一下两个方案 1.定时任务异步去执行每个人的可见表单,但是公司员工众多,很耗费资源 2.通过异步缓存,首次加载时用上次的表单权限,此时异步执行可见逻辑,执行完之后保存到缓存;然后该用户刷新页面再次调用时,即可看到最新权限

    大神们还有更好的解决思路吗,欢迎探讨~

    21 条回复    2023-03-03 10:29:45 +08:00
    wholve
        1
    wholve  
    OP
       2023-03-02 14:41:48 +08:00
    规则加载慢也是造成速度慢的主要原因之一
    Chad0000
        2
    Chad0000  
       2023-03-02 14:52:33 +08:00 via iPhone
    应该不需要每个表单单独查询吧。每种维度查一次就够了:
    单独指定给我的
    我部门的
    公开的
    等等
    Chad0000
        3
    Chad0000  
       2023-03-02 14:56:56 +08:00 via iPhone
    规则过于复杂的话,你就分别保存每个人对应的表单。可以使用 nosql 这样每个人只需要一记录。使用异步去更新可见人群。这样只需要两次查询,一次是页面需要显示的表单,一个是当前人的权限。两者结合。
    superliy
        4
    superliy  
       2023-03-02 15:03:12 +08:00
    速度慢在权限比对?试试位运算?
    superliy
        5
    superliy  
       2023-03-02 15:08:48 +08:00
    https://juejin.cn/post/6844903889783767048 看一下我之前写的文章,不管你有几千还是几万个权限,超快
    wholve
        6
    wholve  
    OP
       2023-03-02 15:09:26 +08:00
    @Chad0000 设置规则的表单没办法保存,因为规则需要当前登录人作为参数,然后判断你有无权限 并且可能你之前调用时有权限,但是之后可能就给你改成无无权限了,这个规则由于是业务配置的,可能随时变更~
    Chad0000
        7
    Chad0000  
       2023-03-02 15:40:02 +08:00
    @wholve
    不管是什么规则,只要是跟登录者有关系,都可以对应到用户表上吧。一个表单权限有变动,然后发送事件消息,有一个流程异步去分析权限变动前后用户范围的变化,分别去相应的用户表单表更新其所见的表单列表。

    比如你限定某个部门,那么我就是把这个部门的所有用户找出来把这个表单加上。就算有一万个用户,表单权限一变动,你全部粗暴重新计算一遍再保存,都来得及。一分钟内能有几个表单变来变去跟不上处理速度?
    renmu
        8
    renmu  
       2023-03-02 15:43:45 +08:00 via Android
    你所有规则遍历一次就能得到这个人的权限了,速度也就是 O(N)
    wholve
        9
    wholve  
    OP
       2023-03-02 16:56:28 +08:00
    @Chad0000 不想用这种方式的原因,就是公司员工众多(几十万的量级,具体哪个公司就不说了),如果一个表单设置了全员可见,那岂不是所有员工的权限缓存全部都更新一遍
    wholve
        10
    wholve  
    OP
       2023-03-02 17:01:54 +08:00
    @renmu 规则根据当前登录人返回 true ,false ,不是你想的那样返回符合的人员
    Chad0000
        11
    Chad0000  
       2023-03-02 17:08:08 +08:00
    @wholve
    全员可见,指定部门可见,这种都可以特殊处理,不需要记在员工那边。全员可见的直接无需记录,部门可见的也一样。这样只需要三次查询:

    - 当前页面要显示的表单列表,包括:Id+可见性(所有人、仅限部门)
    - 当前登录者能看到的列表 Id (单独指定的,复杂的)
    - 结合以上两者,得到真正能看到的表单 Id 列表,查询并返回列表详情(可在这里再次验证权限)

    以上几个操作可以合并成一个,在后台 API 直接完成。
    wholve
        12
    wholve  
    OP
       2023-03-02 17:55:03 +08:00
    @Chad0000
    1.全员 + 指定部门可以处理

    2.咱们暂且将复杂的,单独指定的叫做规则接口,通过规则接口查表单权限
    如果 1 万个表单都设置了不同的规则接口,那查询当前登录人的权限,就需要调用 1w 次规则接口才能筛选出这个人的权限,所以无论同步异步查询都会很耗时间
    如果用你上述说的,提前将规则执行,说个极端情况,一开始某个规则可能只有一人有权限,后边业务调整,几十万员工可能都有权限,如何处理这种场景呢
    renmu
        13
    renmu  
       2023-03-02 18:15:45 +08:00 via Android
    @wholve 为什么不把规则单独放一张表?
    Chad0000
        14
    Chad0000  
       2023-03-02 18:28:21 +08:00 via iPhone
    @wholve
    什么规则接口这么麻烦只能给用户查不能给规则返回通过规则的用户列表?

    就算不能反查,你把规则提前取出来放内存里,几十万用户也放内存很快就能算出谁有权限。然后更新他们即可。最傻的方式你改规则后订阅一下消息,你几十万用户放内存里,一个个验,验完如果有权限,就更新。会很慢么?

    上面这么做就是为了一个目的:生成用户和表单的权限表。

    看来系统和模块都不是你负责设计的吧?如果还不明白我说的,可以找负责人给方案。
    HunterPan
        15
    HunterPan  
       2023-03-02 18:47:19 +08:00
    @Chad0000 你的建议成本也很高吧 几十万用户,规则变的少还可以,如果经常性变动,多些多读的场景 不大划算吧
    wholve
        16
    wholve  
    OP
       2023-03-02 20:03:57 +08:00
    @Chad0000 这根是不是负责人没关系 你说的方案我考虑过啊 但是并不能解决问题
    什么规则这么麻烦? 我们是一个规则平台,你别想当然认为啥都能通过规则返回用户表
    规则平台 可以支持业务的函数,接口,可以自定义决策表,可以写正则等等;你说的放内存很快算出来那是一个规则
    1w 个表单设置 1w 个规则,能有多快?目前你提供的方案跟我说的提出的方案一还没有本质区别
    wholve
        17
    wholve  
    OP
       2023-03-02 20:08:24 +08:00
    @Chad0000 所以说别跑偏了问题,就暂且将规则接口当成一个 http 接口吧
    Chad0000
        18
    Chad0000  
       2023-03-03 02:43:22 +08:00 via iPhone
    op 我们不在一个水平上,无法帮到你了。
    Chad0000
        19
    Chad0000  
       2023-03-03 02:48:40 +08:00 via iPhone
    @HunterPan
    经常变动也是一个个表单改权限。改完一个就有服务更新它对应的可见情况。

    一个会员一条记录,记录他能看到的表单。部门和公共表单不需要记。几十万会员只是让每次计算过程稍微长了点而已。也就是表单改完权限到应用有一点延迟而已。

    而且我这个表只是为了让系统快速筛选用户可见表单。你筛选后每个表单还是可以再验一次的。
    wholve
        20
    wholve  
    OP
       2023-03-03 10:15:16 +08:00
    @Chad0000 可以理解,还是感谢你提供思路
    wholve
        21
    wholve  
    OP
       2023-03-03 10:29:45 +08:00
    @Chad0000 看你的回答 你还没理解我说的为啥规则要当做一个 http 接口
    你提供这个思路的前提是需要构建一个规则接口与用户表权限映射关系
    但是不只是从表单可以改可见权限
    也可以通过改规则逻辑去改可见权限,规则确实复杂,假如一个规则接口设置了正则,大于 20 岁的男生,入职公司满 5 年等等你就需要实时去查规则,一个规则对应一个几十万的用户表这样不现实吧,这样类似的场景很多,根本构建不出规则权限与用户的表,这样举例你能明白我说的吗?
    不过你提供的思路已经是很贴合我们的业务来提供解决方案了,就差这一点有理解偏差
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5519 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.