Windows Azure Выполнить однократно - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь инициализировать свои данные в таблицах данных Azure, но я хочу, чтобы это происходило только один раз на сервере при запуске (т. Е. С помощью подпрограммы WebRole Role Entry OnStart).Проблема заключается в том, что если у меня одновременно запускается несколько экземпляров, то потенциально любой из этих экземпляров может одновременно добавлять записи в одну и ту же таблицу, что дублирует данные во время выполнения.

Есть ли там каквсеобъемлющая рутина для всех случаев?Объект приложения, в который я могу вставить значение и проверить его в каждом из экземпляров, чтобы увидеть, были ли созданы таблицы или нет?Синглтон какого-то рода, который выставляет лазурь?

Cheers Rob

Ответы [ 4 ]

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

Нет, но вы можете использовать Blob аренды в качестве мьютекса.Вы также можете использовать блокировку таблицы в SQL Azure, если вы ее используете.

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

Вы также можете использовать Очередь и добавить туда сообщение, и тогда только одна роль получит сообщение и обработает его.

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

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

Сообщение в очереди - отличный способ обеспечить транзакционные возможности, пока выполняемая вами работа может быть идемпотентной.

  • Каждый экземпляр добавляет сообщение в очередь.
  • Каждый экземпляр опрашивает очередь и при получении сообщения

    • Считывает строку блокировки из таблицы.

      • Если значение «создать состояние данных» является «невостребованным»

        • Попытки обновить строку значением «в процессе» и отметкой времени истечения времени ожидания, основанной на количестве времени, необходимого для создания данных.

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

          • Итак, создайте данные
          • обновить "создать состояние данных" до "зафиксировано"
          • удалить сообщение
        • иначе, если обновление не выполнено, экземпляр не является владельцем задачи

          • , поэтому просто удалите сообщение.
      • В противном случае, если значение «создать данные» находится «в процессе», проверьте, не истекло ли текущее время по времени истечения срока действия.

        • Это будет означать, что "в процессе" не удалось
        • Так что попробуйте еще раз, чтобы установить состояние «в процессе», удалить неполные записанные строки
        • И попробуйте воссоздать данные, обновить состояние и удалить сообщение
      • Иначе, если значение «создать данные» - «зафиксировано»

        • Просто удалите сообщение из очереди, так как работа уже выполнена
0 голосов
/ 13 февраля 2012

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

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