我的主要目標是能夠有一些同步的方法,不應該由其他線程訪問,直到它完成。 如果我有通常的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