假设我有一项服务允许员工创建费用报告。该服务将每个费用报告作为一行写入某个数据库中。在任何给定时间都可以运行该服务的多个实例
每次员工尝试创建新的费用报告时,服务都会通过从数据库读取数据来检查该员工已有多少条目。如果他们已经有 N 个或更多活跃报告,则员工的请求将被拒绝
当员工快速提交多个费用报告时存在竞争条件,这些报告可以由服务的不同实例并行处理
假设我们的限制是每位员工 5 份费用报告,我们最终会得到以下事件序列
目前该员工违规记录共有 6 条。有哪些选项可以解决分布式系统中的此类竞争条件?
您需要在系统中进行某种锁定,以确保操作不会错过彼此的更新。
第一个选项是决定锁定级别。例如,系统只能允许同时发生单个更新(读取和写入)。或者系统可以锁定特定员工 ID。
由于您已经有一个数据库,并且所有服务都从同一个数据库读取,因此数据库似乎是集合点,这是所有请求相遇的地方。
从实际角度来看,数据库可能有一些事务支持。该服务(服务的一个实例)将锁定特定的员工 ID 进行更新,以确保不超过一个进程可以插入新值。基本上读取-检查-更新序列不会并行运行。
如果数据库不支持事务,可以使用外部锁管理服务。