2009-05-02 9 views
1

私はGoogleのアプリケーションエンジンを使用してソフトウェアを開発しています。Googleアプリケーションエンジン - cronタスクに関する設計上の考慮

私は、次の問題に関する最適設計についていくつかの考慮事項があります。一定の間隔でいくつかのエンティティのスナップショットを作成して保存する必要があります。

従来のリレーショナルデータベースの世界では、新しい要約レコードを挿入するdbジョブを作成しました。

たとえば、ジョブは、現在のスコアを「userrank」テーブルに格納するアクティブなすべてのユーザー、たとえば1時間ごとにレコードを挿入します。

Googleのアプリエンジンでこれを達成するための最良の方法は何ですか。私はCronサービスがあることを知っていますが、何千ものレコードを挿入/更新するジョブを実行することができますか?

+0

無料で試してみたり、サービスに加入しているかどうかは、登録したかどうかによって決まります。あなたが加入者でなければならないように、何千ものレコードをcronベースで扱うのは聞こえます。あなたのステータスを明確にすることはできますか?App Engineの時間を払っていますか? – duffymo

+0

一定のレベルまで申し込んだ後、サービスに加入します。しかし、私は1つのことを聞かせて、加入者であるか、要求のタイムアウトに違いを生じさせないのでしょうか?私はそれを支払っても何千ものレコードを処理させてくれるのかどうかはわかりません。右? – shanyu

+0

課金を有効にすると、いくつかの制限が発生しますが、要求のタイムアウトはそれらの制限ではありません。 –

答えて

2

代わりにremote apiを使用したことがありますか?この方法で、データストアにシェルを取得し、タイムアウトを回避することができます。そのリンクで示したMapperクラスは非常に便利で、私は約1500個のオブジェクトをバッチ処理するのに成功しました。

つまり、cronもうまく動作するはずです。個々のリクエストの時間には制限がありますので、一度にすべてのリクエストを処理することはできませんが、リダイレクトを使用して、一度に1人のユーザーを処理して、必要な数のユーザーにループすることができます。このアプローチの助けが必要な場合は、どこかのドキュメントに例があるはずです。

+0

ありがとう、Kiv。このシナリオを考えてみましょう。私は5000人のユーザーがおり、タイムアウト前のCronタスクは100人のユーザーを処理できます。つまり、私はCronのURLを50回も呼び出さなければならないということです。もし私がそれをしたら、それはGoogleの欲しいリストに載っていて、それと同じくらい重要なのは良い練習ですか?リモートAPIについては、リモートAPI実行のスケジューリング方法に関する提案はありますか? – shanyu

+0

私はそれが問題になるとは思わない。彼らがあなたに与えるクォータは非常に寛大ですので、クォータの詳細を見て、あなたが終わっていないことを確認してください。 – Kiv

+0

リモートAPIの実行をスケジュールする方法の1つは、ローカルのマシンにリモートAPIスクリプトを実行するだけの通常の(App Engine以外の)cronタスクを実行させることです。しかし、これはあなたのローカルマシンを常に持っている必要があります。 – Kiv

3

私は毎時間すべてのユーザーの状態をスナップショットすることは、フレームワークに関係なくうまくスケーリングできるものではないと思います。より一般的な環境では、より長い実行タスクを持たせることでこれを隠すでしょうが、すべてのユーザーのデータのスナップショットを1時間ごとに取ることは現実的ではありません。

「最後のスナップショット」フィールドを追加し、モデルのput()関数をサブクラス化します(Pythonを使用していると仮定して、Javaでも可能ですが、シンタックス)を使用して、レコードを更新するたびに、最後のスナップショットから1時間以上経過したかどうかを確認し、そうであればスナップショットレコードを作成して書き込みます。

2つの同一のスナップショットを同時に作成しないようにするには、スナップショットを取得した時刻から取得したキー名をスナップショットに付けることをお勧めします。このように、2つの同時更新がスナップショットを書き込もうとすると、無害に上書きされます。

特定の時間のスナップショットを取得するには、要求された期間より新しい最も古いスナップショットを照会するだけです。追加のボーナスとして、非アクティブなレコードはスナップショットされていないため、多くのスペースも節約できます。

+0

+1、これは確かにより効率的です。 – Kiv

+0

良い点ですが、ここではscenerioです:アプリケーションが金融市場をシミュレートしているとします。すべてのユーザーは契約のポートフォリオを保持しています。ユーザーのポートフォリオの市場価値は、取引するだけでなく、他のすべての取引が変化するために変化します。ユーザーのポートフォリオの現在の値は、自分の行動に関連付けられていません。この場合は何ができるのですか? – shanyu

+2

十分な公正。この状況では、実際にスナップショットがいつ実行されるかは関係ありません。必要に応じて過去のデータに基づいて過去のスナップショットを生成することができます。この場合、ロードマップにあるバックグラウンド処理のサポートを待っていることが最善の策になると思います。あなたが複数の「細かい」クーロンや1分未満の時間を持つクーロンを持つことはできないので、クルーの仕事はKivの示唆どおり完全には機能しません。最初のリクエストでユーザーの履歴データを生成して保存することをお勧めしますが、十分に速く行うことはできません。ポートフォリオの大きさによって異なります。 –

0

ここでは、CronジョブとルーピングURLフェッチメソッドの組み合わせを使用します:http://stage.vambenepe.com/archives/549。このようにしてタイムアウトを捕まえ、別の要求を開始することができます。

この記事を要約すると、cronジョブは最初のプロセスを呼び出し、タイムアウトエラーをキャッチして、もう一度プロセスを呼び出し、2番目のURLとしてマスクします。あなたは2つのURLの間でpingを実行して、あなたが偶発的なループに陥っていると思わないようにする必要があります。無限にループしないように注意する必要もあります。更新ループの終了状態が存在することを確認してください。終了しないと、クォータがかなり早く終了してしまいます。

関連する問題