Оливет Битти, глава технического департамента британского необанка Monzo, рассказывает о построенной его командой архитектуре бэкенд-систем банка.
Бэкенд в Monzo строился с нуля. Из первичных требований была отмечена необходимость для системы быть доступной 24 х 7 и масштабируемой до миллионов клиентов по всему миру — это привело к тому, что с самого начала система разрабатывалась как коллекция распределенных микросервисов. Для стартапа на ранней стадии этот подход необычен; как правило, такие компании выбирают уже знакомую централизованную архитектуру с привычными фреймворками и реляционными базами данных. Однако в Monzo этот вариант не рассматривался, так как несет за собой привычные «детские болезни» — единую точку отказа, необходимость в периодическом отключении для проведения техобслуживания и плохую масштабируемость.
Крупные компании, такие как Amazon, Netflix и Twitter, показали, что единые монолитные базы данных не масштабируются на большое количество пользователей и разработчиков — а если банк планирует выходить на множество различных рынков с уникальными требованиями на каждом, то ему просто придется держать много команд, работающих над разными частями продукта. Всем этим группам придется самостоятельно контролировать свой процесс разработки, вывода новых версий и масштабирования без необходимости координации усилий с другими командами. Следовательно, процесс разработки должен быть распределенным и декомпозированным, как и продукт.
На старте создания собственной платформы у Monzo было всего три разработчика, и приходилось быть прагматичными — были выбраны уже знакомые технологии, которые вели в нужном направлении, и разработка велась с учетом того, что программисты в будущем всегда смогут кардинально изменить тот или иной модуль.
При запуске бета-тестирования бэкенд Monzo включал в себя около 100 микросервисов. Сейчас их около 150, и команда разработки выросла соответственно. Так как получение банковской лицензии было уже почти решенным делом, команда пересмотрела некоторые архитектурные подходы и пришла к необходимости сфокусировать работы на следующих направлениях:
Давайте разберем каждое из этих направлений подробнее.
Команде Monzo был необходим эффективный и автоматизированный способ управлять большим количеством серверов, распределять между ними нагрузку и реагировать на их выход из строя.
Если вам необходимо построить отказоустойчивую гибко масштабируемую систему, то у вас должна быть возможность добавлять и удалять новые сервера: по мере того как система развивается, сервера выходят из строя или меняются требования пользователей. Запускать по одному сервису на хосте — трата ресурсов (ведь сервису могут быть не нужны все ресурсы хоста), а традиционный подход ручного распределения сервисов по хостам слишком сложно масштабируется.
В Monzo используют планировщики для кластеров, которые разворачивают приложения на серверах в соответствии с ресурсными требованиями, масштабируют их при необходимости и заменяют сервера при выходе из строя. В этом помогает контейнеризация, и в частности Docker. Контейнеризация — это комбинация технологий, применяемых в ядре Linux, объединенная в образ, что позволяет отделить приложение от операционной системы и изолировать от других приложений на том же сервере. Таким образом, системе управления кластером приходится иметь дело исключительно с контейнерами.
В Monzo используют планировщик Kubernetes, запускаемый на серверах с CoreOS. Этот планировщик тесно интегрируется с Docker и известен тем, что используется в эксплуатации Google.
Кроме повышения надежности Kubernetes позволил Monzo снизить расходы на инфраструктуру — теперь она обходится банку всего в четверть от привычных затрат. К примеру, если раньше для выпуска на production использовалось несколько дорогих производительных серверов с CI-системой Jenkins, то теперь Kubernetes использует для работы свободные ресурсы на уже имеющейся инфраструктуре — практически бесплатно. Подобный подход позволяет быть уверенным в том, что ресурсоемкие, но низкоприоритетные задачи (такие, как формирование отчетов) не повлияют на производительность критически важных сервисов, используемых клиентом.
Основным языком разработки микросервисов в Monzo был и остается Go, но в общую систему бесшовно включаются модули на других языках.
Использование языка Go позволяет создавать сервера, обеспечивающие параллельную работу с низкими задержками, но ни одна экосистема языка не содержит всех инструментов, необходимых для создания банка. В Monzo осознали важность использования большого количества инструментов, как коммерческих, так и с открытым исходным кодом, а также предстоящую эволюцию архитектуры платформы по мере изменений в технологиях.
Обычно фрагменты кода, которые используют несколько приложений, принято объединять в библиотеки, но этот подход не годится в многоязычной системе — если бы пришлось реплицировать и поддерживать в актуальном состоянии тысячи и сотни тысяч строк повторно используемого кода каждый раз, когда к платформе подключается сервис на новом языке, все это довольно быстро стало бы неуправляемым.
В Monzo выделили повторно используемый код в отдельные сервисы. Чтобы заблокировать данные для проведения в них изменений, сервис фиксирует их в распределенном хранилище etcd с помощью чистого RPC. Все многоязычные сервисы, использующие общую инфраструктуру (включая базы данных и очереди сообщений), реализуются подобным образом.
Переход на подобные сервисы позволил уменьшить количество кода для каждого языка — нужен только клиент для вызовов RPC. Этот подход уже сейчас позволяет Monzo писать сервисы на Java, Python и Scala.
RPC-транспорт
Когда большое количество сервисов распределено между серверами, датацентрами и даже континентами, успех системы зависит от объединяющего компоненты слоя удаленного вызова процедур (RPC, remote procedure calling), который может обеспечить работоспособность в случае выхода из строя отдельных компонентов, снизить задержки при передаче данных и помочь в понимании поведения системы при работе.
С учетом того что разработка сервисов ведется на множестве языков, протокол для удаленного вызова процедур должен их все поддерживать. Победителем стал HTTP — у каждого языка есть под него стандартные библиотеки.
Однако для того чтобы создать надежную мультисервисную платформу, к слою RPС пришлось добавить следующие элементы:
Одна из наиболее сложных RPC-систем — это Finagle, она построена на модульной архитектуре и обладает практически всей необходимой функциональностью. На ее основе создан linkerd, который и используют в Monzo. Вместо того чтобы связываться с другими частями системы напрямую, каждый компонент платформы Monzo общается с локальной копией linkerd, который направляет запрос к нужному узлу, используя балансировку нагрузки Power of Two Choices + Peak EWMA. Если идемпотентные запросы не могут быть выполнены, они автоматически возобновляются. Вся логика взаимодействия между сервисами вынесена в RPC-слой, что позволяет писать сервисы на любых языках без необходимости поддержки RPC-библиотек.
Это сэкономило время на удаленный запуск процедур и повысило надежность RPC. Он развернут как набор демонов в Kubernetes, так что сервисы всегда обращаются к нему на локальном хосте, который пробрасывает запрос дальше. В тех случаях, когда реплики обоих сервисов, связь между которыми обеспечивает RPC, находятся физически на одном сервисе, запрос даже не уходит в сеть.
Чтобы бэкенд был производительным и надежным, применяются очереди сообщений для планирования фонового выполнения задач. Эта механика должна гарантировать возможность постановки задания в очередь и удаления из нее, а также то, что данные в очереди никогда не будут потеряны.
Большая часть задач в бэкенде Monzo выполняется асинхронно. К примеру, даже когда обработка платежа занимает меньше секунды, бэкенд в течение десятка миллисекунд сообщает платежной системе об одобрении или отклонении платежа с карты Monzo. Работы по обработке данных мерчанта, рассылке push-нотификаций и даже включение транзакции в поток данных пользователя происходят асинхронно.
Кроме асинхронности, эти шаги не должны быть пропущены. Даже если произойдет ошибка, в ходе которой будет невозможно автоматически восстановить состояние системы, должна быть возможность исправить данные и возобновить процесс. Это определяет следующие требования к асинхронной архитектуре:
В качестве платформы обмена сообщениями между сервисами в Monzo выбрали Apache Kafka. Ее реплицируемый модульный дизайн позволяет обрабатывать выход узлов из строя и масштабировать платформу по мере необходимости без прерывания обслуживания. Дизайн слушателей в этой платформе тоже интересен: в то время как большинство других платформ держат отдельную очередь для каждого сервиса, в слушатели проходят «курсором» по общему журналу сообщений.
Это позволило удешевить систему паблишеров / слушателей, уменьшить их требовательность к ресурсам. Так как сообщения сохраняются в журнале вне зависимости от событий, их всегда можно воспроизвести для определенных сервисов.
В завершение хочется обратить внимание на то, что три важнейших компонента, обеспечивающих связность и цельность бэкэнда Monzo — система управления кластером Kubernetes, система удаленного вызова процедур linkerd и система асинхронного обмена сообщениями Kafka — это бесплатно распространяемые системы с открытым исходным кодом. Может быть, архитектурные перемены в банке — это не так уж и дорого?
Лучшие новости сегодня
Вы искали сегодня
Другие новости сегодня
Авторы - группа депутатов. Предлагается установить доплату к пенсии, выплачиваемую до окончания каждого года, в размере, равном страховой пенсии конкретного пенсионера, но не ниже полутора прожиточных минимумов...
На завтра, 05.12.2025 г., курс доллара США, официально устанавливаемый Центральным банком РФ, составит 76,9708 руб. Это на 98,5 коп. ниже, чем курс, установленный на предыдущую дату. Официальный курс Евро на завтра составит 89,9011 руб., что на 69 коп. ниже, чем курс Евро, действующий сегодня.
В нормах закона о банкротстве предлагается дополнить список случаев, в которых не действует освобождение должника от дальнейшего исполнения обязательств. Депутаты внесли в Госдуму законопроект с поправками...
Власти начнут мониторить выписки по счетам граждан, первыми из которых будут получатели пособий на детей в трех регионах страны. Президентом подписан федеральный закон от 28.11.2025 № 431-ФЗ с поправками в отдельные законодательные акты, об особенностях исполнения бюджетов бюджетной системы РФ в
Также корректируется порядок учета алиментов при назначении единого пособия. Изменения коснутся и правила нулевого дохода. С 1 января 2026 года будет скорректирован порядок учета доходов и правила комплексной...
В России с 1 декабря 2025 года введена обязательная маркировка целого ряда товаров. Нововведение затронет игрушки, бритвенные принадлежности, а также какао и горячий шоколад. Об этом сообщило агентство...
«Наши задачи» - предоставлять самую оперативную, достоверную и подробную информацию по банковскому рынку; - помогать клиентам в выборе самых выгодных банковских продуктов; - способствовать банкам в поиске качественных клиентов; - налаживать общение между банками и их клиентами.
Авторы - группа депутатов. Предлагается установить доплату к пенсии,
ПодробнееНа завтра, 05.12.2025 г., курс доллара США, официально устанавливаемый
ПодробнееВ нормах закона о банкротстве предлагается дополнить список случаев, в которых
ПодробнееВласти начнут мониторить выписки по счетам граждан, первыми из которых будут
ПодробнееТакже корректируется порядок учета алиментов при назначении единого пособия.
ПодробнееВ России с 1 декабря 2025 года введена обязательная маркировка целого ряда
ПодробнееЭкономика сегодня
ЦБ установил официальные курсы валют на 4 сентября. Рубль падает ко всем основным зарубежным валютам....
Подробнее Российская валюта снижается ко всем основным мировым валютам. Официальный курс ...
Подробнее 💸 Ежедневный совет Банки — короткий и полезный совет, который помогает управлять деньгами осознанно. Подготовка к школе всегда...
Подробнее Спрос на страховые полисы на случай онкологических заболеваний за год вырос на 40%. Об этом сообщил «Росгосстрах», проанализировав темпы роста продаж полисов данного сегмента. Больше всего спрос увеличился...
Подробнее 💸 Ежедневный совет от Банки — просто о том, как повысить эффективность сбережений. Если вы вносите на счет крупные суммы наличными,...
Подробнее Российская валюта подешевела к доллару, евро и юаню. Официальный курс доллара, установленный Центробанком на 30 августа 2025 года, составляет 80,3316 рубля (прежнее значение — 80,2918 рубля), официальный...
Подробнее



Комментарии (0)