Есть ли способ получить событие сообщения о завершении процесса в очереди Azure или служебной шине?

У меня очень простая архитектура:

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

Проблема в том, что веб-API не знает, когда сообщение было обработано исполнителем.

Может ли Worker предупредить очередь о том, что сообщение было успешно обработано, и очередь отправляет обратно в веб-API событие «Process Complete Message»?

Одно решение, о котором я думал:

После того, как веб-API поставил сообщение в очередь, он каждые пару секунд проверяет статус сообщения:

Если статус сообщения "Peck-Lock", сообщение еще обрабатывается.

Если сообщение не найдено в Очереди - сообщение обработано (успешно или неуспешно, не имеет значения).

Но нет готового решения от Microsoft?


person Ron    schedule 20.10.2015    source источник


Ответы (1)


Многие архитектуры, которым требуется этот тип отчетов, обрабатываются отдельной очередью, идущей от процессора к запрашивающей стороне. Вот почему на самом деле существует даже свойство ReplyTo в объекте BrokeredMessage. Подход будет заключаться в том, что у запрашивающей стороны будут свои собственные очереди, которые он также просматривает. Когда он создает сообщение, он устанавливает свойство ReplyTo и отправляет его. Когда рабочий процесс обрабатывает сообщение, он отправляет сообщение о завершении обратно запрашивающей стороне, используя путь очереди, предоставленный исходным сообщением.

В зависимости от ваших потребностей у вас может быть одна очередь для всего внешнего интерфейса, или у каждого экземпляра может быть своя очередь. Обратите внимание, что в распределенной системе с машинами, которые могут быть временными, наличие у каждого внешнего интерфейса веб-API собственных очередей может привести к некоторой сложности.

Обычно это делается, когда запрашивающему нужно знать, что что-то завершено, чтобы он мог каким-то образом сообщить об этом. Например, на обработку приходит веб-запрос. Запрос помещается в очередь и обрабатывается на серверной части, а сообщение о завершении возвращается обратно на переднюю часть, где оно принимается, и пользователю отправляется уведомление (в некоторых случаях через SignalR, что при установленной объединительной плате вам не придется беспокоиться о том, какой интерфейсный сервер получил ответное сообщение).

Кроме сообщения о завершении либо через прямую связь с запрашивающей стороной, либо через очередь, нет ничего, что позволяло бы вам наблюдать за завершением сообщения с другой машины. Проверка статуса сообщения не поможет вам, потому что эта информация не изменится, если вы не будете регулярно получать новую ссылку на сообщение, что не будет хорошо масштабироваться, если вы имеете дело с большим количеством сообщений.

person MikeWo    schedule 20.10.2015
comment
Спасибо, Майк. Итак, если я правильно вас понимаю, у меня будет одна основная очередь между Web-API и всеми экземплярами Worker, и для каждого задания (сообщения) в основной очереди у меня будет другая подочередь только для связи между Web-API и конкретный рабочий, который обрабатывает задание? - person Ron; 22.10.2015
comment
Одна очередь для обработки пути Web-API к Worker. Затем либо одна очередь, за которой наблюдают все серверы Web-API, либо очередь для каждого сервера Web-API, если конкретному исходному серверу Wep-API запроса необходимо знать, что процесс завершен. Это зависит от того, что серверы Web-API делают с ответом. - person MikeWo; 22.10.2015
comment
Итак, для простейшего сценария мне нужны две очереди: 1 - Чтобы веб-API отправил в нее задание. 2 — для веб-API, чтобы следить за завершением задания. Я правильно понял? если у вас есть внешние ссылки на статьи об этом, я буду благодарен :) Спасибо, Майк. - person Ron; 22.10.2015
comment
Да, в простейшем случае у вас будет две очереди. Шаблон называется шаблоном обмена сообщениями «запрос/ответ». Для конкретного примера Azure вы можете посмотреть cloudcasts.net/devguide/Default.aspx. ?id=13050 . Более общую информацию можно найти в ресурсах Enterprise Integration Patterns — enterpriseintegrationpatterns.com. /шаблоны/обмен сообщениями/ . - person MikeWo; 26.10.2015
comment
Не могли бы вы подробнее рассказать об этой задней панели, пожалуйста? Если пользовательский браузер установил веб-сокет для определенного сервера во внешнем кластере, очередь ответов должна прослушиваться этим сервером, а не другим, верно? - person UserControl; 20.06.2017
comment
@UserControl Объединительная плата используется для масштабирования SignalR, чтобы сообщения отправлялись на все интерфейсные серверы, а затем тот, который имеет фактическое соединение с браузером, может отправить ответ. См. docs.microsoft. .com/en-us/aspnet/signalr/overview/performance/ или docs.microsoft.com/en-us/aspnet/signalr/overview/performance/ для различных вариантов использования объединительной платы с SignalR. - person MikeWo; 20.06.2017