2012-03-09 48 views
3

我們推出了來自GAE的警報,假設我們需要將50 000條警報推送到CD2M(Cloud 2設備消息傳遞)。爲此,我們:如何在Google App Engine上儘可能快地創建X任務

  1. 閱讀所有誰願意從數據存儲
  2. 循環警報通過,併爲每個通知

創建一個「推送任務」的問題是,任務的創建需要花些時間所以這在用戶羣增長時不會擴展。根據我的經驗,我們只需要20-30秒就可以完成任務,而且有很多任務。一個任務的原因公關。推送消息是爲了讓我們可以在出現問題時重試任務,並且只會影響單個用戶。此外,C2DM僅支持一次發送給一個用戶。

它會更快,如果我們:

  1. 閱讀所有誰通過希望從數據存儲
  2. 循環警報,並創建一個「池任務」每100個用戶
  3. 每個「池任務」,將在執行時生成100個「推送任務」

任務執行速度非常快,所以在我們的場景中,似乎創建任務是瓶頸而不是執行任務。這就是爲什麼我想到這種情況能夠增加應用程序的並行性。我猜想這將導致更快的執行速度,但後來我又可能都錯了:-)

回答

1

我們做APNS(蘋果推送通知服務器)類似的東西:我們在一次創建一批通知的任務( =你稱之爲池任務)。當任務執行時,我們遍歷一批併發送給推送服務器。

您的設置不同的是,我們有一個與推通信,如APNS只支持socket通信的獨立服務器。

唯一的缺點是,如果出現錯誤,那麼整個任務將被重複,並且一些用戶可能會收到兩個通知。

+0

我們使用Urban Airship進行iOS通知,它們非常快,但對於Android我們自己也在做,這就是我們的延遲。但既然你已經實現了我正在考慮的事情,那麼我希望我們都在思考正確的事情,所以我會接受這個答案:-) – 2012-03-11 21:32:57

1

這聽起來像是根據您需要發送的警報數量,發送每個警報需要多長時間以及您正在運行的活動實例的數量而定。

我的猜測是,發送CD2M警報需要幾毫秒到幾十毫秒,而實例需要幾秒鐘才能啓動,因此您可能會發出幾百或幾千個警報在證明另一個任務實例之前。發送每個CD2M消息所花費的時間與啓動實例所花費的時間的比率將決定每個任務要發送多少個消息。

如果您已經有相當數量的實例運行,但您沒有等待實例啓動的延遲。

順便說一句,這看起來像是一個完美的MapReduce API應用程序。它主要完成你在第二個版本中描述的內容,不同之處在於它需要你的初始查詢,並將其分解成子查詢,每個子查詢返回結果集的「頁面」。爲每個處理其「頁面」中的所有項目的子查詢啓動一項任務。這與您所描述的相比有所改進,因爲您不需要花費時間循環執行初始結果集。

我相信MapReduce API的默認實現只是查詢特定類型的所有實體(即所有用戶對象),但是您可以更改所使用的過濾器。

相關問題