Нужна ли блокировка для bigtable?

Я использую очередь задач для обновления определенных данных в GAE.

Мой файл queue.xml выглядит следующим образом:

  <queue> 
    <name>data-processing</name> 
    <rate>20/s</rate> 
  </queue> 

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

Кредит хранится в таблице и обновляется после завершения задачи.

Я вижу задачи как потоки и беспокоюсь о проблеме синхронизации.

Что делать, если две или более задач запрашивают/обновляют кредитную таблицу одновременно? Нужно ли мне создавать какой-то механизм блокировки? Если да, то как?


person Manjoor    schedule 21.06.2010    source источник


Ответы (2)


Да, вам нужна синхронизация. Обычно вы обновляете кредиты по схеме «чтение-изменение-запись»: сначала считывайте доступные кредиты, вычитайте один и записывайте оставшиеся кредиты обратно. Если две задачи делают это одновременно, одна из них может перезаписать результат другой, что приведет к сохранению неправильного счетчика кредитов. (Если для этого нет атомарной инструкции, которая существует для Memcache, но не для хранилища данных, я полагаю).

Для решения этой проблемы можно использовать транзакции, см. http://code.google.com/appengine/docs/java/datastore/transactions.html

person Wim    schedule 21.06.2010

Очередь задач App Engine сама учитывает скорость выполнения. Вам не нужно ничего делать, кроме как настроить queue.xml, как вы это уже сделали.

person Nick Johnson    schedule 21.06.2010