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

2023-03-02 14:40:27 +08:00
 wholve

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

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

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

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

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

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

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

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

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

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

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

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

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

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

而且我这个表只是为了让系统快速筛选用户可见表单。你筛选后每个表单还是可以再验一次的。
wholve
2023-03-03 10:15:16 +08:00
@Chad0000 可以理解,还是感谢你提供思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920508

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX