質問

Googleアプリエンジンを使用してソフトウェアを開発しています。

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

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

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

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

役に立ちましたか?

解決

代わりにリモートAPI の使用を検討しましたか?このようにして、データストアにシェルを取得し、タイムアウトを回避できます。そのリンクでデモンストレーションするマッパークラスは非常に便利で、これを使用して〜1500個のオブジェクトのバッチ操作を正常に実行しました。

とはいえ、cronも正常に動作するはずです。個々のリクエストの時間に制限があるため、一度にすべてを噛むことはできませんが、リダイレクションを使用して必要な数のユーザーをループ処理し、一度に1人のユーザーを処理できます。このアプローチの支援が必要な場合は、ドキュメントのどこかにこの例があるはずです。

他のヒント

すべてのユーザーの状態を1時間ごとにスナップショットすることは、フレームワークに関係なく適切にスケーリングされるものではないことに気付くと思います。より一般的な環境では、タスクの実行時間を長くすることでこれを隠蔽しますが、すべてのユーザーのデータのスナップショットを1時間ごとに取得するのは実用的ではないポイントに到達します。

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

2つの同一のスナップショットを作成する同時更新を防ぐために、スナップショットが取られた時間から派生したキー名をスナップショットに付ける必要があります。そのようにして、2つの同時更新がスナップショットを書き込もうとした場合、一方が他方を無害に上書きします。

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

Cronジョブと、ここで詳述するループURLフェッチメソッドの組み合わせを使用します。 http:// stage.vambenepe.com/archives/549 。このようにして、タイムアウトをキャッチして別のリクエストを開始できます。

記事を要約すると、cronジョブは初期プロセスを呼び出し、タイムアウトエラーをキャッチして、2番目のURLとしてマスクされたプロセスを再度呼び出します。 2つのURLの間でpingを実行して、アプリエンジンが誤ってループしていると考えないようにします。また、無限ループしないように注意する必要があります。更新ループに終了状態があることを確認してください。終了ループが終了しない場合、割り当てループをすぐに超過してしまうためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top