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, и оба также печатают текст в консоль.
Общие компоненты (поддержка сообщений)
csharppublic class TextMessage { public string Text { get; set; } }
Приложение A (отправляет, потом принимает)
csharpusing 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 (принимает, потом отправляет)
csharpusing 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) нужно сделать следующие шаги:
Включить веб-интерфейс, если он еще не активирован. Для этого в командной строке выполните:
В Linux:
rabbitmq-plugins enable rabbitmq_managementВ Windows:
rabbitmq-plugins.bat enable rabbitmq_management
После этого перезапустите сервис RabbitMQ:В Linux:
sudo systemctl restart rabbitmq-serverВ Windows: перезапустите службу RabbitMQ через "Службы" или командой.
Откройте в браузере адрес для админки RabbitMQ:
http://localhost:15672Авторизуйтесь с помощью учетных данных. По умолчанию:
Логин: guest
Пароль: guest
Примечание: Для доступа с других хостов, кроме localhost, создайте отдельного пользователя с нужными правами.
В веб-интерфейсе создайте очередь:
Перейдите во вкладку «Queues» (Очереди)
Нажмите кнопку «Add a new queue» (Добавить очередь)
Введите имя очереди и при необходимости укажите дополнительные параметры (время хранения, максимальный размер и т.д.)
Сохраните созданную очередь
Также в интерфейсе можно создавать пользователей, управлять их правами доступа, мониторить состояние брокера, обмены сообщений (exchanges), привязки (bindings) и многое другое.
Таким образом, через браузер можно удобно создавать и настраивать очереди и пользователей RabbitMQ без необходимости командной строки. Это основной способ администрирования RabbitMQ для большинства пользователей.
Если нужно, могу помочь с более подробной инструкцией по конкретным операциям в веб-интерфейсе.
Для настройки RabbitMQ через веб-интерфейс (RabbitMQ Management Plugin) нужно сделать следующие шаги:
-
Включить веб-интерфейс, если он еще не активирован. Для этого в командной строке выполните:
-
В Linux:
rabbitmq-plugins enable rabbitmq_management -
В Windows:
rabbitmq-plugins.bat enable rabbitmq_management
После этого перезапустите сервис RabbitMQ: -
В Linux:
sudo systemctl restart rabbitmq-server -
В Windows: перезапустите службу RabbitMQ через "Службы" или командой.
-
Откройте в браузере адрес для админки RabbitMQ:
http://localhost:15672 -
Авторизуйтесь с помощью учетных данных. По умолчанию:
-
Логин: guest
-
Пароль: guest
Примечание: Для доступа с других хостов, кроме localhost, создайте отдельного пользователя с нужными правами.
-
-
В веб-интерфейсе создайте очередь:
-
Перейдите во вкладку «Queues» (Очереди)
-
Нажмите кнопку «Add a new queue» (Добавить очередь)
-
Введите имя очереди и при необходимости укажите дополнительные параметры (время хранения, максимальный размер и т.д.)
-
Сохраните созданную очередь
-
-
Также в интерфейсе можно создавать пользователей, управлять их правами доступа, мониторить состояние брокера, обмены сообщений (exchanges), привязки (bindings) и многое другое.
Таким образом, через браузер можно удобно создавать и настраивать очереди и пользователей RabbitMQ без необходимости командной строки. Это основной способ администрирования RabbitMQ для большинства пользователей.
Если нужно, могу помочь с более подробной инструкцией по конкретным операциям в веб-интерфейсе.itvgroup+3
- 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
- https://docs.aamsystems.ru/passoffice/passoffice-guide/admin-guide-doc/rabbitmq
- 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
- https://reg.cloud/blog/ustanovka-nastrojka-i-ispolzovanie-rabbitmq/
- https://timeweb.cloud/tutorials/microservices/ustanovka-i-nastroika-rabbitmq
- https://thewebland.net/development/devops/chast-3-interfejs-upravleniya-rabbitmq/
- https://arenda-server.cloud/blog/kak-ustanovit-i-upravljat-rabbitmq/
- https://tech-research.ru/rabbitmq-php/
- https://efsol.ru/manuals/rabbitmq-windows-local/
- https://www.altlinux.org/EnterpriseApps/RabbitMQ
Чтобы проверить, запущен ли процесс в Docker, используйте команду:
bashdocker ps
Эта команда выводит список всех запущенных контейнеров. В выводе будет информация: ID контейнера, имя образа, команда запуска, время создания, статус, порты и имя контейнера. Столбец STATUS показывает состояние, например, "Up 10 minutes" означает, что контейнер работает уже 10 минут.
Если вы хотите увидеть все контейнеры, включая остановленные, используйте:
bashdocker ps -a
Статусы контейнеров могут быть:
Up (контейнер работает)
Exited (завершен)
Created (создан, но не запущен)
Restarting (перезапускается), и другие.
Для детальной информации по конкретному контейнеру можно использовать:
bashdocker 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
- https://purpleschool.ru/knowledge-base/article/docker-ps
- https://serverspace.ru/support/help/spisok-kontejnerov-docker/
- https://ru.hexlet.io/courses/docker-basics/lessons/container-management/theory_unit
- https://timeweb.cloud/tutorials/docker/komandy-docker-spisok
- https://dockerhosting.ru/blog/komandy-docker-shpargalka/
- https://serverspace.ru/support/help/osnovnye-komandy-docker/
- https://devopsgu.ru/guides/docker-cheatsheet/
- https://www.linuxshop.ru/articles/a26710824-osnovnye_komandy_dlya_docker
- https://habr.com/ru/companies/ruvds/articles/440660/
- 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
- https://purpleschool.ru/knowledge-base/article/rabbitmq
- https://habr.com/ru/companies/otus/articles/794216/
- https://docs.testit.software/installation-guide/set-up-external-connections/external-connection-rabbitmq.html
- https://help.mzta.ru/ss/rabota_s_docker_i_rabbitmq_1_print.html
- https://www.reddit.com/r/csharp/comments/b1719z/how_could_connect_my_application_to_rabbitmq_in/
- https://habr.com/ru/articles/703352/
- https://voblachke.ru/blog/kak-zapuskat-rabbitmq-v-docker-na-windows-10/
- https://thewebland.net/development/devops/rabbitmq/nastrojka-klastera-rabbitmq-na-docker/
- 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
- https://purpleschool.ru/knowledge-base/article/rabbitmq
- https://habr.com/ru/articles/758938/
- https://masstransit.io/quick-starts/rabbitmq
- https://habr.com/ru/companies/chibbis/articles/871588/
- https://github.com/MassTransit/docker-rabbitmq
- https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/rabbitmq-event-bus-development-test-environment
- https://temofeev.ru/info/articles/masstransit-i-ochered-v-baze-dannykh/
- https://stackoverflow.com/questions/79124877/rabbitmq-masstransit-connection-refused-while-running-docker
- https://dev.to/gaurav-nandankar/getting-started-with-rabbitmq-pubsub-using-masstransit-in-net-52m5
Ваш код для приложений 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
-
- https://habr.com/ru/articles/758938/
- https://habr.com/ru/companies/bimeister/articles/754958/
- https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/rabbitmq-event-bus-development-test-environment
- https://www.youtube.com/watch?v=IhbOOPHH8AE
- https://learn.microsoft.com/ru-ru/shows/dotnetconf-2021/modern-net-messaging-using-masstransit
- https://www.reddit.com/r/csharp/comments/1iiy2bi/how_to_use_rabbitmq_and_masstransit_for_reliable/
- https://www.youtube.com/watch?v=b-mT_NO4Kqs
- 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/
- 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
- https://learn.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/integration-event-based-microservice-communications
Исключение в части MassTransit, связанной с GetMessageTopology<T>(), обычно означает проблему с распознаванием типа сообщения в конфигурации или с тем, как настроены подписчики (consumers) и топология сообщений в MassTransit.
Основные причины и решения этой ошибки:
Отсутствие регистрации типа сообщения или несовпадение типа - убедитесь, что тип
TextMessageобъявлен как публичный, доступный и одинаково используется в обоих приложениях. Тип должен быть видимым на этапе конфигурации и компиляции.В MassTransit 7 и выше обязательна регистрация сообщений через контракт либо использование
SetMessageTopology<T>(), если сообщению нужны особые настройки. В вашем случае можно попробовать упростить конфигурацию, либо явно зарегистрироватьTextMessageкак тип сообщения, если используется сложная топология.Используйте более полную настройку шины через
AddMassTransitв DI, вместо устаревшегоBus.Factory.CreateUsingRabbitMq, чтобы избежать проблем с топологией сообщения. Пример конфигурации через DI:
- services.AddMassTransit(x =>
- {
- x.AddConsumer<TextMessageConsumer>(); // если используете consumers
- x.UsingRabbitMq((context, cfg) =>
- {
- cfg.Host("localhost", h =>
- {
- h.Username("guest");
- h.Password("guest");
- });
- cfg.ReceiveEndpoint("queue_a", e =>
- {
- e.ConfigureConsumer<TextMessageConsumer>(context);
- });
- });
- });
Если вы используете обработчики
e.Handler<TextMessage>, убедитесь, что пространство имен и сборка совпадают и нет дублирующих определений типа.Проверьте версии пакетов 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
Если нужно, могу помочь с примером настройки этого параметра.
- https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/1572
- https://groups.google.com/g/rabbitmq_rus/c/gA4wQbt6Jmo
- https://www.rabbitmq.com/docs/maxlength
- https://www.reddit.com/r/csharp/comments/10zoiq5/questions_around_rabbitmq_and_message_queues/
- https://stackoverflow.com/questions/60209586/message-durability-in-masstransit-rabbitmq
- https://habr.com/ru/articles/664962/
- https://www.reddit.com/r/dotnet/comments/1jr6l6u/masstransit_alternative/
- https://cloud.ru/docs/dms-rabbitmq/ug/topics/overview__limitations
- 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
- https://masstransit.io/documentation/configuration/transports/rabbitmq