Связь с рабочей ролью Azure

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


person delete_this_account    schedule 10.05.2011    source источник


Ответы (1)


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

Что, если вы разместили очень простую службу wcf в экземпляре загружаемой рабочей роли с методом AreYouRunning(), возвращающим true/false? Если экземпляр все еще находится в OnStart(), вы не сможете подключиться к службе. После подключения вы просто проверяете возвращаемое значение. Вам просто нужны ваши другие роли, чтобы настроить какой-то тип механизма опроса в их OnStart() или Run() для периодического опроса.

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

person David Makogon    schedule 10.05.2011
comment
Допустим, у нас будет 10 рабочих. Starter worker поставит в очередь 10 стартовых сообщений. Каждый воркер прочитает одно сообщение и начнет свою работу. - person delete_this_account; 10.05.2011
comment
Это не масштабируется. Проверните своих рабочих с 10 до 12 экземпляров. Что делают ваши 11-й и 12-й экземпляр? Проверь очередь и ничего не увидишь. Если вы выберете сервисный маршрут, они вызовут service.AreYouRunning(), см. true, и жизнь прекрасна. - person David Makogon; 10.05.2011
comment
Примечание. Та же проблема возникает при перезагрузке экземпляров рабочей роли. Их не будет ожидать сообщение в очереди. - person David Makogon; 10.05.2011