2012-04-29 75 views
0

我們有兩個cron作業命中兩個不同的動態後端,兩者都有相同的問題。我可以通過導航到cron作業直接在瀏覽器中執行的URL來複制問題。AppEngine後端返回503 - Java

我們的應用程序具有相當高的冷啓動時間。當我瀏覽到使用後端的網址,我看到下面的錯誤

Error: Server Error 
The service you requested is not available yet. 

Please try again in 30 seconds. 

在日誌中,我看到了請求/ _ah /啓動(我們不必爲這個特定的處理程序)的後端與此消息:

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

然後我所做的是刷新後端網址,它工作正常。

所以我的理論是,如果後端已經加載,cron作業將會正常工作。如果不是,它不會等待足夠長的時間來查看後端是否會加載。

假設這是正確的,有沒有辦法讓cron作業等到/ _ah/start完成?

另外兩個選擇是使用一個我們不想做的駐留實例,或者改善我們在待辦事項列表上的冷啓動時間,但直到現在我們還沒有遇到問題(我們使用一個居民前端實例)。

後端是B1。假設我們可以升級這個,但又是一個現金不足的創業公司,我寧願不要。

回答

3

Cron沒有taskqueue具有的重試功能,所以我建議使用前端cron爲了將任務放到具有動態後端實例的任務隊列中。這樣,cron請求本身將由空閒的前端實例處理,這比現在正在做的更可靠,並且在失敗時將重試後端任務執行。

爲了創建第一個cron調用robuster,您可以爲一個特定的後端任務多次執行cron請求,並且在執行任務時,將任務命名爲與某個特定任務(例如20120430-task1或其他任務)關聯的任務,捕獲任務重複的錯誤(除了日誌記錄外,在catch子句中什麼都不做)。

有關命名任務的詳細信息,請參閱: https://developers.google.com/appengine/docs/java/taskqueue/overview#Task_Names

+0

我最終完成了你在第一段描述的內容,並且它工作正常。如果它開始行動起來,我們會根據您的建議使cron通話更加健壯。 – 2012-04-30 13:02:50

0

我已經用於確保後端建立一個方便的技巧是聯機,並準備走的是你做30秒前安排一個什麼都不做的cron -work cron。無操作請求失敗或成功並不重要,它會在重要的cron之前預熱後端。

關於錯誤代碼503的另一個說明 - 如果您處理不存在的後端實例編號,有時會發生這種情況。檢查任務標頭以確保後端主機是0.yourbackend.yourapp.appspot.com,或#是<總分配的後端。