1

Я использую Google AppEngine в Java аромате, и я пытаюсь сделать следующее:Параллельное пишет различные свойства GAE Datastore Entity

1 - создать объект со свойством COUNT как 0.

2a - пнуть задачу очереди задач, которая делает некоторые сетевой вызов, и обновляет свойство STATUS для этого же объекта (с использованием Datastore#put)

2b - между тем, в оригинале «нить», сохранить другой номер для COUNT. (Также с помощью Datastore#put)

, учитывая, что 2a и 2b может закончить параллельно в одно и то же время, но они обновляются два различных свойства (STATUS и COUNT), что эти когда-либо конфликта или бросить как одновременного исключения модификации?

+1

Datastore ставит всю единицу сразу, поэтому без транзакций последнее обновление будет переписывать другое поле со старым значением –

+0

@IgorArtamonov, а что касается встроенных объектов? смогут ли они обновляться независимо от содержащего «родительского» объекта? –

ответ

1

Как отметил Игорь Артамонов, изменение одного объекта объекта требует повторной записи всего объекта. Имея это в виду, вы смотрите на 2 записи сущностей, которые должны быть сделаны внутри транзакций, чтобы предотвратить переписывание друг друга.

Поток, который вы описываете, вызовет транзакции, если транзакция, связанная с заданием enqueud в 2a, начинается до того, как транзакция 2b будет совершена.

Выполнение задачи 2a задерживается - это будет запрос, поразивший вас приложением в более поздний момент (фактическая задержка зависит от нагрузки вашего приложения в данный момент и его конфигурации масштабируемости). Это может быть много дольше, чем исполнение 2b. Или это может быть крошечным, позволяя 2a начинать до конца 2b.

Я бы рекомендовал изменить порядок опов, чтобы сделать его более предсказуемым и, как побочный эффект, свести к минимуму вероятность столкновений транзакций/RETRIES:

  • на текущем потоке запроса выполнения 2b (в a)
  • в той же транзакции transactionally enqueue задача 2a, которая должна произойти только после того, как 2b будет успешной. В противном случае вам нужно позаботиться о потенциальной регистрации нескольких задач 2a во время повторных попыток 2b.
+0

, так что ... с свойством 'STATUS', я действительно надеялся сделать это там, где я отмечаю что-то как потерпевшее неудачу, так что он будет поднят позже (когда другая зависимая служба снова будет работать и работает). должен ли я фактически создать отдельный объект хранилища данных для каждой неудавшейся задачи? –

+0

Это тоже работает. Еще одна возможность, по крайней мере, на python, состоит в том, чтобы заставить задачи перезагрузить себя при сбое (с задержкой отсрочки), так что вам не нужно также отслеживать их в хранилище данных (как отдельные объекты или как свойства сущности, на которых они действуют). Но это действительно зависит от вас и от вашего приложения. В любом случае все в порядке. –

+0

У меня уже есть отсрочка, и они утверждают, что их SLA «24 часа». но я просто чересчур параноик. таким образом это позволит им хорошо в течение недели, если они в ней нуждаются. –