我正在构建一个接收请求的REST Web服务,如果操作正确完成,则必须返回“Ok”。如何在返回“Ok”消息时处理连接松动的可能性?
例如,像Amazon SimpleDB这样的系统。
1)它收到一个请求。 2)处理请求(存储和复制内容)。 3)返回确认消息。
如果第2阶段和第3阶段之间的连接丢失,客户认为操作不成功,则再次提交。
谢谢!
答案 0 :(得分:0)
我今年早些时候审查的一个系统有一个类似的过程。他们实现的解决方案是让客户端回复提交消息,并在该点清除记录上的标志。每隔N分钟检查一次定期进程,如果存在已完成的条目,但客户端未确认,则该事务已回滚。这允许客户端重新发布事务,但没有在服务器端提交2个“真实”记录。
答案 1 :(得分:0)
如果出现超时情况,您可以执行以下操作:
使用标头中的初始请求发送客户端生成的唯一ID。
如果客户端没有收到回复,那么它可以重新发送具有相同ID的请求。
服务器可以保留成功处理的ID列表并返回OK,而不是重复操作。
唯一的问题是服务器最终需要删除客户端ID。因此,需要有一个时间窗口供服务器在清除之前保留ID。
答案 2 :(得分:0)
取决于Web服务的类型。 HTTP和REST的整体性质是它基本上是无状态的。
e.g。在SimpleDB情况下,如果您只是为给定键请求值。如果在返回它的过程中,客户端连接被丢弃,则客户端可以稍后重新请求数据。无论如何,数据很可能已被db引擎或操作系统磁盘缓存缓存。
如果您正在存储或更新某个值并且数据相同,那么数据库引擎通常会知道数据没有更改,因此更新不会花费很长时间。
即使是复杂的查询也可以在某些数据库引擎上第二次运行得更快。
简而言之,除非您能证明存在性能问题,否则我不会担心。在这种情况下,请自行开始缓存一些最近查询的结果。一些基于REST的框架将为您完成此任务。我怀疑你甚至不会在实践中发现它是一个问题。