如何解决分布式系统中写入数据库的竞争条件

问题描述 投票:0回答:1

假设我有一项服务允许员工创建费用报告。该服务将每个费用报告作为一行写入某个数据库中。在任何给定时间都可以运行该服务的多个实例

每次员工尝试创建新的费用报告时,服务都会通过从数据库读取数据来检查该员工已有多少条目。如果他们已经有 N 个或更多活跃报告,则员工的请求将被拒绝

当员工快速提交多个费用报告时存在竞争条件,这些报告可以由服务的不同实例并行处理

假设我们的限制是每位员工 5 份费用报告,我们最终会得到以下事件序列

  1. 请求费用A
  2. 要求费用B
  3. 服务实例1接收请求A
  4. 服务实例2接收请求B
  5. 服务实例 1 从数据库读取并找到员工的 4 个条目
  6. 服务实例 2 从数据库读取并找到员工的 4 个条目
  7. 服务实例1将A写入DB
  8. 服务实例2将B写入DB

目前该员工违规记录共有 6 条。有哪些选项可以解决分布式系统中的此类竞争条件?

database race-condition distributed-system
1个回答
0
投票

您需要在系统中进行某种锁定,以确保操作不会错过彼此的更新。

第一个选项是决定锁定级别。例如,系统只能允许同时发生单个更新(读取和写入)。或者系统可以锁定特定员工 ID。

由于您已经有一个数据库,并且所有服务都从同一个数据库读取,因此数据库似乎是集合点,这是所有请求相遇的地方。

从实际角度来看,数据库可能有一些事务支持。该服务(服务的一个实例)将锁定特定的员工 ID 进行更新,以确保不超过一个进程可以插入新值。基本上读取-检查-更新序列不会并行运行。

如果数据库不支持事务,可以使用外部锁管理服务。

© www.soinside.com 2019 - 2024. All rights reserved.