Ответ 1
Woah, будет сложно дать ответ более тщательный или более достоверный, чем MSDN, с которым вы связались, поэтому давайте переходим к более кратким.
Шина сообщений связана с сообщением. Он даже не требует, чтобы сообщение было доставлено, это команда или нет. Ему также все равно, что такое полезная нагрузка. Это "тип агностик". Основная проблема шины сообщений - просто отслеживать, кто должен получать каждую часть сообщения (pub/sub). Преимущество этой модели заключается в том, что она будет поддерживать будущую экспансию, в которой у вас пока нет спецификаций. Вы можете добавить новый тип сообщения по дороге, и эта модель будет рада предоставить его. Шифр сообщения, скорее всего, будет распространен вне вашего приложения и, возможно, даже вне вашего компьютера (скажем, распределяется между кластером из 10 серверов).
Модель обработчика команд связана с разделением действий с выполнением команды. Традиционно (по крайней мере, на языках, которые я использую) команды были очень тесно связаны с элементами управления пользовательского интерфейса и их событиями и потоком пользовательского интерфейса. С помощью этой старой модели было также сложно настроить или расширить диапазон доступных команд в вашем приложении (скажем, с помощью DLL расширения). Модель обработчика команд отделяет эти проблемы с пользовательским интерфейсом и выполнением команд. Теперь у вас есть гибкость, чтобы легко добавлять дополнительные обработчики команд и выполнять команды без события пользовательского интерфейса (Unit test -able). Это делает более чистым, более модульным и проверяемым кодом. Обработчик команд, скорее всего, будет частью вашего приложения. Любые расширения вашей коллекции команд, вероятно, предназначены для вашего приложения, а не для нескольких приложений.
Брокер Message/Command занимается подключением несовместимых или раздельно разработанных независимых систем. Это прецедент, когда вы хотите, чтобы одно приложение взаимодействовало с другим и не имело исходного кода для одного или обоих приложений. Таким образом, вы создаете брокера, который получает информацию с одной стороны и предоставляет эту информацию с другой стороны, принимая во внимание любые преобразования, необходимые для взаимодействия этих двух приложений. Пример в MSDN - это веб-сайт электронной коммерции, которому, возможно, потребуется поговорить с платежным процессором, судоходной компанией и системой учета. Возможно, у вас нет возможности изменить исходный код для любого из этих приложений (включая систему электронной торговли). Возможно, для системы электронной торговли требуется интерфейс IExamplePaymentGateway, и вашему поставщику платежей требуется интерфейс IDifferentPaymentAPI. Может быть, один API реализован в XML, а другой в JSON? Независимо от различий, ваш брокер несет ответственность за возможное подключение.
Как вы можете видеть, все они связаны с тем, чтобы общаться так или иначе. Линии между ними могут быть размытыми, и вы можете даже использовать комбинацию нескольких из этих шаблонов для достижения вашего конкретного варианта использования.
Хотя я никогда не пользовался NServiceBus, большинство этих типов библиотек просто пытаются объединить абстрактные/академические модели в более конкретные конкретные языковые реализации. Иногда это экономит ваше время, иногда вы застряли в плохой реализации от неизвестного источника с открытым исходным кодом. Вам нужно будет оценить свой собственный вариант использования и пригодность инструментов, доступных на вашем предпочтительном языке разработки.