Подтвердить что ты не робот

Путаница в шаблонах диспетчера сообщений/команд

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

Многие из этих шаблонов описаны в Интернете. Некоторые из них, которые я недавно читал, были:

Если использование такого инструмента, как шина NService, позволяет сделать много, не задумываясь о проблемах с инфраструктурой, некоторые вопросы возникли, когда я попытался реализовать базовый Message Bus и обработчик команд. Фактически, когда дело доходит до этих шаблонов, я не вижу много различий между ними.

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

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

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

Таким образом, в обоих случаях есть сходства.

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

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

Прошу прощения за длинный и запутанный вопрос, но не стесняйтесь спрашивать подробности.

4b9b3361

Ответ 1

Woah, будет сложно дать ответ более тщательный или более достоверный, чем MSDN, с которым вы связались, поэтому давайте переходим к более кратким.

Шина сообщений связана с сообщением. Он даже не требует, чтобы сообщение было доставлено, это команда или нет. Ему также все равно, что такое полезная нагрузка. Это "тип агностик". Основная проблема шины сообщений - просто отслеживать, кто должен получать каждую часть сообщения (pub/sub). Преимущество этой модели заключается в том, что она будет поддерживать будущую экспансию, в которой у вас пока нет спецификаций. Вы можете добавить новый тип сообщения по дороге, и эта модель будет рада предоставить его. Шифр сообщения, скорее всего, будет распространен вне вашего приложения и, возможно, даже вне вашего компьютера (скажем, распределяется между кластером из 10 серверов).

Модель обработчика команд связана с разделением действий с выполнением команды. Традиционно (по крайней мере, на языках, которые я использую) команды были очень тесно связаны с элементами управления пользовательского интерфейса и их событиями и потоком пользовательского интерфейса. С помощью этой старой модели было также сложно настроить или расширить диапазон доступных команд в вашем приложении (скажем, с помощью DLL расширения). Модель обработчика команд отделяет эти проблемы с пользовательским интерфейсом и выполнением команд. Теперь у вас есть гибкость, чтобы легко добавлять дополнительные обработчики команд и выполнять команды без события пользовательского интерфейса (Unit test -able). Это делает более чистым, более модульным и проверяемым кодом. Обработчик команд, скорее всего, будет частью вашего приложения. Любые расширения вашей коллекции команд, вероятно, предназначены для вашего приложения, а не для нескольких приложений.

Брокер Message/Command занимается подключением несовместимых или раздельно разработанных независимых систем. Это прецедент, когда вы хотите, чтобы одно приложение взаимодействовало с другим и не имело исходного кода для одного или обоих приложений. Таким образом, вы создаете брокера, который получает информацию с одной стороны и предоставляет эту информацию с другой стороны, принимая во внимание любые преобразования, необходимые для взаимодействия этих двух приложений. Пример в MSDN - это веб-сайт электронной коммерции, которому, возможно, потребуется поговорить с платежным процессором, судоходной компанией и системой учета. Возможно, у вас нет возможности изменить исходный код для любого из этих приложений (включая систему электронной торговли). Возможно, для системы электронной торговли требуется интерфейс IExamplePaymentGateway, и вашему поставщику платежей требуется интерфейс IDifferentPaymentAPI. Может быть, один API реализован в XML, а другой в JSON? Независимо от различий, ваш брокер несет ответственность за возможное подключение.

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

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

Ответ 2

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

Командная шина обычно отправляет команды точно одному обработчику, подобно маршрутизатору, разрешающему маршруты для контроллеров.