3

好日子,谷歌應用程序引擎API:運行大型任務

我運行一個後端到應用程序作爲一個應用程序引擎(JAVA)。 使用端點,我收到請求。問題是,我需要計算一些大的東西,但我需要快速響應前端的響應時間。因此,作爲一種解決方案,我想預先計算某些內容,並將其存儲爲專用的內存緩存。

我這樣做的方式,是通過添加靜態塊,然後運行在默認隊列中的延遲任務。 有沒有更好的方法在啓動時計算一些東西?

現在,這種延遲任務執行大量的數據存儲操作。有時候,他們超時。所以我創建了一個系統,它在超時之前重試,直到成功。但是,當我啓動應用程序引擎時,它立即創建兩個延期任務。儘管事實上我設置了DeferredTaskContext.setDoNotRetry(true);它也會在失敗時重試任務。

老實說,延期任務感覺非常挑剔。

我只是想(爲數據集增長可能更長)來運行需要> 5分鐘的方法。我想在啓動時運行此方法,然後定期運行。你會如何模型?我的第一個想法是一個cron工作,但他們的時間有限。我需要一個運行延期任務的cron作業,希望它們不會以某種方式堆積起來或產生重複或重新開始。

感謝您的幫助和美好的一天。

德賴斯

+0

cron作業與延期任務的截止日期相同 – Greg

+1

您如何跨實例共享/訪問此數據(分類器)?記住每個實例都有自己的內存。所以目前我會想象你每次啓動實例時都會開始構建。一旦處理完畢,它可以被序列化爲<1MB,如果不是,那麼你將需要拆分序列化的實體並將其存儲在塊(在數據存儲區中)。從數據存儲獲得的速度並不比memcache慢,而且是可靠的。 –

+0

這是我的主要問題,它不能輕易地在數據存儲中的單個塊中進行序列化。所以無論如何,我將不得不做一些批量操作。 –

回答

1
  1. 您的數據存儲區操作絕不超時。您需要解決這個問題 - 最有可能的方法是使用遊標併爲您的大型查詢設置正確的批處理大小。

  2. 您可以執行initialization of objects on instance startup - 檢查的對象是可用的,如果不是 - 做計算。

  3. 記住你的計算結果存儲在數據存儲區(除內存緩存)作爲內存緩存是揮發性。這樣,如果Memcache對象由於任何原因而被刪除,則在第一次計算完成後幾秒鐘內不必重新計算所有內容。

  4. 遞延任務可以安排在指定的延遲後執行。因此,而不是使用cron作業,您可以創建1小時後執行的任務(例如)。這項任務在完成自己的計算後,可以創建另一項任務,在一小時後激發,等等。

+1

感謝您的回覆, 問題是我需要建立一個分類模型。這不是簡單的存儲。即使我存儲模型,仍然是一個很大的查詢來檢索它,這會導致問題(主要是超時)。 我寧願計算一次,將內容保存在內存中,以便我可以快速對來自前端的實例進行分類 –

+0

如果可以將它存儲在Memcache中,則可以將其存儲在數據存儲區中。即使你檢索了十億個實體,只要你使用遊標,任何查詢都不應該超時。 –