Несоответствие базы данных Google App Engine - PullRequest
1 голос
/ 01 апреля 2009

Я пишу твиттер-приложение в Google App Engine. Он принимает команды как прямые сообщения, поэтому я настроил стороннюю службу cronjob для вызова обработчика, который обрабатывает DM через равные промежутки времени. У меня есть модель «Информация», которая имеет только одну запись, она хранит некоторые общие данные, которые используются во многих местах в приложении (в этом случае, время, когда сообщения были обработаны недавно). Общая схема моего обработчика такова:

class Info(db.Model):
    msg_polled = db.DateTimeProperty(auto_now_add = True)
    .... More Properties ....

    @classmethod
    def get_info(cls):
        info = cls.all().get()
        if not info:
            info = cls()
            info.put()
        return info
---------------------------------------------------------
info = Info.get_info()
msgs = api.GetDirectMessages(since = info.msg_polled)
if not msgs:
    return
logging.info('Processing Messages since %s ' % str(info.msg_polled))
for msg in msgs:

    ...process commands...

    logging.info('Processed Message :- @%s : %s' % (msg.sender_screen_name, msg.text))

info.msg_polled = datetime.datetime.now()
info.put()

Но иногда я получаю логи, как это:

I 03-30 07:50AM 10.973
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:50AM 11.122
Processed Message :- @foo : Foo_Bar
-------------------------------------------------------
I 03-30 07:46AM 08.014
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:46AM 08.130
Processed Message :- @foo : Foo_Bar

Здесь, похоже, информация не передается в базу данных. Сообщение обрабатывается несколько раз, иногда до 10+, до изменения значения msg_polled. Но я не получаю никаких исключений в Datastore. Это происходит только время от времени.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 30 августа 2014

Вот хорошая документация о согласованности в хранилище данных GAE:

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

Заключение:

Окончательная согласованность является важным элементом нереляционных баз данных, который позволяет разработчикам находить оптимальный баланс между масштабируемостью, производительностью и согласованностью. Важно понять, как обеспечить баланс между возможной и строгой согласованностью, чтобы разработать оптимальную модель данных для вашего приложения. В Google Cloud Datastore использование групп сущностей и запросов предков - лучший способ гарантировать строгую согласованность по объему сущностей. Если ваше приложение не может включать группы объектов из-за ограничений, описанных ранее, вы можете рассмотреть другие варианты, такие как использование запросов только по ключам или Memcache. Для больших приложений примените лучшие практики, такие как использование разрозненных идентификаторов и сокращение индексации, чтобы сократить время, необходимое для согласованности. Также может быть важно объединить Google Cloud Datastore с BigQuery, чтобы выполнить бизнес-требования для сложных запросов и максимально сократить использование индексов Google Cloud Datastore.

0 голосов
/ 01 апреля 2009

В хранилище данных Google AppEngine используется BigTable, который представляет собой систему распределенной базы данных. Из-за этого обновления могут не отображаться сразу, поскольку новые данные еще не достигли каждой распределенной таблицы (Amazon называет это «возможной согласованностью» в своей SimpleDB). Вы должны быть в порядке через несколько минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...