0

我正在构建一个接收请求的 REST Web 服务,如果操作正确完成,则必须返回“Ok”。在返回此“Ok”消息时,我该如何处理连接松动的可能性?

例如,像 Amazon SimpleDB 这样的系统。

1)它收到一个请求。2) 处理请求(存储和复制内容)。3) 返回确认信息。

如果在阶段 2 和阶段 3 之间连接丢失,客户端认为操作不成功,然后再次提交。

谢谢!

4

3 回答 3

0

我今年早些时候审查的一个系统有一个与此类似的过程。他们实施的解决方案是让客户端回复提交消息,并在此时清除记录上的标志。有一个定期进程,每 N 分钟检查一次,如果存在已完成但客户端未确认的条目,则该事务将回滚。这允许客户端重新发布事务,但没有在服务器端提交 2 条“真实”记录。

于 2010-10-27T22:22:10.653 回答
0

如果出现超时情况,您可以执行以下操作:

发送客户端生成的唯一 ID,并在标头中包含初始请求。

如果客户端没有得到响应,那么它可以重新发送具有相同 id 的请求。

服务器可以保留成功处理的 id 列表并返回 OK,而不是重复该操作。

唯一的问题是服务器最终需要删除客户端 ID。因此,在清除它们之前,服务器需要一个时间窗口来保留这些 ID。

于 2010-10-27T22:24:02.073 回答
0

取决于网络服务的类型。HTTP 和 REST 的全部性质是它基本上是无状态的。

例如,在 SimpleDB 的情况下,如果您只是请求给定键的值。如果在返回它的过程中客户端连接被断开,那么客户端可以简单地在以后重新请求数据。无论如何,该数据很可能已被数据库引擎或操作系统磁盘缓存缓存。

如果您正在存储或更新一个值并且数据是相同的,那么数据库引擎通常会知道数据没有更改,因此更新根本不会花费很长时间。

即使是复杂的查询也可以在某些数据库引擎上第二次运行得更快。

简而言之,除非您能证明存在性能问题,否则我不会担心。在这种情况下,开始自己缓存一些最近查询的结果。一些基于 REST 的框架将为您执行此操作。我怀疑你甚至不会在实践中发现它是一个问题。

于 2010-11-24T02:05:02.690 回答