Немедленные и запланированные бизнес-транзакции - MSMQ/NServiceBus/MS Sql Service Broker/ Планировщик задач Windows?

У меня есть этот сценарий, ребята

Типичное крупномасштабное приложение CMS, в котором отображаются следующие бизнес-транзакции:

  • Пользователи публикуют контент немедленно.
  • Пользователи планируют публикацию контента.
  • Автоматический процесс запускается, скажем, с интервалом в 10 минут, собирает запланированный и готовый (просто состояние BO) контент и отправляет его на публикацию.

Это упрощенное описание реальной системы. Говоря о публикации, я имею в виду сложный процесс, состоящий из 4 основных подсистем: создание аргументов вызова, генерация HTML-контента путем запуска другого веб-приложения (asp.net), фиксация транзакционных сторон и оповещение пользователей о результатах публикации. Таким образом, система теряет способность запускать весь процесс в одной мега-транзакции, т.е. это возможно, но не практично с точки зрения масштабируемости / производительности.

Существует несколько вариантов взаимодействия подсистем, например, использование MSMQ, SQL Service Broker, NServiceBus и цепочка простых односторонних вызовов WCF (которые в настоящее время реализованы). Итак, ребята, я ищу, возможно, более надежное и масштабируемое решение для этой обработки, потому что похоже, что система будет становиться все более занятой растущим числом пользователей и, следовательно, большим количеством контента, который будет генерироваться. Особенно, когда-то клиенты запрашивают поддержку мобильных версий.

Одно из моих соображений состоит в том, чтобы ставить в очередь все немедленные запросы пользователей, используя MSMQ, где выделенная служба WCF будет отправлять их рядом с модулем генерации контента (веб-приложение). И так будет делать запланированное задание Windows. Я не могу понять, как эти платформы обмена сообщениями могут быть полезны, но не размещать их до генерации HTML. Это действительно смущает меня.

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

3 ответа

Вам определенно потребуется некоторая обработка бизнес-процессов.

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

Я сделал что-то подобное:

электронная почта -> механизм содержимого -> преобразование документов -> механизм рабочих процессов -> индексирование -> механизм рабочих процессов

Никакого планирования не было. Чтобы что-то сделать, вы отправляете команду, и когда обработка команды завершается, конечная точка публикует и событие, и какая бы конечная точка не была подписана на это событие, получит копию и узнает, как продолжить. У меня была простая структура таблиц, отслеживающая данные для процесса вместе с соответствующим статусом.

Для некоторых частей вашей системы вам может потребоваться более немедленная обработка. Когда вы сталкиваетесь с этим, вы можете установить службу конечной точки более одного раза, и одна из них будет действовать как "приоритетная" конечная точка. В качестве примера. В нашей конечной точке конвертера документов нам нужно будет конвертировать каждое тело письма. Так как мы получали тысячи в день, они бы выстроились в очередь совсем немного. Это было сделано на заднем плане без особой заботы о том, когда это произошло. С другой стороны, пользователям индексирующего веб-приложения потребуется конвертировать определенные документы с веб-сайта. Отправка в одну и ту же конечную точку конвертации привела к тому, что конверсии ad-hoc ожидают тысячи других запросов конвертации. Таким образом, ответ не был включен. Решение состояло в том, чтобы просто установить другой экземпляр преобразователя (те же двоичные файлы) и настроить отдельные очереди для конечной точки, а затем направить все сообщения с запросами на преобразование от веб-серверов к специальной конечной точке. Задача решена:)

В качестве примечания: даже если вы используете интерфейс веб-службы или WCF, было бы неплохо разместить его за конечной точкой служебной шины, поскольку конечная точка покупает вас совсем немного (повторные попытки / отравленные очереди / и т. Д.)

Поскольку вы, похоже, находитесь на стадии оценки, вы можете взглянуть на мою служебную шину FOSS: http://shuttle.codeplex.com/

Это то, что мы использовали в описанной системе. Существует отдельный компонент планировщика, если это необходимо (хотя мы не использовали его в проекте).

Если все игроки являются экземплярами SQL Server (или поддерживаются ими), то Service Broker имеет большое преимущество. Как интегрировано в SQL Engine, это означает, что все те случаи, когда вам приходится участвовать в локальной распределенной транзакции между базой данных и хранилищем сообщений (т. Е. Каждый раз, когда вы помещаете в очередь или удаляете сообщение из очереди), становятся обычной простой транзакцией, поскольку база данных это хранилище сообщений. Это также дает преимущества, когда вы рассматриваете резервное копирование / восстановление, поскольку у вас может быть согласованная резервная копия как для данных, так и для сообщений (резервная копия базы данных содержит резервную копию всех сообщений), вам нужно только одно решение для обеспечения высокой доступности / восстановления после сбоев: решение для базы данных (кластеризация, зеркалирование) также является историей HA/DR для обмена сообщениями, поскольку база данных является хранилищем сообщений. А встроенная активация исключает необходимость настройки (и, что более важно, мониторинга и отработки отказа в случаях аварийного переключения HA/DR) внешних механизмов активации. Не говоря уже о том, что встроенная активация не имеет задержки, хотя она также может адаптироваться к пикам, что может вызывать проблемы при внешней запланированной активации (внешние задачи должны объединяться в пул и должны балансировать частоту объединения с желаемой задержкой и учитывать пики)

Вы можете использовать возможности саги в NServiceBus для моделирования процесса публикации, включая планирование, так как он имеет возможность надежно выполнять действия после определенной задержки практически без издержек.

Если вы достаточно счастливы ставить в очередь немедленные запросы пользователей, то вы можете легко использовать NServiceBus в качестве своего API вместо того, чтобы объединять что-то вместе с MSMQ, WCF и запланированными задачами Windows.

Другие вопросы по тегам