#azure #azure-queues
#azure #azure-очереди
Вопрос:
У меня есть начинающий работник. Это выполняет некоторые инициализации. Я хочу, чтобы другие работники подождали этого начального работника. На мой взгляд, единственный способ — помещать сообщения в очередь. Рабочие будут опрашивать очередь. Они начнутся после прочтения сообщений. Есть ли лучший способ синхронизации?
Ответ №1:
Проблема с опросом очереди: как только один работник видит сообщение очереди «Я готов», что происходит с другими работниками? Если программа чтения удаляет сообщение из очереди (как и должно быть), другие пользователи никогда его не увидят. Если программа чтения не удалит его, то это сообщение останется у вас на все оставшееся время (и при следующей загрузке оно все еще будет там).
Что, если бы вы разместили очень простую службу wcf в загружаемом экземпляре рабочей роли с помощью метода AreYouRunning(), возвращающего true / false? Если экземпляр все еще находится в OnStart (), вы не сможете подключиться к службе. После подключения вы просто проверяете возвращаемое значение. Вам просто нужно, чтобы другие ваши роли настроили некоторый тип механизма опроса в своих OnStart () или Run () для выполнения периодического опроса.
Вероятно, есть другие способы сделать это, например, создать строку в таблице Azure. Вам все равно придется убедиться, что вы можете удалить статус «запущено» из этой таблицы до запуска других ролей, чтобы идея службы wcf могла лучше соответствовать вашим потребностям.
Комментарии:
1. Допустим, у нас будет 10 работников. Начинающий работник поместит в очередь 10 начальных сообщений. Каждый рабочий прочитает одно сообщение и начнет свою работу.
2. Это не масштабируется. Увеличьте количество рабочих экземпляров с 10 до 12. Что делают ваши 11-й и 12-й экземпляры? Проверьте очередь и ничего не увидите. Если вы выберете маршрут обслуживания, они вызовут службу. Вы запускаете (), видите «true», и жизнь прекрасна.
3. Примечание: при перезагрузке экземпляров рабочей роли возникает та же проблема. Их не будет ждать сообщение в очереди.