понедельник, 20 октября 2025 г.

25.10.21, Perplexity, MassTransit, Project

25.10.21, Perplexity, MassTransit, Project

F:\Projects\VS\GS.Rabbit\GS.Rabbit.sln

F:\Projects\VS\GS.Rabbit\CommonData01\CommonData01.csproj

F:\Projects\VS\GS.Rabbit\AppA01\AppA01.csproj

F:\Projects\VS\GS.Rabbit\AppB01\AppB01.csproj

от пример кода на C# для двух консольных приложений A и B, которые взаимодействуют через MassTransit, используя RabbitMQ. Приложение А сначала отправляет текстовое сообщение Приложению B, выводит отправленный текст в консоль. Приложение B принимает сообщение, выводит его в консоль. Затем роли меняются: Приложение B отправляет сообщение Приложению A, и оба также печатают текст в консоль.


Общие компоненты (поддержка сообщений)

csharp
public class TextMessage { public string Text { get; set; } }

Приложение A (отправляет, потом принимает)

csharp
using MassTransit; using System; using System.Threading.Tasks; class ProgramA { static async Task Main(string[] args) { var busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.Host("localhost", "/", h => { h.Username("guest"); h.Password("guest"); }); cfg.ReceiveEndpoint("queue_a", e => { e.Handler<TextMessage>(context => { Console.WriteLine($"Приложение A приняло сообщение: {context.Message.Text}"); return Task.CompletedTask; }); }); }); await busControl.StartAsync(); // Отправка сообщения B var sendEndpoint = await busControl.GetSendEndpoint(new Uri("queue:queue_b")); string messageAtoB = "Привет от Приложения A"; await sendEndpoint.Send(new TextMessage { Text = messageAtoB }); Console.WriteLine($"Приложение A отправило сообщение: {messageAtoB}"); Console.WriteLine("Нажмите любую клавишу после того, как Приложение B примет сообщение..."); Console.ReadKey(); // Теперь Приложение A принимает сообщение из B (уже настроено выше) Console.WriteLine("Нажмите любую клавишу для выхода..."); Console.ReadKey(); await busControl.StopAsync(); } }

Приложение B (принимает, потом отправляет)

