Онлайн-оформление вкладов для Sravni.market

PHP Symfony, PostgreSQL, RabbitMQ, Redis, Kubernetes

Задача

Sravni.ru запускал sravni.market — маркетплейс финансовых услуг. Я пришёл на проект с первого дня как разработчик, через месяц стал тимлидом.

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

На деле за этим стояло:

  • Интеграция с несколькими банками — у каждого свой протокол обмена
  • Работа с персональными и финансовыми данными по требованиям ЦБ РФ
  • Архитектура, при которой падение одного банковского API не тянет за собой весь сервис
  • Сжатые сроки — бизнес ждал запуск

Решение

Стек: PHP Symfony, PostgreSQL, RabbitMQ, Redis. Деплоили в Kubernetes.

Стартовали с монолита — и это был сознательный выбор. Домен ещё толком не устоялся, пилить микросервисы на этом этапе значило бы тратить время на абстракции вместо фич. Зато внутри монолита я сразу развёл модули: клиентская часть (заявки, валидация, статусы) отдельно, шина обмена с банками (протоколы, трансформация форматов, очереди) отдельно.

Самое тяжёлое — банковские интеграции. У одного банка REST API, у другого SOAP, у третьего что-то своё. Я сделал единый слой адаптеров, чтобы бизнес-логика не знала про эту разницу. Ещё шифрование, аудит-логи, контроль доступа — ЦБ не даёт расслабиться.

Мы организовали работу так, что подключение нового банка не трогает ядро. Каждая интеграция — отдельный адаптер на RabbitMQ. Один разработчик пишет адаптер, другой в это время спокойно развивает клиентскую часть.

Со временем монолит стал мешать: деплоить и масштабировать части независимо не получалось. Распилили на два микросервиса и API Gateway. Границы были заложены с первого дня, поэтому разделение заняло пару недель, а не месяцы.

Результаты

Запустились почти в срок — для финтех-проекта с кучей интеграций это нормально.

Что получилось в итоге:

  • Клиентский сервис — заявки, валидация, статусы
  • Шина обмена с банками — адаптеры изолированы друг от друга, каждый работает через RabbitMQ
  • API Gateway — точка входа, маршрутизация, авторизация

Главный результат: если у одного банка лёг API или он тормозит, остальные продолжают работать. Нагрузка на одну часть не трогает другую.

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

Нужна похожая архитектура для вашего проекта? Посмотрите мои услуги или напишите мне.