0

一貫したカウンターを維持するために、Google App Engine プラットフォームで非常に一般的な問題についての提案を探しています。ドメインのグループをロードしてから、各グループのタスクを作成して、そのグループメンバーを別のタスクでロードするタスクがあります。現在、何千ものグループとメンバーが存在するため、タスクが多すぎます。グループの 1 ページを取得するための 1 つのタスクを作成し、そのタスク内で、各グループのメンバーを取得するための複数のタスクを作成します。ここで、すべてのグループをロードしたかどうかを確認するためのロジックを確認します。 nextPageToken を設定し、グループのロードのフラグを終了に設定します。

ただし、各グループにはメンバーをロードするための個別のタスクがあるため、すべてのグループ メンバーのタスクが終了したかどうかをすべて追跡する必要があります。ここで、numGroupMembersFinished の単一のカウントにアクセスするさまざまなタスクが同時実行の問題を引き起こし、どこかでカウントが破損して正しいデータを返さないという問題があります。

4

4 に答える 4

2

あなたの質問にはコードや提案された解決策がないため、私の答えは一般的です。そのカウンターをどこに保持する予定かを言わないからです。

ウェブ上の多くの記事がこれをカバーしています。O(1) 時間でデータストア エンティティをすばやくカウントするセミスケーラブルな方法の「シャーディング カウンター」に対する Google。

さらに重要なことは、memcache API を確認することです。そこに格納されたカウンターをアトミックにインクリメント/デクリメントする機能があります。その 1 つは同時実行の問題が発生しないことが保証されていますが、memcache エントリが削除されていないことを回復および/または再確認する方法が必要です。 by key」を使用して、常に最新の値を取得します。

これはまだ 100% の防弾ではありません。これは、キャッシュを変更しようとする同時試行が多数あると同時にキャッシュが削除される可能性があるため、バックアップ データストア エンティティが「セット」を見逃す可能性があるためです。

予想される同時使用量に基づいて、増分/減分を見逃す可能性が地球に衝突する彗星よりも大きいかどうかを計算する必要があります。うまくいけば、航空管制官で使用しないでください。

于 2015-05-01T17:20:56.373 に答える
0

このチュートリアルを使用しました: https://cloud.google.com/appengine/articles/sharding_countersを hashid ライブラリと一緒に使用し、このgolangライブラリを作成しました:

https://github.com/janekolszak/go-gae-uid

gen := gaeuid.NewGenerator("Kind", "HASH'S SALT", 11 /*id length*/)
c := appengine.NewContext(r)
id, err = gen.NewID(c)

他の言語でも同じアプローチが簡単なはずです。

于 2015-06-05T15:50:40.050 に答える
0

Zig Mandel が言及しました。カウンターを実装するための Google 独自のレシピへのリンクは次のとおりです。

https://cloud.google.com/appengine/articles/sharding_counters

構成可能なシャード カウンターをアプリにコピー アンド ペースト (変数の名前を変更するなど) したところ、うまく機能しています。

于 2015-05-06T21:44:59.817 に答える