Базовая оркестровка с помощью служебной шины Azure?

Я хотел бы понять, какая часть следующего сценария поддерживается служебной шиной Azure:

Рабочий сервер уведомляет неизвестное количество веб-серверов о событии. Каждый веб-сервер обрабатывает сообщение (обработка занимает некоторое время - 10-30 минут). Когда каждый веб-сервер завершает обработку первого сообщения, все веб-серверы должны получить новое сообщение. мероприятие. В основном я пытаюсь синхронизировать несколько веб-ролей после выполнения длительной работы с каждой веб-ролью.

Какую часть этого я могу получить «бесплатно» через служебную шину Azure?


person Igorek    schedule 08.03.2013    source источник
comment
Темы звучат так, как будто они соответствуют всем требованиям, было ли что-то в темах, которые, по вашему мнению, не подходили бы здесь?   -  person Peter Ritchie    schedule 08.03.2013
comment
Я не специалист в ServiceBus, но пытаюсь понять, насколько это может помочь. Темы звучат как место для начала. Но может ли это помочь с синхронизацией или мне нужно задействовать мою рабочую роль?   -  person Igorek    schedule 08.03.2013
comment
Темы позволяют реализовать pub / sub, поэтому один процесс может уведомлять множество других процессов (ноль или более). Они могут, в свою очередь, уведомить все другие процессы о том, что они обработали событие (хотя это становится немного болтливым, поскольку вы, вероятно, уведомляете один процесс). Здесь может пригодиться ответ. Когда 1 процесс завершает обработку события, он может отправить сообщение (отправить в очередь, не относящуюся к теме) процессу, который опубликовал событие.   -  person Peter Ritchie    schedule 08.03.2013


Ответы (4)


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

В то время как служебная шина будет предлагать функции публикации / подписки и корреляции, которые могут вам здесь помочь, для меня вы описываете шаблон, в котором серверы будут регистрировать свой интерес, а также признавать, что они обработали свое сообщение, чтобы что-то затем подсчитало подтверждение, и как только все ack'd 2-е сообщение будет отправлено.

С этой оркестровкой служебная шина не может вам помочь. Это дает вам возможность создать что-то в рабочей роли или, возможно, использовать BizTalk, если он доступен в роли виртуальной машины.

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

person Mike Stephenson    schedule 24.03.2013

В служебной шине Azure есть множество разнообразных функций обмена сообщениями, которые помогают как с аспектами публикации / подписки, так и с корреляцией запросов и ответов. Здесь может быть очень полезна концепция сеансов (сгруппированных / связанных) сообщений вместе с состоянием сеанса. Ниже приведены некоторые конкретные ссылки, которые могут помочь: Статья MSDN о сеансах: http://msdn.microsoft.com/en-us/magazine/jj863132.aspx

Пример использования сеансов: http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Session-41c43fb4

Пример запроса / ответа: http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Request-0ce8fcaf

Обсуждение корреляции и т. Д .: http://channel9.msdn.com/Blogs/Subscribe/Service-Bus-Messaging-Deep-Dive

person Abhishek Lal    schedule 08.03.2013

Вы также можете взглянуть на недавно выпущенную предварительную версию среды задач Durable Task Framework, которая была выпущена здесь. Примеры использования этой платформы см. здесь.

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

            ...
            // phase 1
            List<Task> taskList = new List<Task>();
            foreach (var serverName in serverList)
            {
                taskList.Add(context.ScheduleTask<object>(typeof(ExecutePhase1OnWebServerActivity), serverName));
            }

            // wait for all of the executions to finish
            await Task.WhenAll(taskList);

            // phase 2
            taskList = new List<Task>();
            foreach (var serverName in serverList)
            {
                taskList.Add(context.ScheduleTask<object>(typeof(ExecutePhase2OnWebServerActivity), serverName));
            }

            await Task.WhenAll(taskList);
            ...
person Affan Dar    schedule 02.07.2013

Мне это кажется комбинацией Workflow Foundation и Service Bus.

person Sentinel    schedule 03.02.2014