Фреймворки, помогающие работать с возможной согласованностью и кэшированием App Engine.

Я полагаю, что у меня есть довольно типичный вариант использования, который очень сложен с возможной согласованностью. Мне интересно, создал ли кто-нибудь уже фреймворк Python, чтобы помочь с этим.

У меня есть запрос GET, который выдает запрос для набора сущностей. Они редко обновляются. У меня есть запрос POST для обновления одного объекта за раз, обновление объекта влияет на то, отображаются ли они в запросе GET.

Поскольку сущности меняются редко, я бы хотел, чтобы запрос GET хранился в памяти в течение длительного времени, скажем, дней или недель. Так что в редких случаях я получаю POST для обновления сущности, я могу очистить memcache.

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

Вместо того, чтобы просто обновлять хранилище данных и очищать кеш, мне нужно:

1. update the datastore
2. get the cached query
3. modify the cached query (with the proper sorting too!)
4. update the cache with the new modified query results (with a cas() operation)

Это кажется достаточно распространенной проблемой. Есть ли какой-либо фреймворк Python, который может помочь решить эту проблему?

ndb не помогает, так как запросы хранилища данных обходят все кэши.

Если это имеет значение, сейчас я использую django-nonrel, а django-tastypie обрабатывает запросы GET.


person dragonx    schedule 08.12.2012    source источник
comment
Кэширование запросов сколь угодно сложно — так как нет способа перечислить или запросить memcache, нет способа узнать, какие запросы могут быть закэшированы в общем случае. Я не думаю, что есть способ сделать это автоматически: если вы хотите кэшировать запросы, вы должны делать это в каждом конкретном случае.   -  person Nick Johnson    schedule 10.12.2012


Ответы (1)


Насколько я понимаю/опыт работы с memcache в GAE, ваши данные будут удалены, если только вы не используете очень большой объем трафика, но даже в этом случае это не гарантируется.

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

Чтобы получить строго согласованные результаты запроса, необходимо использовать запрос предка, ограничивающий результаты одной группой сущностей. Это работает, потому что группы сущностей являются единицей согласованности, а также транзакционности. Все операции с данными применяются ко всей группе; запрос предка не вернет свои результаты, пока вся группа сущностей не будет обновлена. Если ваше приложение использует строго согласованные результаты для определенных запросов, вам может потребоваться принять это во внимание при разработке модели данных.

Предполагая, что ваш запрос GET привязан к какому-то пользователю или другому идентифицируемому «родителю», или что вы можете создать глобальный родитель, общий для всех сущностей, которые будут получены этим GET, вы сможете использовать этого родителя для получения отправлено строго последовательно.

Пример из документации.

И вот связанный вопрос, который я задал, который показывает некоторые хорошие приемы по настройке родителя, ключа и простого идентификатора запроса: NDB использует Users API для формирования группы объектов

person Sologoub    schedule 10.12.2012