1

1 回のトランザクションで 3 つの異なるカウンターをインクリメントする必要があります。それに加えて、他の 3 つのエンティティも操作する必要があります。私は得る

too many entity groups in a single transaction

https://developers.google.com/appengine/articles/sharding_countersのレシピを使用してカウンターを実装しました。ビジネス ロジックに応じて、一部のモデル (クラス) メソッド内でカウンターをインクリメントします。

回避策として、タスクを使用してカウンターを更新する遅延インクリメント メソッドを実装しました。しかし、カウンターの数がさらに増えると、1 つのトランザクションでのタスクの制限 (5 だと思います) もあり、それは最も効果的な方法ではないと思います。

また、 https://github.com/DocSavage/sharded_counter/blob/master/counter.pyも見つけました。これは、memcache を介して db エラーが発生した場合でもカウンターを確実に更新するようです。しかし、トランザクションが失敗した場合にカウンターをインクリメントしたくありません。

もう 1 つのアイデアは、Web 要求中にインクリメントする必要があるカウンターを記憶し、それらを 1 つの遅延タスクでインクリメントすることです。リクエストで作成されたオブジェクトをモデルメソッドに渡さずに、クリーンでスレッドセーフな方法でこれを実装する方法がわかりません。このコードは見苦しく、同じ翻訳ではないと思います。

def my_request_handler():
    counter_session = model.counter_session()
    model.mylogic(counter_session, other_params)
    counter_session.write()

経験やアイデアはありますか?

ところで: 私は python、ndb、flask を使用しています。カウンターが 100% 正確でなくても問題ありません。

4

1 に答える 1

0

トランザクションとエンティティ グループで述べたように:

最も簡単な方法は、同じトランザクションで処理できるようにする必要があるエンティティを決定することです。次に、それらのエンティティを作成するときに、それらを共通の祖先で宣言することにより、同じエンティティ グループに配置します。これらはすべて同じエンティティ グループに属し、常に更新してトランザクションで読み取ることができます。

于 2013-11-24T13:43:09.903 に答える