csharp
using MassTransit; using System; using System.Threading.Tasks; class ProgramB { static async Task Main(string[] args) { var busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.Host("localhost", "/", h => { h.Username("guest"); h.Password("guest"); }); cfg.ReceiveEndpoint("queue_b", e => { e.Handler<TextMessage>(async context => { Console.WriteLine($"Приложение B приняло сообщение: {context.Message.Text}"); // После приема отправить сообщение обратно в A var sendEndpoint = await context.GetSendEndpoint(new Uri("queue:queue_a")); string messageBtoA = "Привет от Приложения B"; await sendEndpoint.Send(new TextMessage { Text = messageBtoA }); Console.WriteLine($"Приложение B отправило сообщение: {messageBtoA}"); }); }); }); await busControl.StartAsync(); Console.WriteLine("Ждем сообщений..."); Console.ReadKey(); await busControl.StopAsync(); } }

Объяснение

  • Используется RabbitMQ как брокер сообщений (по умолчанию localhost, "guest"/"guest").

  • Приложение А отправляет в очередь "queue_b" сообщение, Приложение B его принимает.

  • B при приеме сообщения отправляет ответ в очередь "queue_a", которую слушает A.

  • Консольный вывод отображает отправленные и принятые тексты.

  • Для запуска нужно сначала поднять RabbitMQ, затем запустить оба приложения.

Этот пример прост и демонстрирует двунаправленное сообщение с использованием MassTransit и RabbitMQ. Можно расширять логику, добавлять обработку ошибок, разделение на проекты и т.д.

Для настройки RabbitMQ через веб-интерфейс (RabbitMQ Management Plugin) нужно сделать следующие шаги:

  1. Включить веб-интерфейс, если он еще не активирован. Для этого в командной строке выполните:

  • В Linux: rabbitmq-plugins enable rabbitmq_management

  • В Windows: rabbitmq-plugins.bat enable rabbitmq_management
    После этого перезапустите сервис RabbitMQ:

  • В Linux: sudo systemctl restart rabbitmq-server

  • В Windows: перезапустите службу RabbitMQ через "Службы" или командой.

  1. Откройте в браузере адрес для админки RabbitMQ:
    http://localhost:15672

  2. Авторизуйтесь с помощью учетных данных. По умолчанию:

    • Логин: guest

    • Пароль: guest
      Примечание: Для доступа с других хостов, кроме localhost, создайте отдельного пользователя с нужными правами.

  3. В веб-интерфейсе создайте очередь:

    • Перейдите во вкладку «Queues» (Очереди)

    • Нажмите кнопку «Add a new queue» (Добавить очередь)

    • Введите имя очереди и при необходимости укажите дополнительные параметры (время хранения, максимальный размер и т.д.)

    • Сохраните созданную очередь

  4. Также в интерфейсе можно создавать пользователей, управлять их правами доступа, мониторить состояние брокера, обмены сообщений (exchanges), привязки (bindings) и многое другое.

Таким образом, через браузер можно удобно создавать и настраивать очереди и пользователей RabbitMQ без необходимости командной строки. Это основной способ администрирования RabbitMQ для большинства пользователей.

Если нужно, могу помочь с более подробной инструкцией по конкретным операциям в веб-интерфейсе.

Для настройки RabbitMQ через веб-интерфейс (RabbitMQ Management Plugin) нужно сделать следующие шаги:

  1. Включить веб-интерфейс, если он еще не активирован. Для этого в командной строке выполните:

  • В Linux: rabbitmq-plugins enable rabbitmq_management

  • В Windows: rabbitmq-plugins.bat enable rabbitmq_management
    После этого перезапустите сервис RabbitMQ:

  • В Linux: sudo systemctl restart rabbitmq-server

  • В Windows: перезапустите службу RabbitMQ через "Службы" или командой.

  1. Откройте в браузере адрес для админки RabbitMQ:
    http://localhost:15672

  2. Авторизуйтесь с помощью учетных данных. По умолчанию:

    • Логин: guest

    • Пароль: guest
      Примечание: Для доступа с других хостов, кроме localhost, создайте отдельного пользователя с нужными правами.

  3. В веб-интерфейсе создайте очередь:

    • Перейдите во вкладку «Queues» (Очереди)

    • Нажмите кнопку «Add a new queue» (Добавить очередь)

    • Введите имя очереди и при необходимости укажите дополнительные параметры (время хранения, максимальный размер и т.д.)

    • Сохраните созданную очередь

  4. Также в интерфейсе можно создавать пользователей, управлять их правами доступа, мониторить состояние брокера, обмены сообщений (exchanges), привязки (bindings) и многое другое.

Таким образом, через браузер можно удобно создавать и настраивать очереди и пользователей RabbitMQ без необходимости командной строки. Это основной способ администрирования RabbitMQ для большинства пользователей.

Если нужно, могу помочь с более подробной инструкцией по конкретным операциям в веб-интерфейсе.itvgroup+3

  1. https://docs.itvgroup.ru/confluence/spaces/rpt34/pages/140872642/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F+RabbitMQ
  2. https://docs.aamsystems.ru/passoffice/passoffice-guide/admin-guide-doc/rabbitmq
  3. https://ru.stackoverflow.com/questions/551840/%D0%9A%D0%B0%D0%BA-%D0%B7%D0%B0%D0%B9%D1%82%D0%B8-%D0%BD%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83-rabbitmq
  4. https://reg.cloud/blog/ustanovka-nastrojka-i-ispolzovanie-rabbitmq/
  5. https://timeweb.cloud/tutorials/microservices/ustanovka-i-nastroika-rabbitmq
  6. https://thewebland.net/development/devops/chast-3-interfejs-upravleniya-rabbitmq/
  7. https://arenda-server.cloud/blog/kak-ustanovit-i-upravljat-rabbitmq/
  8. https://tech-research.ru/rabbitmq-php/
  9. https://efsol.ru/manuals/rabbitmq-windows-local/
  10. https://www.altlinux.org/EnterpriseApps/RabbitMQ

Чтобы проверить, запущен ли процесс в Docker, используйте команду:

bash
docker ps

Эта команда выводит список всех запущенных контейнеров. В выводе будет информация: ID контейнера, имя образа, команда запуска, время создания, статус, порты и имя контейнера. Столбец STATUS показывает состояние, например, "Up 10 minutes" означает, что контейнер работает уже 10 минут.

Если вы хотите увидеть все контейнеры, включая остановленные, используйте:

bash
docker ps -a

Статусы контейнеров могут быть:

  • Up (контейнер работает)

  • Exited (завершен)

  • Created (создан, но не запущен)

  • Restarting (перезапускается), и другие.

Для детальной информации по конкретному контейнеру можно использовать:

bash
docker logs <container_id>

Это поможет понять, что происходит внутри контейнера.

Таким образом, команда docker ps — самый быстрый и простой способ проверить, запущен ли процесс в Docker и получить базовую информацию по контейнерам.

Вывод команды docker ps в вашем случае означает следующее:

  • Контейнер с ID e0f711a8bed4 запущен 4 дня назад и работает непрерывно (статус "Up 4 days").

  • Контейнер создан из образа rabbitmq:management — это RabbitMQ с включенной панелью управления.

  • Запущенная команда внутри контейнера — это docker-entrypoint.s… (сокращенный вывод команды, запуск стандартного процесса RabbitMQ).

  • Порты контейнера проброшены на локальную машину:

    • 5672 порт (RabbitMQ основной порт) доступен локально по адресу 0.0.0.0:5672 и [::]:5672 (IPv4 и IPv6)

    • 15672 порт (веб-интерфейс управления RabbitMQ) доступен на 0.0.0.0:15672 и [::]:15672

  • Имя контейнера — rabbitmq-container.

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

Таким образом, процесс запущен и работает стабильно уже несколько дней, и вы можете подключаться как к самому RabbitMQ (порт 5672), так и к панели управления через браузер (порт 15672).purpleschool+1

  1. https://purpleschool.ru/knowledge-base/article/docker-ps
  2. https://serverspace.ru/support/help/spisok-kontejnerov-docker/
  3. https://ru.hexlet.io/courses/docker-basics/lessons/container-management/theory_unit
  4. https://timeweb.cloud/tutorials/docker/komandy-docker-spisok
  5. https://dockerhosting.ru/blog/komandy-docker-shpargalka/
  6. https://serverspace.ru/support/help/osnovnye-komandy-docker/
  7. https://devopsgu.ru/guides/docker-cheatsheet/
  8. https://www.linuxshop.ru/articles/a26710824-osnovnye_komandy_dlya_docker
  9. https://habr.com/ru/companies/ruvds/articles/440660/
  10. https://www.8host.com/blog/zapusk-komand-v-kontejnere-docker/

Да, ваше приложение может работать с этим контейнером RabbitMQ, запущенным в Docker. Поскольку контейнер слушает стандартные порты RabbitMQ (5672 для AMQP протокола и 15672 для веб-административного интерфейса), ваше приложение может подключаться к RabbitMQ по адресу localhost:5672 (если приложение запущено на том же компьютере, что и Docker).

Основные моменты для успешной интеграции:

  • Убедитесь, что приложение использует правильные параметры подключения: хост localhost, порт 5672, имя пользователя и пароль (по умолчанию: guest/guest).

  • В конфигурации MassTransit или любого клиента RabbitMQ задайте эти параметры.

  • Контейнер с RabbitMQ, запущенный в Docker, обеспечивает полноценный брокер сообщений с поддержкой всех функций.

  • Для разработки и тестирования такого варианта вполне достаточно, но в продакшене желательно настроить безопасность и права доступа.

Таким образом, ваша текущая настройка RabbitMQ в Docker полностью совместима с приложением, и можно начинать работу и тестирование обмена сообщениями через этот брокер.purpleschool+2

  1. https://purpleschool.ru/knowledge-base/article/rabbitmq
  2. https://habr.com/ru/companies/otus/articles/794216/
  3. https://docs.testit.software/installation-guide/set-up-external-connections/external-connection-rabbitmq.html
  4. https://help.mzta.ru/ss/rabota_s_docker_i_rabbitmq_1_print.html
  5. https://www.reddit.com/r/csharp/comments/b1719z/how_could_connect_my_application_to_rabbitmq_in/
  6. https://habr.com/ru/articles/703352/
  7. https://voblachke.ru/blog/kak-zapuskat-rabbitmq-v-docker-na-windows-10/
  8. https://thewebland.net/development/devops/rabbitmq/nastrojka-klastera-rabbitmq-na-docker/
  9. https://learn.microsoft.com/ru-ru/dotnet/aspire/messaging/rabbitmq-integration

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

Таким образом, вы создали корректный брокер сообщений RabbitMQ, и ваши приложения смогут отправлять и принимать текстовые сообщения через этот брокер без дополнительных изменений. Единственное, что нужно убедиться — приложение и контейнер запускаются в одной сети (например, на одном хосте), или правильно настроены порты и адреса для коммуникации между ними.

Итог: вы не забыли, это именно тот RabbitMQ, с которым написанные приложения работают, что подтверждается типичной настройкой и адресом подключения в коде.purpleschool+2

  1. https://purpleschool.ru/knowledge-base/article/rabbitmq
  2. https://habr.com/ru/articles/758938/
  3. https://masstransit.io/quick-starts/rabbitmq
  4. https://habr.com/ru/companies/chibbis/articles/871588/
  5. https://github.com/MassTransit/docker-rabbitmq
  6. https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/rabbitmq-event-bus-development-test-environment
  7. https://temofeev.ru/info/articles/masstransit-i-ochered-v-baze-dannykh/
  8. https://stackoverflow.com/questions/79124877/rabbitmq-masstransit-connection-refused-while-running-docker
  9. https://dev.to/gaurav-nandankar/getting-started-with-rabbitmq-pubsub-using-masstransit-in-net-52m5
  10. Ваш код для приложений A и B с использованием MassTransit и RabbitMQ выглядит корректно и соответствует основным паттернам взаимодействия через очереди сообщений в RabbitMQ через MassTransit.

    • В коде оба приложения создают шину сообщений (IBusControl), настраивают подключение к RabbitMQ на localhost с логином guest/guest.

    • Приложение A отправляет сообщение в очередь queue_b и выводит отправленный текст.

    • Приложение B слушает очередь queue_b, принимает сообщение, выводит его и тут же отправляет ответ в очередь queue_a.

    • Приложение A также слушает очередь queue_a и выводит принятые сообщения.

    • Класс TextMessage с обязательным (required) свойством Text хорошо подходит для описания передаваемого сообщения.

    Данный образец соответствует рекомендуемой структуре с использованием MassTransit для RabbitMQ, как описано в официальных руководствах и статьях по MassTransit и RabbitMQ. Важно, чтобы запущенный RabbitMQ был доступен на localhost:5672 с правильными учетными данными.

    Единственное, что может понадобиться, — немного доработать обработку асинхронных вызовов и предусмотреть корректное завершение работы шины (BusControl), но в целом ваш код — хороший стартовый пример, который можно запускать, тестировать, а затем масштабировать.

    Если при запуске возникают ошибки, стоит проверить:

    • Работает ли RabbitMQ на ожидаемых портах,

    • Не блокирует ли что-либо сеть,

    • Совпадают ли имена очередей и Uri,

    • Логины/пароли совпадают.

    Подтвержденные примеры с MassTransit и RabbitMQ на C# работают по аналогии с вашим кодом, что говорит о правильности подхода.

    Могу помочь с деталями тестирования и оптимизации при необходимости.habr+3

    1. https://habr.com/ru/articles/758938/
    2. https://habr.com/ru/companies/bimeister/articles/754958/
    3. https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/rabbitmq-event-bus-development-test-environment
    4. https://www.youtube.com/watch?v=IhbOOPHH8AE
    5. https://learn.microsoft.com/ru-ru/shows/dotnetconf-2021/modern-net-messaging-using-masstransit
    6. https://www.reddit.com/r/csharp/comments/1iiy2bi/how_to_use_rabbitmq_and_masstransit_for_reliable/
    7. https://www.youtube.com/watch?v=b-mT_NO4Kqs
    8. https://csharp-help.ru/2025/06/18/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-rabbitmq-%D0%B2-net/
    9. https://ru.stackoverflow.com/questions/1038236/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D0%B2-rabbitmq-masstransit-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D0%B8
    10. https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/integration-event-based-microservice-communications

Исключение в части MassTransit, связанной с GetMessageTopology<T>(), обычно означает проблему с распознаванием типа сообщения в конфигурации или с тем, как настроены подписчики (consumers) и топология сообщений в MassTransit.

Основные причины и решения этой ошибки:

  1. Отсутствие регистрации типа сообщения или несовпадение типа - убедитесь, что тип TextMessage объявлен как публичный, доступный и одинаково используется в обоих приложениях. Тип должен быть видимым на этапе конфигурации и компиляции.

  2. В MassTransit 7 и выше обязательна регистрация сообщений через контракт либо использование SetMessageTopology<T>(), если сообщению нужны особые настройки. В вашем случае можно попробовать упростить конфигурацию, либо явно зарегистрировать TextMessage как тип сообщения, если используется сложная топология.

  3. Используйте более полную настройку шины через AddMassTransit в DI, вместо устаревшего Bus.Factory.CreateUsingRabbitMq, чтобы избежать проблем с топологией сообщения. Пример конфигурации через DI:

  1. services.AddMassTransit(x =>
  2. {
  3.     x.AddConsumer<TextMessageConsumer>(); // если используете consumers
  4.     x.UsingRabbitMq((context, cfg) =>
  5.     {
  6.         cfg.Host("localhost", h =>
  7.         {
  8.             h.Username("guest");
  9.             h.Password("guest");
  10.         });
  11.         cfg.ReceiveEndpoint("queue_a", e =>
  12.         {
  13.             e.ConfigureConsumer<TextMessageConsumer>(context);
  14.         });
  15.     });
  16. });
  1. Если вы используете обработчики e.Handler<TextMessage>, убедитесь, что пространство имен и сборка совпадают и нет дублирующих определений типа.

  2. Проверьте версии пакетов MassTransit — иногда несовместимость версий может вызывать ошибки топологии.

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

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

Максимальная длина одного сообщения, передаваемого через MassTransit с RabbitMQ, зависит от ограничений RabbitMQ и клиента RabbitMQ .NET.

  • По дефолту в RabbitMQ максимальный размер сообщения — примерно 50 МБ. Сообщения объёмом больше 50 МБ не будут созданы и сервер их отклонит.

  • В RabbitMQ .NET клиенте начиная с версии 7.0.0 введён лимит по умолчанию в 128 МБ на размер сообщения (в версии 6.4.0 и ниже ограничение отсутствует). Это параметр MaxMessageSize в клиенте, который можно настроить при подключении.

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

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

  • Для приложений MassTransit данное ограничение наследуется от RabbitMQ и его клиента, так как MassTransit не добавляет свои ограничения по размеру сообщений.

Таким образом, ориентироваться стоит на максимальный размер сообщения в районе 50 МБ (сервер) или 128 МБ (клиент), с учётом производительности и надежности. Важно также проверить настройку MaxMessageSize в версии RabbitMQ .NET клиента, которую используете, и при необходимости задать её явно в конфигурации.github+3

Если нужно, могу помочь с примером настройки этого параметра.

  1. https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/1572
  2. https://groups.google.com/g/rabbitmq_rus/c/gA4wQbt6Jmo
  3. https://www.rabbitmq.com/docs/maxlength
  4. https://www.reddit.com/r/csharp/comments/10zoiq5/questions_around_rabbitmq_and_message_queues/
  5. https://stackoverflow.com/questions/60209586/message-durability-in-masstransit-rabbitmq
  6. https://habr.com/ru/articles/664962/
  7. https://www.reddit.com/r/dotnet/comments/1jr6l6u/masstransit_alternative/
  8. https://cloud.ru/docs/dms-rabbitmq/ug/topics/overview__limitations
  9. https://ru.stackoverflow.com/questions/1048993/%D0%93%D0%B0%D1%80%D0%B0%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9
  10. https://masstransit.io/documentation/configuration/transports/rabbitmq

Комментариев нет:

Отправить комментарий