真正的问题是,即使连接不再存在(例如已终止,丢失的互联网连接),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"
执行吗?或者实例将被终止并且所有后续代码都被忽略?
答案 0 :(得分:0)
如果客户端断开连接,请求将继续执行。除非它达到60秒的最后期限。
答案 1 :(得分:0)
GAE使用Pending Queue对请求进行排队。如果客户端丢弃连接并且请求已经在队列中或正在执行,那么它将不会被中止。所有其他http服务器的行为方式相同。
当您在移动网络上发出更改状态(PUT,POST,DELETE)的请求时,这将是一个真正的问题。在Edge网络上,我们看到大约1%的大请求(上传,~500kb)在请求执行过程中被丢弃(exec需要大约1秒):例如服务器获取数据并处理它,但客户端没有收到响应,触发它重试。这可能会在数据库中产生重复数据,从而破坏了此数据的完整性。
为了缓解这种情况,您需要制作Web方法idempotent:使用相同的参数重复相同的方法不会改变状态。实现这一目标的最简单方法之一是:
very_very_very_long_string_like_1GB
)。你可以做这个服务器端。