如果在AppEngine仍在运行时关闭HTTP连接会发生什么

时间:2013-07-12 22:51:02

标签: python google-app-engine

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

我们在Google App Engine上运行了一个python脚本:

  db.put(status = "Outputting")

  print very_very_very_long_string_like_1GB

  db.put(status = "done")

如果客户端决定在中间关闭连接(来的数据太多......),会status = "done"执行吗?或者实例将被终止并且所有后续代码都被忽略?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

  1. 哈希相关数据并与现有哈希值进行比较。在您的情况下,它将是您尝试保存的字符串(very_very_very_long_string_like_1GB)。你可以做这个服务器端。
  2. 客户端提供唯一的请求范围ID,并检查此ID是否已被使用。