并发写入共享的网络资源

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

这里是我要解决的问题的背景。有计算机A和B,还有服务器S。服务器S实现一些后端,该后端以RESTful方式处理传入的请求。

后端S有一个架子。用户A和B的目标是使S创建编号的盒子并将其放置在该架子上。唯一的约束是两个框不能具有相同的编号。创建一个框后,S应该使用分配的编号将该框(JSON或xml ...)返回给A和B。

问题归结为并发,因为A和B的POST(“创建编号框”)事务可能在同一时间到达数据库,因此被取消(?)。我提醒一下,这里有一个唯一的约束-不允许两个框具有相同的数字。

解决此问题的可能方法有哪些?我不想锁定数据库,因此我正在寻找替代方案。您可以想象在数据库和调用数据库的后端层之间,我们可能还有一个额外的抽象层,例如微服务,消息传递队列...不管什么都不是-直接后端-数据库执行程序。查询电话。如果您认为postgres数据库不是说一个图或文档一个键值之一的好选择,请随时替换它。目标是最终允许并发写入用户A和B来获得对其创建(POST)请求的响应,并且每个用户在共享架子上都有一个带有唯一编号的框,并且没有“糟糕,出了点问题。请重试。 “服务器响应的类型。

我描述了一个拥有用户A和B的简单世界,但理论上最多可以有10,000个用户写作,而不仅仅是2个。作为第二个问题,我想问一下,有没有一种方法可以在postgres中测试冲突的并发事务?

我先走。我的想法是,让A和B发送请求并失败。一旦失败,请在一定间隔内重试随机超时。假设最多3次重试。对于A和B,我将尝试将请求的写入分离到db,这将在某种程度上成功解决该方案。但是,我认为这不是一个干净的解决方案,我正在寻找可以想到的替代方案。只是,请记住我上面提到的限制和自由。

database concurrency distributed-computing
1个回答
0
投票

诸如Posgres之类的数据库包括具有由数据库生成的唯一编号的功能(请参见PostgreSQL - SERIAL - Generate IDs (Identity, Auto-increment))。因此,后端服务S的逻辑可能是:

  • 如果用户已经在数据库中找到记录,则进行查找
  • 返回ID,如果有的话
  • 否则,创建一条记录并返回新分配的ID

为了避免为同一用户创建多个框,您需要根据用户ID序列化查找/创建逻辑。这样做的方法有所不同,从仅在服务S中一次处理一个请求到有例如让Kafka主题根据用户ID将请求划分到服务S的不同实例的Kafka主题-都取决于规模。

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