morto
@morto
вечный ученик

Как организовать работу микросервисов в kafka?

Здравствуйте. Есть три сервиса, которые грубо говоря реализуют интернет-магазин:
1. Принимает запрос и отправляет его в kafka.
2.Читает из kafka и отвечает за товары.
3. Читает из kafka и отвечает за кошелек пользователя.
То есть когда запрос с количеством и наименованием нужных пользователю товаров поступает на сервис 1, то мы идём в сервис 3 берем информацию о товарах отправляем их в сервис 2 и в нём уже снимаем деньги у пользователя, а в заключении отвечаем сервису 1 о результате.
Появились вопросы насчет организации работы сервисов:
1. Необходима ли тут синхронизировать работу сервисов (т.е. выполнять запросы поочередно), ибо возможна ситуация когда пользователи одновременно покупают товар, а на складе его хватает только для одного пользователя? И если да, то как это реализовать?
2. Правильно ли я построил алгоритм общения между сервисами описанный выше?
P.S.: С микросервисной архитектурой и кафкой знаком мало.
  • Вопрос задан
  • 250 просмотров
Решения вопроса 2
Почему Kafka? Почему микросервисы?
1. Принимает запрос и отправляет его в kafka.
От кого принимает и каким образом? Какой выдается ответ и каким образом?
Нужно разделить интернет-магазин на логические части. Проверить какие запросы могут обслуживаться синхронно, а какие - отложенно (асинхронно).
Когда на складе остается мало товара, пользователь должен знать об этом. Еще можно показывать наличие товара только если имеется свыше X единиц. А с точки зрения СУБД можно применить оптимистическую блокировку записи.
Ответ написан
Комментировать
@Arlekcangp
Разработчик, Лид, Архитектор ПО
Мне видится, что правильнее информацию о остатке товара хранить в отдельном сервисе. Пусть это будет сервис 2 А кошелёк и оплату вместе-сервис 3 Так схема будет такой:
1. Сервис 1 получает запрос
2. Сервис 1 идет к сервису 2 за информацией есть ли запрошенный товар и если он есть то "резервирует" его.
3. Сервис 1 отправляет сервису 3 информацию для оформления оплаты.
4. Если оплата успешна (у пользователя достаточно средств и платёжная система отработала без ошибок) то сервис 1 "подтверждает резерв" товара через сервис 2. В противном случае сервис 1 "возвращает резерв" сервису 2. Резервированый товар не показывается при показе остатков другим пользователям.
Такая схема напоминает паттерн распределённой транзакции с двух-разным комитом. Поситайте про него. В данном случае использовать Кафку или нет большого значения не имеет, т к кафка-это только канал связи. Все те же самые манипуляции придётся проводить и при использовании обычного рест апи.
Если же делать синхронно, то в сервисе 1 операции станут последовательными, и микросервисная организация теряет смысл, т к это будет медленнее чем монолит и не масштабируемо. Но для такого усложнения должны быть объективные причины - высокая нагрузка. Если же еë нет то монолит проще и дешевле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы