如何同时处理多个PUT和PATCH请求

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

有人问我这个问题。

[有资源,可以说一个人。我们想更新这个人的薪水,假设初始工资是10000

PUT - salary = 20000
PUT - salary = 30000
PATCH - Salary = 15000 
PATCH - Salary = 0
PUT - salary = 40000
PATCH - salary = 25000
PATCH - salary = 23000
PUT - Salary = 50000

以上所有REST调用都是并行执行的。所有put和patch请求都并行执行。

幂等性可以在这里发挥作用。

我将如何确保工资最终达到50000

以及,如何处理多个剩余呼叫

rest http patch put
1个回答
0
投票

PUT和PATCH都具有远程创作语义-“使该资源的副本看起来与我的副本相同”。您在此处描述的内容类似于单击“保存”八次。如果这些节省是在没有控制的情况下同时发生的,那么您可能最终将陷入“最后作家获胜”的境地,这可能意味着:

PUT - salary = 20000
PUT - salary = 30000
PATCH - Salary = 15000 
PUT - salary = 40000
PATCH - salary = 25000
PATCH - salary = 23000
PUT - Salary = 50000
PATCH - Salary = 0

大概给您的薪水为0。

Idempotent没有帮助;如果所有请求都具有PUT语义,那么您将具有相同的“最后一个作者获胜”效果。

用于处理资源的并发编辑的一种机制是使用条件请求,请参见RFC 7232。总而言之,请求使用前提条件标头和验证器来更具体地说明所请求的更改类型“如果您的副本仍为版本N,请应用这些编辑”

在那种情况下,八个共享相同的前提条件标头的请求的争用将导致(最多)一个请求被成功应用,其他请求参见412 Precondition Failed。实际上,将“最后一位作家获胜”替换为“第一位作家获胜”。

That that ... HTTP描述了请求和响应的semantics;不是implementation。了解了该消息后,服务器可以执行其喜欢的任何操作,并发送回适当的响应(例如,使用适当的标头元数据发送回当前资源的表示形式)。

并发请求的实现是什么样的?当您将编辑应用于一件事时,它通常涉及一个锁,该锁可以是隐式的或显式的。考虑数据库中的事务。根据您正在执行的操作,管理持久存储,域模型或两者中的锁定可能是适当的。

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