Опыт построения микросервисной архитектуры в цифровом банке
Выступление Андрея Солощака, ведущего архитектора «Бинбанка», на профессиональной встрече CUSTIS Meetup: Микросервисы в Enterprise (16 марта 2017 года, Москва).
Чем старше я становлюсь, тем менее забочусь о принятии правильных технических решений, но все более меня заботит сохранение возможности изменить неправильные. (Мартин Фаулер)
Продукты (каналы обслуживания) • Интернет-Банк и мобильный банк (ф/л, ю/л), SMS-банк, Интернет-эквайринг и P2P, Пластиковые карты (+Apple Pay, Samsung Pay, Android Pay), Платежные системы (пример http://russia.wu.com), чаты и чат-боты • Высокая конкуренция • Большой поток изменений • Мотивация на перевод клиентов в каналы • Цифровая трансформация уже вопрос выживания • Цифровой банк - это уже не совсем банк, но все еще банк • Тенденции • Фокус на usability (frontend), • Переход на модель Finance as a service (backend)
сложности • 24x7 • Относительно высокая нагрузка • Безопасность • Гетерогенная среда • Унаследованные системы • Традиционные подходы не отвечают вызовам • Monolith, Shared Library
• Масштабирование принципов проектирования • Domain Driven Design • SRP, DIP, ISP • Maintainability • Повторное использование, отказоустойчивость, масштабируемость • Backend for frontend (usability) • Безопасность • Процессные и организационные изменения • DevOps – непрерывная доставка ценности • Независимое внесение изменений • Роль архитектора • Проектирование в терминах взаимодействия микросервисов • Разработка и согласование контрактов • Выявление и решение проблем проектирования
(клиентами) • Типы (DTO) описывают доменную модель • Контракты на основе интерфейсов (.Net) • Синхронный RPC вызовы (awaitable) • Асинхронные (AMQP) • Персистентные fire-and-forget запросы (Durable очереди) • Распределенные события (Events) • RAML - описание фасадных RESTful API • Контроль архитектуры на уровне исходного кода (Git / Bitbucket) • Контроль версий по SemVer • WCF или Service Stack (для .NET)? • Service Stack – лаконичное REST-совместимое описание контрактов Контракт на основе интерфейса (WCF style): [RemoteServiceContract] public interface ICustomerService { [RemoteOperationContract] Task<Customer> GetCustomer(long customerId); [RemoteOperationContract(Durable = true)] Task SaveCustomer(Customer customer); [RemoteEventContract] event EventHandler<CustomerArgs> CustomerUpdated; }
же LINQ и OData?) • Повод для ревью дизайна • Для некоторых случаев стоит подумать о CQRS • Усложняется отладка • Unit Tests, DevOps, logging • Поддержка Nested Exceptions • Каждый сервис в отдельном Git – репозитории • Рефакторинг требует больше времени, но всегда делается осознанно • Обновление общего Framework
код • Каждое изменение – собирается • Обязательно используем VCS и сервер интеграции (Git + Teamcity) Delivery – автоматизированный DoD (definition of done) • Релизы всегда собираем из одной ветки (master) • Если код попал в master – DoD выполнен, master всегда готов к релизу • Следуем workflow (feature branch) в VCS, контроль качества на уровне отдельных изменений Deployment – естественное развитие в рамках DevOps • Код в master всегда соответствует бою • Покрытие автотестами достаточно для гарантии качества • Код развертывается автоматом при прохождении автоматического тестирования • Используем ПО для автоматического развертывания и управления конфигурацией (Octopus)
доменной модели на уровне контрактов • Предсказуемое развитие системы • Наличие / отсутствие проблем определяется качеством проектирования • DevOps – непрерывная доставка ценности • От проектирования до развертывания • Это не бесплатно, но того стоит
• Автоматическое тестирование • Виртуализация и контейнеризация • Infrastructure as a code • Перспективы масштабирование по всей организации • Построение Open API уже тенденция • Требуется отказ от традиционных SOA / BPM подходов • Поддержка Event Driven Architecture • Использование open source (RabbitMQ, Kafka) под вопросом • Не все промышленные платформы хорошо подходят • Ориентация на SOA • Ограниченная интероперабельность • Проблемы: Закон Конвея, унаследованные системы