2013-04-25 3 views
1

Я должен увеличить три разных счетчика за одну транзакцию. Кроме того, я должен манипулировать тремя другими объектами. Я получаюМного разных счетчиков в одной транзакции

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%.

ответ

0

Как сказано в Transactions and entity groups:

самый простой подход заключается в определении, какие объекты вы должны быть способны обрабатывать в одной транзакции. Затем, создав те объекты , поместите их в одну группу сущностей, объявив их общим предком . Затем они будут находиться в одной группе лиц и , которые вы всегда сможете обновить и прочитать их транзакционно.

+0

Возможно, это скорее комментарий, чем ответ – Fiver

Смежные вопросы