3

google appengine 的默认模式是每个实例都以单线程模式运行。如果需要,它们会通过生成新的 JVM 实例来处理并发请求。

一个新的开关允许 appengine 在同一个实例上并行处理多个请求。

到目前为止,为了确保同一用户的请求之间的线程安全,我在定期托管的 Java Web 应用程序中所做的是在 http 会话(或存储在会话中的值)上同步。Spring 也这样做(使用synchronizeOnSession标志)。

这在 GAE 中是不可能的,因为 HttpSession(连同它存储的所有变量)在每个 http 请求中总是新的。也就是说,哈希码总是不同的。因此,同步对此没有任何影响。但即使这是可能的,appengine 也不保证来自同一用户的两个请求将由同一实例处理(类似于粘性会话)。

appengine 的新标志警告说:

如果您希望使用并发请求,您的应用程序代码需要在启用 .

那么,如何确保我的应用程序对于来自同一用户的操作是线程安全的?我最关心的是用户可以对他的 http 会话中存在的数据执行的操作。我显然只关心在同一实例中同步同一用户的请求。

谢谢

4

1 回答 1

2

几点注意事项:

  1. 尝试在客户端保持应用程序状态,即使用 javascript 处理它。在那里,您可以防止用户一次发送多个请求或无序发送。

  2. 由于 GAE 可以在不同的服务器上并行运行多个实例,因此您在会话上进行同步的努力大部分时间都可以工作,但不能保证始终有效。

  3. 我想您要做的是防止用户将他的数据置于不一致的状态(通过无序执行操作)。最终,GAE 中唯一的同步点是数据存储事务。使用它们使数据保持一致状态。

于 2011-06-12T07:36:48.273 回答