Нужно ли заблокировать bigtable? - PullRequest
2 голосов
/ 21 июня 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 21 июня 2010

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

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

0 голосов
/ 21 июня 2010

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

...