REST POST用于创建资源。
我们说我们有资源网址 " http://example.com/cars"
我们想要开新车。 我们发布到" http://example.com/cars "包含汽车属性(颜色,重量,模型等)的JSON有效负载。
服务器接收请求,创建新车,通过网络发送回复。
此时网络失败(让路由器停止正常工作并忽略每个数据包)。
客户端因TCP超时失败(如90秒)。 客户不知道是否创建了汽车。 此外,客户还没有收到汽车资源ID,因此无法检查它是否已创建。
现在是什么? 你怎么处理这个? 你不能简单地重试创建,因为重试只会创建一个副本(这很糟糕)。
答案 0 :(得分:0)
重试次数有限次,尝试之间的延迟增加,并确保相关交易是幂等的。
因为重试只会创建一个副本(这很糟糕)。
确实如此,需要修复,见上文。您的系统中不可能创建具有相同属性的两个条目。这很容易在数据库级别完成。无论条目是已存在还是新创建,您都可以通过使事务返回相同的事物来获得幂等性。或者,如果条目已存在,则只返回EXISTS,并相应地调整客户端。
答案 1 :(得分:0)
REST POST用于创建资源。
HTTP POST用于很多事情。 REST并不特别在意;它只是想要支持统一接口和超媒体的资源。
此时网络失败
无赖!
现在怎样?你怎么处理这个?你不能简单地重试创建,因为重试只会创建一个副本(这很糟糕)。
这是一个常见的消息传递问题,与REST没有直接关系。最常见的解决方案是使用Idempotent Receiver模式。总之,你 需要定义您的消息,以便接收者有足够的信息将请求识别为已经完成的事情。
理想情况下,business level支持此功能。
幂等的价值集合往往是直截了当的;我们只需要考虑集,而不是列表。
幂等的实体集合比较棘手;如果请求包含新实体的标识符,或者我们可以根据提供的数据计算一个,那么我们可以将我们的集合视为哈希。
如果这些方法都不适合,那么还有另一种可能性。我们不是对集合进行幂等突变,而是使集合本身的变异具有幂等性。思考"比较和交换" - 我们编码为标识集合当前状态的请求信息;当请求到达时,状态仍然是当前状态,然后应用突变。如果条件不成立,则请求变为无操作。
将其转换为HTTP,我们对协议进行了一些小修改,以更新集合资源。首先,我们获得当前的代表性;在元数据中,服务器提供可用于后续请求的validators。获得验证器后,客户端评估资源的当前表示以确定是否需要更改。如果客户端决定进行更改,则使用包含验证程序的If-Match或If-Unmodified-Since标头提交更改。服务器在处理请求之前,然后考虑验证者,立即放弃412 Precondition Failed的请求。
因此,如果条件状态更改请求丢失,客户可以自行决定重复请求,而不必担心服务器会误解客户的意图。