我正在開發使用谷歌應用程序引擎的軟件。谷歌應用程序引擎 - 有關cron任務的設計考慮
我對於以下問題的優化設計有一些考慮:我需要定期創建並保存一些實體的快照。
在傳統的關係數據庫世界中,我會創建db作業插入新的摘要記錄。例如,一項工作會爲每個活躍用戶插入一條記錄,該記錄包含他當前得分到「userrank」表格,比如每小時。
我想知道什麼是在谷歌應用程序引擎中實現這一點的最佳方法。我知道有Cron服務,但它是否允許我們執行將插入/更新數千條記錄的作業?
我正在開發使用谷歌應用程序引擎的軟件。谷歌應用程序引擎 - 有關cron任務的設計考慮
我對於以下問題的優化設計有一些考慮:我需要定期創建並保存一些實體的快照。
在傳統的關係數據庫世界中,我會創建db作業插入新的摘要記錄。例如,一項工作會爲每個活躍用戶插入一條記錄,該記錄包含他當前得分到「userrank」表格,比如每小時。
我想知道什麼是在谷歌應用程序引擎中實現這一點的最佳方法。我知道有Cron服務,但它是否允許我們執行將插入/更新數千條記錄的作業?
您是否考慮過使用remote api來代替?這樣你就可以得到一個shell到你的數據存儲並避免超時。他們在該鏈接中演示的Mapper類非常有用,我成功地使用它來對〜1500個對象執行批處理操作。
也就是說,cron也應該工作的很好。您對每個請求的時間都有限制,因此您不能一次全部咀嚼所有請求,但可以使用重定向來循環訪問儘可能多的用戶,並且一次處理一個用戶。如果你需要這種方法的幫助,那麼在文檔中應該有一個例子。
我想你會發現,無論你的框架如何,每個小時對每個用戶的狀態進行快照都不會很好。更平常的環境會讓你有更長時間的運行任務來掩蓋這一點,但是你仍然會達到每小時對每個用戶的數據進行快照都不切實際的地步。
我的建議是這樣的:添加一個'last snapshot'字段,併爲你的模型的put()函數創建子類(假設你正在使用Python;在Java中也是這樣,但我不知道語法),這樣,無論何時更新記錄,它都會檢查自上次快照以來是否超過一小時,如果是,則創建並寫入快照記錄。
爲了防止併發更新創建兩個相同的快照,您需要爲快照提供從拍攝快照時得到的關鍵名稱。這樣,如果兩個併發更新嘗試寫入快照,則會無害地覆蓋另一個。
要獲取給定小時的快照,只需查詢比請求的時間段更早的最新快照。作爲額外的好處,因爲不活動的記錄沒有被快照,所以你也節省了大量的空間。
我會使用Cron作業和循環URL獲取方法的組合:http://stage.vambenepe.com/archives/549。通過這種方式,您可以捕獲超時並開始另一個請求。
要總結文章,cron作業會調用您的初始過程,您會捕獲超時錯誤並再次調用該過程,並將其作爲第二個URL進行屏蔽。您必須在兩個網址之間進行ping操作,以防止應用引擎認爲您處於意外循環。你還需要小心,不要無限循環。確保你的更新循環有一個結束狀態,因爲如果它永遠不會結束,那麼它會很快地將你的配額放在你的配額上。
我會想象它取決於你是否已經註冊嘗試免費或訂閱服務。在cron的基礎上處理數千條記錄聽起來像你應該是一個訂戶。你能澄清你的狀態嗎?您是否支付App Engine時間? – duffymo 2009-05-02 14:16:11
我們將應用程序升級到某個級別後,我們將訂閱該服務。但讓我問一件事,做一個訂閱者或不要求超時請求?即使我付錢,我也不確定他們會讓我處理數千條記錄。對? – shanyu 2009-05-02 15:40:14
已啓用計費會產生一些限制,但請求超時不是其中之一。 – 2009-05-02 16:12:06