确保GAE / J中的每个用户请求处理序列化

时间:2011-06-12 07:12:13

标签: java google-app-engine web-applications concurrency httpsession

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

虽然new switch允许appengine在同一个实例上并行处理多个请求。

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

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

appengine的新旗帜警告说:

  

如果您希望使用并发   请求,您的应用程序代码需求   使用正确的线程同步   在启用之前。

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

由于

1 个答案:

答案 0 :(得分:2)

一些注意事项:

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

  2. 由于GAE可以在不同的服务器上并行运行多个实例,因此您在会话上同步的工作大部分时间都可以正常工作,但不能保证一直都能正常工作。

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