【发布时间】:2019-08-30 19:41:25
【问题描述】:
我有一个将给定资源分配给用户的系统。每天有成千上万的人访问这个系统。
在包含这些资源记录的数据库表中,我们有一列让我们知道该资源是否已分配。
当有分配资源的 API 请求进入时,我们会运行查询以查找未分配的资源。下一行代码是检查是否返回 false,以便我们可以显示错误。之后的下一行 if 将该资源锁定给该用户。我们在查找和分配之间最多讨论 1-2 毫秒。
我担心随着流量的增加,有可能不止一个用户返回相同的资源。我们有一个确定性算法,每次我们请求时都会返回相同的资源。
有没有一种好的方法可以确保两个人不可能返回同一个实例?
我的底层系统是 Laravel 5.8,在 AWS 中运行。负载平衡(应用 ELB)、多个应用服务器、多个工作服务器。 DB 是在 RDS 上运行的 Postgres。 Redis 用于缓存和队列管理。
【问题讨论】:
-
阅读乐观和悲观锁定策略,并选择最适合您情况的一种。就计算机而言,1-2 毫秒是一个微小的永恒。对你来说,这似乎没什么,但对于一台运行在纳秒级的机器来说,就像站着十分钟一样。
-
这引导我走上这条路。最终,我找到了一种方法来更新并在一个查询中进行选择,从而消除了任何可能的竞争条件。
标签: php laravel postgresql