2010-10-27 68 views
0

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

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

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

如果第2阶段和第3阶段之间的连接丢失,客户端认为该操作未成功,则再次提交。

谢谢!

回答

0

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

0

在超时的情况时,你可以做到以下几点:

发送客户端生成唯一的ID,在头的初始请求。

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

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

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

0

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

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

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

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

总之,我不会担心它,除非你能证明有性能问题。在这种情况下,请自行缓存一些最近查询的结果。一些基于REST的框架将为您做到这一点。我怀疑你在实践中甚至不会发现它是一个问题。