Оливет Битти, глава технического департамента британского необанка 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 — это бесплатно распространяемые системы с открытым исходным кодом. Может быть, архитектурные перемены в банке — это не так уж и дорого?
Лучшие новости сегодня
Вы искали сегодня
Другие новости сегодня
Президент России Владимир Путин во время "Итогов года" рассказал о значительном росте налогов в новых регионах России. Это связано, прежде всего, с увеличением налогооблагаемой базы и восстановлением предприятий...
Минфин России в рамках поручения президента РФ Владимира Путина, которое было сделано на совмещенной прямой линии и пресс-конференции, изменит правила "Семейной ипотеки", чтобы убрать из программы механизм...
Центробанк России объявил официальный курс доллара США на завтра, 20.12.2024. Курс составит 103,4207 руб. Таким образом, курс доллара США повысился на 64,4 коп. по сравнению с сегодняшним курсом. Официальный...
Право на такую дифференциацию предусмотрено НК, но не установлено деталей. Так что Минфин не против различных ставок по месяцам. Минфин напомнил, что законом 176-ФЗ был введен туристический налог. Налоговые...
Быстрее всего в 2024 году зарплаты росли у водителей, сварщиков и промоутеров. За уходящий год предлагаемые в РФ зарплаты увеличились на четверть — с 58 тыс. в 2023 году до 71,8 тыс. рублей в текущем году,...
Центральный Банк готов рассмотреть вопрос введения тестирования на предмет финансовой грамотности для тех, кто хочет взять ипотеку. Такая информация содержится в ответе регулятора на письмо замруководителя думской...
«Наши задачи» - предоставлять самую оперативную, достоверную и подробную информацию по банковскому рынку; - помогать клиентам в выборе самых выгодных банковских продуктов; - способствовать банкам в поиске качественных клиентов; - налаживать общение между банками и их клиентами.
Казахстанскую продукцию планируют продвигать в торговой сети Grandiose в
ПодробнееЗа первое полугодие 2024 года Мангистау посетили около 250 тыс. туристов из
ПодробнееВице-министр сельского хозяйства Амангалий Бердалин посетил порт Саржа в
ПодробнееПрезидент России Владимир Путин во время "Итогов года" рассказал о значительном
ПодробнееМинфин России в рамках поручения президента РФ Владимира Путина, которое было
ПодробнееЦентробанк России объявил официальный курс доллара США на завтра, 20.12.2024.
ПодробнееЭкономика сегодня
ЦБ установил официальные курсы валют на 18 декабря. Рубль прекратил рост к американской валюте, однако продолжил укрепляться к евро. Курс доллара вырос на 0,0854 рубля, составив 102,9979 рубля (102,9125...
Подробнее Система гарантирования вводится в сегменте страхования жизни. Механизм защиты будет аналогичен действующим системам страхования вкладов в банках и накоплений в негосударственных пенсионных фондах и начнет действовать...
Подробнее Российская валюта укрепилась к доллару и евро. Официальный курс доллара, установленный Центробанком на 18 декабря 2024 года, составляет 102,9979 рубля (прежнее значение ...
Подробнее Аналитики повысили прогноз по средней ключевой ставке Банка России на 2024 год с 17,3% до 17,5%, показал макроэкономический опрос ЦБ...
Подробнее На торгах 11 декабря доллар, евро и юань стремительно взлетели к рублю. Китайская валюта по итогам сессии прибавила около 4,5%, превысив отметку 14,7 рубля. На внебиржевых торгах доллар укрепился более чем на 4 рубля, поднявшись почти до 107 рублей. Евро вырос на сопоставимую величину, пробив
Подробнее Центробанк установил официальные курсы доллара и евро на 12 декабря. Рубль ускорил падение к американской и европейской валютам.
Подробнее
Комментарии (0)