Я должен увеличить три разных счетчика за одну транзакцию. Кроме того, я должен манипулировать тремя другими объектами. Я получаюМного разных счетчиков в одной транзакции
too many entity groups in a single transaction
Я использовал recipie от https://developers.google.com/appengine/articles/sharding_counters реализовать свои счетчики. Я увеличиваю счетчики внутри некоторых моделей (классов) в зависимости от бизнес-логики.
В качестве обходного решения я применил метод отложенного приращения, который использует задачи для обновления счетчика. Но это не очень хорошо масштабируется, если количество счетчиков увеличивается еще больше, поскольку в одной транзакции также есть предел задач (я думаю, что это 5), и я думаю, что это не самый эффективный способ.
Я также нашел https://github.com/DocSavage/sharded_counter/blob/master/counter.py, который, кажется, обеспечивает обновление счетчика даже в случае ошибки db через memcache. Но я не хочу увеличивать счетчики, если транзакция терпит неудачу.
Другая идея - запомнить счетчики, которые я должен увеличивать во время веб-запроса, и увеличивать их в одной отложенной задаче. Я не знаю, как реализовать это чистым и потокобезопасным способом, не передавая объекты, созданные в запросе методам модели. Я думаю, что этот код был бы уродливым и не был бы в той же трансакции:
def my_request_handler():
counter_session = model.counter_session()
model.mylogic(counter_session, other_params)
counter_session.write()
Любые впечатления или идеи?
BTW: Я использую python, ndb и flask Было бы нормально, если счетчик не является точным на 100%.
Возможно, это скорее комментарий, чем ответ – Fiver