2012-03-09 18 views
3

GAEからアラートを出し、50,000アラートをCD2M(クラウド2デバイスメッセージング)にプッシュする必要があるとしましょう。この私たちのために:Google App Engineでできるだけ早くXタスクを作成する方法

  1. すべて読んで、各通知

のための「プッシュタスク」を作成して、データストア

  • ループからのアラートを望んでいると、問題は、タスクの作成が取るされていることをいくつかこれはユーザーベースが大きくなると拡張されません。私の経験では、たくさんあるときにタスクを作成するのに20-30秒しかかかりません。 1つのタスクprの理由。プッシュメッセージは、何かが失敗した場合にタスクを再試行できるようにするもので、単一のサブスクライバにのみ影響します。また、C2DMは一度に1人のユーザーに送信することしかサポートしていません。

    我々ならば、それは速くなります:データストアから

    1. 読むアラートを望んでいるすべての人
    2. ループを通して、各100人の加入者
    3. のための「プールタスク」を作成し、それぞれ「プールのタスクは」意志実行時に100個の「プッシュタスク」を生成する

    タスクの実行は非常に高速です。このシナリオでは、タスクの作成はボトルネックであり、タスクの実行ではないようです。だから私はこのシナリオをアプリケーションの並列性を高めることができると考えたのです。私はこれがより速い実行につながると思いますが、もう一度私はすべて間違っているかもしれません:-)

  • 答えて

    1

    私たちはAPNS(Apple Push Notification Server)と同様のことをしています: =あなたが呼んだときのプールタスク)。タスクが実行されると、バッチを反復処理してプッシュサーバーに送信します。

    設定との違いは、APNSはソケット通信のみをサポートするため、プッシュと通信するための別のサーバーがあることです。

    唯一の欠点は、エラーがある場合、タスク全体が繰り返され、一部のユーザーが2つの通知を受け取る可能性があることです。

    +0

    私はUrban AirshipをiOS通知に使用していますが、実際は速いですが、Androidの場合は自分でやっているので、遅れています。しかし、あなたが私が正しいことを考えていることを願っているので、私はその答えを受け入れるでしょう:-) –

    1

    これは、送信するアラートの数、各アラートを送信する時間、実行しているアクティブなインスタンスの数によって異なります。

    私の推測では、CD2Mアラートを送信するのに数ミリ秒から数十ミリ秒かかりますが、インスタンスがスピンアップするまで数秒かかるため、おそらく数百から数千のアラート別のタスクインスタンスを正当化する前に各CD2Mメッセージを送信するのに要する時間とインスタンスを起動するのに要する時間の比によって、タスクごとに送信するメッセージの数が決まります。

    すでにかなりのインスタンスが稼動している場合は、インスタンスがスピンアップするのを待つ時間がありません。

    ところで、これはMapReduce APIの完璧なアプリケーションのようです。ほとんどの場合、2番目のバージョンでは、最初のクエリを取り除き、結果セットの「ページ」を返すサブクエリに分割します。 「ページ」内のすべての項目を処理するサブクエリごとにタスクが起動されます。これは、あなたが最初の結果セットをループする時間を費やす必要がないので、あなたが記述したものからの改善です。

    MapReduce APIのデフォルトの実装では、特定の種類のすべてのエンティティ(つまりすべてのユーザーオブジェクト)を照会するだけですが、使用するフィルターを変更することができます。

    関連する問題