Вопрос с собеса Middle на 250К+ 🤔 Когда-то я собесился в к

Когда-то я собесился в команду, которая переходила с монолита на микросервисы, и мне задали такой вопрос: Кейс: У нас есть событие «Пользователь зарегистрировался». В системе есть несколько микросервисов: Пользователи, Заказы, Нотификации.

Когда пользователь регистрируется, каждый сервис должен сделать что-то свое: • сервис заказов – создать пустую корзину • сервис нотификаций – отправить приветственное письмо • возможно, появятся другие подписчики в будущем

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

На самом деле это не хитрый вопрос. Если спокойно подумать, ответ довольно прямолинейный: для такого сценария идеально подходит паттерн Публикация / Подписка (Pub/Sub).

Как это работает: Сервис Пользователи публикует событие UserRegistered в брокер сообщений (Kafka/RabbitMQ). А дальше  начинается то, за что микросервисы вообще любят:

• Сервис Заказы подписывается на событие и выполняет свою логику • Сервис Нотификации подписывается на то же событие и делает свое • Завтра появится сервис аналитики и он просто подпишется на событие

Издатель не знает и не должен знать, кто именно потребляет событие и что с ним делают. Он просто сообщает факт:  «пользователь зарегистрирован».

А что с другими вариантами? Прямые вызовы API (Point-to-Point):

Сервис Пользователи после регистрации сам синхронно вызывает API Заказов, потом Нотификаций, потом еще что-то. Если сервис Заказов ляжет – регистрация не пройдет. Отсюда создается жесткая связь и цепочка зависимостей 😑

Общая база данных (Shared Database):

Все сервисы лезут в одну БД, чтобы смотреть в таблицу users и отслеживать новых пользователей. Теряется независимость данных – главный принцип микросервисов. Любое изменение схемы таблицы users тянет за собой деплой всех сервисов, а сама БД становится единой точкой отказа.

Единый оркестратор (API Gateway):

Gateway принимает запрос на регистрацию, вызывает Пользователей, а потом сам дергает все остальные сервисы. И если он упадет, то вся цепочка будет парализована.

Лайфхак для собеса:

Если тебя спрашивают про интеграцию микросервисов, задавай встречные вопросы, чтобы точно понять контекст:: • Критично ли, чтобы все подписчики обработали событие сразу? • Допустимы ли дубли событий? • Нужно ли сохранять порядок событий?

Что же ответить на собесе? Я бы использовал шаблон Публикация/Подписка (Pub/Sub) через брокер сообщений (Kafka/RabbitMQ).

Сервис Пользователи публикует событие UserRegistered, а сервисы Заказы, Нотификации и любые будущие потребители подписываются на него независимо.

Это снижает связность, упрощает масштабирование и позволяет добавлять новую бизнес-логику без переписывания уже существующих сервисов 👆

Главное не растеряться и спокойно рассуждать вслух. Назвал Pub/Sub, объяснил про низкую связность, упомянул масштабирование и этого уже достаточно для мидла.

Сеньор добавил бы, что можно учесть в ТЗ и какие риски могут быть на проде. Вот, собственно, и вся разница.

Вопрос с собеса Middle на 250К+ 🤔
Когда-то я собесился в к | Сетка — социальная сеть от hh.ru