2013-06-11 97 views
2

我在GAE上運行Java服務器以支持Android應用程序。如何在GAE響應後進行一些處理

當應用程序啓動時,它向服務器發出請求 - 該請求應該儘快返回。該請求也應該觸發幾秒鐘的二級處理 - 次要的是響應沒有必要,所以我希望它在請求完成後確實發生。

下面是我在考慮如何做到這一點的選擇:

  • 最明顯的解決方案是應用第一個完成時執行第二請求。這似乎相當浪費,因爲通常不會發送或接收數據。如果輔助處理確實爲客戶端產生了一些額外的數據(20%),我現在可以通過GCM發送它,現在GCM支持有效載荷。

  • DeferredTasks聽起來很完美,但由於它們是在任務隊列之上實現的,我猜他們遭受與任務隊列相同的問題。

  • TaskQueues聲音也很合適,但有一點讀數表明他們的時間變化很大 - 通常會有相當的延遲。正如我上面提到的,在20%的情況下,我的輔助處理將產生一些額外的數據發送給客戶端,以顯示給用戶。
    如果我的任務在10秒鐘內完成,80%的時間沒問題,但聽起來並非如此。 [編輯]對不起,並不是說剩餘的20%不重要 - 我仍然希望它們在20-30s內發生,例如,而用戶仍然在應用程序]

有一些方法我可以配置我的應用程序,使得推送任務隊列中獲得相當高的優先級,而不會產生不必要的費用?

  • 異步網址提取。在我看來,如果我在完成初始請求之前對我自己的URL之一進行異步URL獲取,那麼這將符合我的目的。我能想到的主要負面因素是,這可能會導致GAE啓動我的應用程序的新實例,因爲它正試圖在初始請求完成之前處理新請求。爲了提高效率和成本,我寧願讓我的二次加工與我最初的要求一起進行。

  • 主題不是一個選項AFAIK。在請求處理程序中產生的線程不能超出請求處理程序本身的壽命。

那麼,這些選項(或其他?)中的哪一個最適合我的目的?

回答

0

任務隊列是獲得您想要的後臺處理的最佳方式。長時間執行延誤的報告有些誇張。你可以查看live execution timing measurements(點擊一個Taskqueue圖標),看看它是否在你的要求範圍內。

最近幾天它顯示任務通常在300毫秒內執行。目測這些數據表明大約90%的任務在3秒內執行完畢。

偶爾會出現延遲,但對於「不需要響應」的數據,我發現Taskqueues工作得很好。

+0

哦,我沒有注意到我可以從該頁面獲得TQ處理延遲數據 - 哎呦。非常有用的數據。我可以看到其他人提到的高度可變性,並且可以理解這會使他們不適合大多數用戶正在等待數據的用例,但對於我的目的而言,我認爲這是可以接受的(雖然不是理想的)。 – Tom

1

星這一個:https://code.google.com/p/googleappengine/issues/detail?id=4901

無法使用後臺線程/線程:靜態java.util.concurrent.ThreadFactory backgroundThreadFactory() 返回的ThreadFactory,將創建獨立於當前請求的線程。

從文檔:https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager

+0

不,線程不是一個選項。線程不允許超出請求的使用期限。我會更新我的問題來解決這個問題。但是,謝謝你的建議,我會明確這個問題。 – Tom

+0

但是你可以使用後端(線程):https://developers.google.com/appengine/docs/java/backends/ – voscausa

+0

是的,但後端聽起來很重(而且相當昂貴),我想要做的事情。 – Tom

3

任務隊列最適合您在App Engine上的目的。我認爲滿足您所有要求的唯一方法是使用您自己的服務器,或類似EC2/GCE。

異步URL獲取有風險,因爲如果由於某種原因失敗,它將不會被重新提交。任務隊列可以高速配置,從而降低需要花費很長時間安排任務的風險。線程不是一個選項:當一個請求完成時,不能提交任何RPC(即,如果你的請求完成後又有另一個線程在運行,那麼這個線程將無法做任何有用的事情)。

+0

請閱讀voscausa註明的問題鏈接。使用任務隊列參數配置高吞吐量TQ不會影響不可預知的TQ啓動問題。一般來說,您可以立即開始依賴高吞吐量任務。但是,有些時候任務會延遲幾分鐘。沒有人知道爲什麼。這是由Vlad發起的關於Google Groups的一個非常大的討論。 GAE工程師從未提供任何見解。我本人在團隊中主張可以依賴的一個高優先級隊列。也許有了新的應用/服務器架構? – stevep

+0

我同意這個答案中的大部分觀點,但不是結論。 stevep提出的觀點和voscausa提到的問題加強了我對TQ沒有可靠時機的擔憂。我已經對我的問題進行了編輯,以使我的時序要求更清晰。 – Tom

+0

我同意我使用任務隊列的答案並不好。不過,它是目前在應用引擎上可以做的**最好的**。如果你想滿足你的所有需求,你需要使用不是應用引擎的東西。 – mjibson