Микросервисы: MassTransit PubSub
HTML-код
- Опубликовано: 9 сен 2024
- В этом видео я покажу как можно построить общение между микросервисами при помощи паттерна PubSub/Subscribe. Для коммуникаций я буду использовать MassTransit (RabbitMQ). Микросервисная архитектура буду строить на платформе ASP.NET Core 3.1.
Перед собой я ставлю следующие задачи:
* Создать уведомление для микросервисов Warehouse и Configuration о том, что новый пользователь (ApplicationUser) успешно зарегистрирован в системе.
* Указанные выше сервисы должны получить информацию об идентификаторе пользователя, а также фамилию и имя
* Для коммуникации использовать MassTransit (RabbitMQ).
* Применение паттерна Saga не требуется.
10 простых шагов для достижения цели:
1. [02:32] Создание микросервисов для
* Organization API (IdentityServer Module)
* Warehouse API (Module)
* Configuration API (Module)
2. [06:27] Настройка подключения к базе данных
* Organization API (IdentityServer Module)
* Warehouse API (Module)
* Configuration API (Module)
3. [14:21] Создание nuget-пакета Contracts (локально)
4. [17:33] Настройка RabbitMQ для подключений
5. [18:28] Установка nuget-пакетов для Masstransit
6. [19:55] Подключения к RabbitMQ (Gist)
7. [24:49] Создание контракта для коммуникации в сборке контракт
8. [27:48] Создание и регистрация подписчиков (Consumer) в Configuration и Warehouse
9. [35:09] Публикуем событие о регистрации
10. [44:00] Конфигурирование подписчика
ключевые понятия:
#микросервисы,#коммуникации,#microservices,#communications,#MassTransit,#RabbitMQ,#PubSub,#Publish,#Subscribe,#aspnetcore,#Template,#Framework,#nuget
Ссылки:
PubSub паттерн
en.wikipedia.o...
Saga (Long-running transaction)
en.wikipedia.o...
Nimble Framework
github.com/Cal...
Шаблон
gist.github.co...
Благодарности и помощь каналу принимаются:
www.calabonga....
Спасибо, очень полезно!
Очень рад, помочь :)
Добрый день!Материал супер! Спасибо! Нашел ошибочку в классе конфигурации на git. Имя переменной должно быть с маленькой буквы. Иначе получается что переменной Configuration нет в контексте. Картиночку увы не вставлю.
public static void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
var massTransitSection = Configuration.GetSection("MassTransit");
var url = massTransitSection.GetValue("Url");
Спасибо
Добрый вечер! Среди ваших замечательных уроков вроде бы нет кафки. Планируется ли контент по ней?
Планы есть, времени нет.
Если пробовать с x.AddConsumer(_ => new ApplicationUserCreatedConsumerDefinition()); то сообщение продолжает приходить только одному из консбюмеров. Если использовать x.AddConsumer(typeof(ApplicationUserCreatedConsumerDefinition)); то приходит всем
Спасибо вам за материал. У меня остался один вопрос по поводу очередей. У меня для каждого Consumer'а должна быть своя очередь? Т.е. если у меня будет потребителей больше, чем очередей, то получается не все сообщения будут доставлены до всех потребителей. Я пробовал отсылать сообщения двум Consumer'ам, у меня они распределялись поровну между ними (отправляю 10, каждый сервис получает по 5)
Спасибо за комментарий. Попробую ответить крако. Всё зависит от типа сообщений. Есть тип "Comnand", а есть тип "Event". Это негласное правило разделения, но работает оно так.
1 .Command - получает один потребитель (если потребителей много - включается режим "Load Balancy") и доставка гарантируется.
2. Event - получают все потребители и доставка не отслеживается (это и есть PubSub)
Спасибо за видео! А у вас случаем не было опыта реализации диспетчера процессов на MassTransit, Saga и RabbitMQ ? Например для обработки всяких там заявок на ипотеки, кредиты, осаго и т.п.
На канале есть примеры
@@SergeiCalabonga а можете носом ткнуть пожалуйста :) так сходу не нашел
У меня кровь из глаз потекла от конструктора AccountService. Зачем это было писать, да еще в "шаблон" заворачивать. Повторять архитектурною мантру вовсе не означает понимать ее.
Рад помочь!
Есть микросервисы корзина и продукты. Чтобы добавить продукт или создать корзину, паблишером должно быть фронтенд приложение, например mvc?
Frontend - тоже может быть микросервисом.
@@SergeiCalabonga Ок. Микросервисы Product и Cart. Добавляем продукт в корзину. Это значит Cart паблишер, запрашивает продукт из консьюмера Product. У Product есть ещё консьюмеры на создание и удаление продукта (для своей базы данных). Создаю ещё один микросервис который выполняет эти запросы?
@@artemignat7764 интересно, а "паблишер", "консьюмер" - это что за звери? Может всё-таки или до конца по-русски "публикатор" и "потребитель", или до конца по-английски "publisher" и "consumer"? Читать очень сложно, да и не красиво, простите. Англицизмы меня сбивают с толку. :(
А если по делу, то....
1. правила, которыми вы руководствуетесь для создания новых сервисов мне не понятно.
2. Какие обязанности на сервисе Product? Пред положу, что это каталог товаров.
3. Какие обязанности на сервере Cart? Если Product - это каталог товаров.
4. Почему это два разных сервиса? (Вам скучно было с одиним,)
@@SergeiCalabonga Product -сервис каталога товаров. В нём я могу продукт добавлять, удалять, редактировать. Сервис Cart может добавлять продукт, путям обращения к Product и удалять продукт и корзины. На уровне crud запросов, я понимаю как эти сервисы общаются между собой. И понимаю как Cart может получить продукт от Product через MassTransit. Но я не понимаю как мне реализовать три действия: добавление,удаление,редактирование продукта в Product с помощью MassTransit с брокером. Я должен ещё создать микросервис для этого?
@@SergeiCalabonga Product - сервис каталога товаров. Сервис Cart может добавлять и удалять продукт.Он обращается к Product, только для получения продукта через MassTransit.В сервисе Product можно продукт добавлять,удалять,редактировать. Это делается админом через crud запросы к api сервиса Product. То что я описал, считается микросервисной архитектурой или же нужно создавать ещё один микросервис который будет делать эти запросы через MassTransit?