1

真正的问题是 Google App Engine 是否保证即使连接不再存在(例如终止、丢失 Internet 连接)它也会完成 HTTP 请求。

说我们有一个在 Google App Engine 上运行的 python 脚本:

  db.put(status = "Outputting")

  print very_very_very_long_string_like_1GB

  db.put(status = "done")

如果客户端决定在中间关闭连接(太多数据来了……),会status = "done"被执行吗?还是会杀死实例并忽略所有以下代码?

4

2 回答 2

0

GAE 使用 Pending Queue 对请求进行排队。如果客户端断开连接并且请求已经在队列中或正在执行,那么它不会被中止。Afaik 所有其他 http servres 的行为方式相同。

当您在移动网络上发出更改状态(PUT、POST、DELETE)的请求时,这将是一个真正的问题。在边缘网络上,我们看到大约 1% 的大请求(上传,~500kb)在请求执行过程中被丢弃(执行大约需要 1 秒):例如,服务器获取数据并处理它,但客户端没有收到响应,触发它重试。这可能会在数据库中产生重复数据,从而破坏该数据的完整性。

为了缓解这种情况,您需要使您的 Web 方法具有幂等性:使用相同的参数重复相同的方法不会改变状态。实现这一目标的最简单方法是以下之一:

  1. 散列相关数据并与现有散列进行比较。在您的情况下,它将是您尝试保存的字符串(very_very_very_long_string_like_1GB)。你可以做这个服务器端。
  2. 客户端提供唯一的请求范围 ID,服务器检查此 ID 是否已被使用。
于 2013-07-13T09:04:15.673 回答
0

如果客户端中断连接,请求将继续执行。除非它达到 60 秒的最后期限。

于 2013-07-13T03:31:38.373 回答