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

时间:2018-05-24 16:29:41

标签: mysql horizontal-scaling rowlocking

要求

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

为实现这一目标,我们已完成以下工作

有一个"编译的资源权限"看起来像这样的表:

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

该表的结构表示用户1访问资源1& 2 用户2只能访问资源1

"原因" column是一个按位编号,根据"为什么"他们有这个许可。二进制位" 1"表示他们是管理员,二进制位" 2"表示他们创造了资源。

因此,用户1可以访问资源1,因为他们是管理员。他可以访问资源2,因为他是管理员,他创建了该资源。如果他不再是管理员,他仍然可以使用机票2而不是机票1。

为了弄清楚需要进入此表的内容,我们使用" patcher"以编程方式循环用户和类的类传递给它的资源,并在逻辑上查看所有数据库表,以确定需要添加哪些行以及需要从表中删除哪些行。

我们如何尝试扩展和问题

为了横向扩展这一点,我们将逻辑拆分成块并将其分配给许多工人"在异步队列上

这只是在它不再加速之前到目前为止似乎只是扩展,有时甚至会发生行锁定,这会减慢它的速度。

我们可以使用特定类型的行锁来允许它无限扩展吗?

我们是从完全错误的角度接近这个吗?我们有很多"原因"以及我们需要能够快速重新编译的许多复杂权限逻辑

并发运行的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 )

0 个答案:

没有答案