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% 正確でなくても問題ありません。