2013-04-13 44 views
1

我使用Google App Engine和Objectify並希望每5分鐘刪除一些數據庫中的條目。什麼是實現這一目標的最佳方式?我應該使用Google App Engine的ThreadManager還是cron作業?還是有另一種方式?定期刪除對象中的條目

+0

每五分鐘打算刪除多少個條目? –

+0

@IbrahimArief:很多人,也許幾十萬?或者有沒有辦法讓這些條目自動失效? –

+0

這是巨大的。自動過期共享數據的唯一方法是在Memcache中使用[expiration](https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/memcache/Expiration)選項你做一個[put operation](http://bit.ly/10S6xve),但是你的數據會是暫時的。刪除成千上萬的經常會非常昂貴的實體,你確定它的規模? –

回答

0

Cron聽起來像適合這裏的要求,但我擔心需要刪除的實體的規模。 (根據評論每五分鐘高達幾十萬)。刪除很多實體需要相當長的時間,最有可能超過五分鐘的時間,甚至可能超過前端cron處理程序的10分鐘截止時間。

一個可能的解決方案是從backend instance刪除,因爲後端可以在沒有任何最後期限的情況下運行。 Crons可用於啓動一個查詢待刪除實體的進程,使用僅鍵查詢獲取其密鑰,然後刪除多個background threads中的實體。

由於進程可以無限期運行,因此線程報告刪除完成後,您可以立即查詢並刪除下一組實體。您可以在後端使用全局內存中的鎖,以確保後續的cron請求不會踢出單獨的進程,但會在檢測到進程已經運行時靜靜地退出。所以在這裏,cron僅用作刪除過程的保持活動信號。

請注意,在數據存儲操作成本方面,頻繁查詢和刪除此實體的實體可能過於昂貴。

+0

好的謝謝!我將重新思考我的實現 –

+0

我不相信這會起作用,因爲您無法從單個實例獲得足夠的數據存儲操作吞吐量。唯一可行的方法是通過map/reduce,並且在數據存儲操作中至少需要花費150美元/天。更多如果你想讀取數據......並且有時間問題。 – stickfigure

+0

@stickfigure:謝謝傑夫,我也想知道吞吐量。儘管我喜歡mapreduce,但我不知道它是否提供了提問者所需的細粒度控制。 (我們之前在[這裏]討論過它(http://stackoverflow.com/questions/15976406/objectify-and-timertask-no-api-environment-is-registered-for-this-thread?lq=1))如果是我的應用程序,我會使用某種主人模式來分配加載和刪除,但與完全改變實施策略相比,這可能有點矯枉過正。 –

1

聽起來像你想,每5分鐘,到:

  • 寫實體成千上萬
  • 聚集成千上萬的實體
  • 刪除實體成千上萬

用map/reduce可以做到這一點。但是,這將很昂貴(每天數百美元),並且您將遇到計時問題 - 特別是在任務隊列備份時。

您應該強烈考慮將此數據存儲在GAE之外。獲取Google Compute Engine帳戶並在那裏設置mongodb或redis實例。甚至在AWS上託管它。 GAE不適合這種工作負載,但它不是「全部或全部」 - 您可以輕鬆地使用雲中其他部分的服務。

+0

好的,謝謝!我會研究它 –