我的主要目标是能够有一些同步的方法,不应该由其他线程访问,直到它完成。 如果我有通常的VM - 我会将此方法标记为synchronized。 但在GAE中,我有多个实例。 我读过的所有文章都说我应该使用memcache或数据存储。 但究竟如何?Google App Engine。如何使用memcache或数据存储进行同步操作?
4
A
回答
6
通常情况下,答案是重新设计的功能,所以它不需要全局同步。即使你设法同步它,它也是一个瓶颈。
你可能最好在后端实现它;你可以指定一个后端,并让你的函数调用对后端的请求。您也可以使用memcache或数据存储作为信号量,但所有这些都会给您带来糟糕的性能。
1
其实我并没有使用那种同步。 一旦我做到了。它似乎工作得很好。 下面是一个例子
String syncKey = "Sync:" + req.getRequestURI();
boolean lockAcquired = false;
try {
lockAcquired = acquireLock(syncKey, 5000L);
if (!lockAcquired) {
return;
}
// do something here
} finally {
if (lockAcquired) {
memcacheService.delete(syncKey);
}
}
public boolean acquireLock(String syncKey, long maxwait) {
long start = System.currentTimeMillis();
while (true) {
if (memcacheService.increment(syncKey, 1L, 0L) == 1L) {
return true;
}
if (System.currentTimeMillis() - start > maxwait) {
return false;
}
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
}
}
}
一般我使用更简单的同步。它让我有机会只运行一段代码。
final long now = System.currentTimeMillis()/(60L * 1000L); // expire every minute
if (memcacheService.increment("VoteRemoveOldTask" + now, 1L, 1L) == 1L) {
QueueFactory.getDefaultQueue().add(
TaskOptions.Builder.withDefaults().url(VoteRemoveOldTask.URL));
}
+1
有关无法依赖memcache的原因,请参阅https://cloud.google.com/developers/articles/best-practices-for-app-engine-memcache。 – ErstwhileIII 2014-02-12 04:36:48
+0
同意。但同时对于简单的情况也是如此。 – 2016-11-18 16:33:20
相关问题
- 1. Google App Engine ndb memcache何时使用memcache
- 2. Google App Engine Memcache
- 3. App Engine数据存储IN操作员 - 如何使用?
- 4. 同步Google数据存储和Blobstore使用Google App Engine(Python)上传
- 5. 各种Google App Engine数据存储操作的基准?
- 6. Google App Engine:对数据存储的操作已更改
- 7. 如何在Google App Engine上执行异步操作?
- 8. 如何将本地Google App Engine Python数据存储复制到本地Google App Engine Java数据存储?
- 9. Google App Engine Dev Server如何对数据存储区进行存根?
- 10. 数据存储一对多Google App Engine
- 11. Google App Engine数据存储区 - 主键
- 12. Google App Engine数据存储困难
- 13. Google App Engine数据存储区编码?
- 14. Google App Engine:存储数据及查询
- 15. Google App Engine中的数据存储
- 16. 了解Google App Engine数据存储
- 17. 同步SQLite数据库到App Engine数据存储?
- 18. Google App Engine屏障同步
- 19. Google App Engine Java小操作
- 20. Google App Engine - “java.lang.IllegalArgumentException:数据存储事务或写入太大。”
- 21. Google App Engine超时:数据存储操作超时或数据暂时不可用
- 22. 使用Google App Engine数据存储的GIS工具?
- 23. 使用Key.Id查询Google App Engine数据存储
- 24. 使用数据存储查看器创建实体Google App Engine
- 25. 为Google App Engine开发并使用数据存储
- 26. Google App Engine - 使用python从数据存储区刷新Ajax
- 27. App引擎memcache异步操作get_multi_async
- 28. 如何从Google App Engine数据存储检索单个记录?
- 29. 如何构建Google数据存储(App Engine)Web流量模型?
- 30. 简单的Google App Engine数据存储操作耗时过长:导致DeadlineExceededException/DatastoreTimeoutException
**您也可以使用memcache或数据存储作为信号量**究竟如何? – Boris 2013-02-16 12:59:41
请不要建议我不要有synronized动作。这是非常常见的情况,并且在通常的应用中可以完美运行。 – Boris 2013-02-16 13:01:45
逻辑上你知道如何实现信号量。如果采用这种方式,您可能希望将CAS与memcache结合使用。 https://developers.google.com/appengine/docs/python/memcache/overview#Using_Compare_and_Set_in_Python – 2013-02-16 13:32:41