Я надеюсь, что ниже объясняется моя проблема.
У меня есть рабочая роль, которая работает в цикле while (true). Этот рабочий берет сообщения из очереди и обрабатывает их. Он никогда не заканчивается, просто продолжает проверять очередь и обрабатывать сообщения.
Это работает до тех пор, пока я не получу сообщение, которое требует, чтобы я сделал что-то, что требует времени. Примером может быть запрос информации от службы. Предположим, что этот запрос занимает 10 секунд. Теперь моя рабочая роль находится в середине цикла while, ожидая этого ответа. Тем временем очередь сообщений заполняется.
Я хочу найти решение, которое либо остановит, либо смягчит последствия этого.
Мое текущее решение в реальном мире заключается в том, что у меня есть рабочая роль, которая использует параллельную библиотеку задач для создания нескольких процессоров сообщений, которые работают параллельно и берут из очереди. Но все же эта проблема может возникнуть, если все потоки, выполняющие мои процессоры сообщений, застревают в ожидании службы.
Я знаю, что должен использовать асинхронные запросы для сервисов, но есть и другие примеры, когда асинхронность не поможет. Я бы предпочел не вдаваться в подробности.
Итак, мой план прямо сейчас состоит в том, чтобы изменить мою текущую архитектуру и создать службу обработки сообщений. Поэтому я буду использовать очередь сообщений в текущем решении и использовать рабочую роль только для делегирования работы моему веб-сервису (асинхронно).
У этой рабочей роли теперь не будет ситуации, когда потоки застревают в ожидании чего-то.
Но я не доволен этим. Что делать, если моя рабочая роль, которая использует параллельную библиотеку задач для создания нескольких обработчиков очередей, недостаточно быстра. Я не думаю, что ЦП будет даже нагружаться, потому что замедление будет происходить при получении сообщения и отправке его в веб-службу, что не требует интенсивного использования ЦП.
Поэтому мне нужно БОЛЬШЕ обработчиков очередей, которые должны быть созданы путем порождения экземпляров моего обработчика очередей в зависимости от того, насколько занята моя очередь. Поэтому, когда в очереди много элементов, Azure создаст новый экземпляр, чтобы помочь мне их обработать.
Я не уверен в этом решении. Я чувствую, что это должно быть проще. Почему я сейчас создаю веб-службу для использования сообщений, которые отправляются из рабочей роли, которая, в свою очередь, масштабируется на основе моей очереди сообщений.
Имеет ли смысл мое решение или есть альтернативы?