Как узнать, когда завершены обновления хранилища данных Google AppEngine HRD? - PullRequest
5 голосов
/ 13 февраля 2012

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

Есть ли лучший способ?

Можно ли предположить, что 15 минут дают обещание, что хранилище данных синхронизировано с моими предыдущими вызовами?

Я использую высокую репликацию.

ВGoogle IO видео о HRD, они дают список способов справиться с возможной последовательностью.Один из них должен был «принять это».Некоторые обновления (например, сообщения в твиттере) не обязательно должны соответствовать следующему прочтению.Но они также сказали что-то вроде: «Эй, мы говорим только миллисекунды за пару секунд до того, как они будут последовательными».Задокументированы ли эти временные рамки где-нибудь еще?Безопасно ли предполагать, что ожидание 1 минуты после записи перед повторным чтением будет означать, что все мои предыдущие записи присутствуют в чтении?

Упоминание об этом находится в отметке 39:30 в этом видео http://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw

Ответы [ 3 ]

0 голосов
/ 13 февраля 2012

Это автоматически, если вы получаете сущности, не меняя согласованность на Возможную.HRD передает данные на большинство соответствующих серверов хранилищ данных перед возвратом.Если вы вызываете асинхронную версию put, вам нужно вызвать get для всех объектов Future, прежде чем вы сможете быть уверены, что он завершен.

Если вы запрашиваете элементы в первом задании, естьнет никакого способа убедиться, что индекс был обновлен.

Так, например ...

Если вы обновляете свойство для каждой сущности (но не создаете какие-либо сущности), то извлекаете вселица такого рода.Вы можете выполнить запрос только по ключам с последующим пакетным получением (что примерно так же быстро / дешево, как при выполнении обычного запроса) и быть уверенным, что все обновления применены.

С другой стороны, если выВы добавляете новые сущности или обновляете свойство в первом процессе, который запрашивает второй процесс, нет уверенности.

0 голосов
/ 17 февраля 2012

Я нашел это утверждение:

При возможной согласованности более 99,9% ваших записей доступны для запросов в течение нескольких секунд.

внизу этой страницы: http://code.google.com/appengine/docs/java/datastore/hr/overview.html

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

0 голосов
/ 13 февраля 2012

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

Интересно узнать, есть ли у кого-нибудь лучшее решение.В некотором роде надеюсь, что они делают; -)

...