我目前正在构建权限系统。其中一个要求是它可以水平扩展。
有一个"编译的资源权限"看起来像这样的表:
| 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"以编程方式循环用户和类的类传递给它的资源,并在逻辑上查看所有数据库表,以确定需要添加哪些行以及需要从表中删除哪些行。
为了横向扩展这一点,我们将逻辑拆分成块并将其分配给许多工人"在异步队列上
这只是在它不再加速之前到目前为止似乎只是扩展,有时甚至会发生行锁定,这会减慢它的速度。
我们可以使用特定类型的行锁来允许它无限扩展吗?
我们是从完全错误的角度接近这个吗?我们有很多"原因"以及我们需要能够快速重新编译的许多复杂权限逻辑
当我们"添加"原因:
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 )