权限系统上行锁定的水平扩展问题

7vhp5slm  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(197)

要求

我目前正在建立一个权限系统。其中一个要求是它可以水平扩展。

为了实现这一点,我们做了以下工作

有一个“已编译资源权限”表,如下所示:

| user_id | resource_id | reason |
|    1    |      1      |   1    |
|    1    |      2      |   3    |
|    2    |      1      |   2    |

该表的结构表示用户1可以访问资源1和2,用户2只能访问资源1。
“reason”列是一个按位的数字,它的位根据“why”打开,而“why”是它们拥有该权限的。二进制位“1”表示他们是管理员,二进制位“2”表示他们创建了资源。
因此用户1可以访问资源1,因为他们是管理员。他有权访问资源2,因为他是管理员,他创建了该资源。如果他不再是管理员,他仍然可以访问票2,但不是票1。
为了找出需要进入这个表的内容,我们使用了一个“patcher”类,该类以编程方式围绕传递给它的用户和资源循环,并从逻辑上查看所有db表,以找出哪些行需要添加,哪些行需要从表中删除。

我们是如何试图扩大规模和解决问题的

为了横向扩展,我们将逻辑分割成块,并将其分配给异步队列上的多个“worker”
在它不再加速或者有时甚至发生行锁定(row locking)来减慢它之前,它似乎只扩展了这么远。
有没有一种特殊类型的行锁可以用来无限扩展?
我们是不是从完全错误的Angular 来看待这个问题?我们有很多“理由”和很多复杂的权限逻辑,我们需要能够相当快地重新编译

并发运行的sql查询,以供参考

当我们“添加”原因时:

INSERT INTO `compiled_permissions` (`user_id`, `resource_id`, `reason`) VALUES ((1,1,1), (1,2,3), (2,1,2)) ON DUPLICATE KEY UPDATE `reason` = `reason` | VALUES(`reason`);

当我们“删除”原因时:

UPDATE `compiled_permissions` SET `reason` =  `reason` & ~ (CASE
            (user_id = 1 AND resource_id = 1 THEN 2 ... CASE FOR EVERY "REASON REMOVAL")
            ELSE `reason`
            END)
        WHERE (`user_id`, `resource_id`) IN ((1,1),(1,2) .. ETC )

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题