如何解决确保每个用户在GAE / J中的请求处理序列化
| Google Appengine的默认模式是每个实例以单线程模式运行。如果需要,它们会通过生成新的JVM实例来处理并发请求。 不过,新的开关允许appengine在同一个实例上并行处理多个请求。 迄今为止,为了确保同一用户的请求之间的线程安全,我在常规托管的Java Web应用程序中所做的就是在http会话(或会话中存储的值)上进行同步。 Spring也会这样做(使用synchronizeOnSession
标志)。
这在GAE中是不可能的,因为HttpSession(及其存储的所有变量)总是在每个http请求中都是新的。也就是说,哈希码始终是不同的。因此,对此进行同步完全无效。但是,即使有可能,appengine也不保证同一实例将处理来自同一用户的两个请求(类似于粘性会话)。
appengine的新标志警告:
如果您想使用并发
请求,您的应用程序代码需求
使用适当的线程同步
在启用之前。
因此,如何确保我的应用程序对于来自同一用户的操作而言是线程安全的?我最关心的是用户可以对其HTTP会话中存在的数据执行的操作。我显然只关心在同一实例中同步同一用户的请求。
谢谢
解决方法
一些注意事项:
尝试在客户端保持应用程序状态,即使用javascript处理它。在那里,您可以防止用户一次或无序发送多个请求。
由于GAE可以在不同的服务器上并行运行多个实例,因此您在会话上进行同步的工作大部分时间都是有效的,但并不能保证始终都有效。
我想您想做的是防止用户将其数据置于不一致状态(通过无序执行操作)。最终,GAE中唯一同步的点是数据存储区事务。使用它们可以使数据保持一致状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。