Сельдерей В Загруженных Проектах: Немного Практики

В преддверии московской Python Conf++ мы кратко поговорили с Олегом Чуркиным, техническим руководителем финтех-стартапа, о его обширном опыте работы с Celery: полмиллиона фоновых задач, ошибок и тестирования.



Сельдерей в загруженных проектах: немного практики

— Расскажите подробнее о проекте, над которым вы сейчас работаете? Сейчас я управляю финтех-стартапом.

Статусмани , который анализирует финансовые данные пользователей и позволяет клиентам сравнивать свои доходы и расходы с другими группами людей, устанавливать лимиты расходов и наблюдать, как растет или падает благосостояние на графиках.

На данный момент проект ориентирован только на рынок Северной Америки.

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

Сейчас у нас около 200 тысяч пользователей и 1,5 терабайта различных финансовых данных от наших поставщиков.

Только там совершается около 100 миллионов транзакций.

— Каков стек технологий? В стек текущего проекта входят Python 3.6, Django/Celery и Amazon Web Services. Мы активно используем RDS и Aurora для хранения реляционных данных, ElasticCache для кэша и очередей сообщений, CloudWatch, Prometheus и Grafana для оповещений и мониторинга.

И, конечно же, S3 для хранения файлов.

Также мы очень активно используем Celery для различных бизнес-задач: отправка уведомлений и массовых рассылок, массовое обновление различных данных от внешних сервисов, асинхронное API и тому подобное.

Во фронтенде у нас есть React, Redux и TypeScript. — Каков основной характер нагрузок в вашем проекте и как вы с ними справляетесь? ты справляешься? Основная нагрузка в проекте приходится на фоновые задачи, выполняемые Celery. Ежедневно мы выполняем около полумиллиона различных задач, например, обновление и обработку (ETL) финансовых данных пользователей из различных банков, кредитных бюро и инвестиционных организаций.

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

Мы также реализуем асинхронный API, который «объединяет» результаты из внешних источников, а также генерирует множество задач.

На данный момент после настройки инфраструктуры и Celery справляемся без проблем, но всякое бывало и раньше, об этом я обязательно расскажу в своем отчете.

— Как вы все это масштабируете и обеспечиваете отказоустойчивость? Для масштабирования мы используем Auto Scaling Groups — набор инструментов, предоставляемый нашей облачной платформой AWS. Django и Celery хорошо масштабируются по горизонтали, мы лишь немного скорректировали ограничения на максимальный объем памяти, используемый uWSGI/Celery. - Чем вы мониторите? Для мониторинга использования процессора/памяти и доступности самих систем мы используем Cloud Watch в AWS, агрегируем различные показатели из приложения и от работников Celery, использующих Prometheus, а также строим графики и отправляем оповещения в Grafana. Для некоторых данных в Grafana в качестве источника мы используем ELK. — Вы упомянули асинхронный API. Расскажите мне немного больше о том, как это работает для вас согласованный Наши пользователи имеют возможность «привязать» свой банковский (или любой другой финансовый) счет и предоставить нам доступ ко всем своим транзакциям.

Мы динамически отображаем процесс «привязки» и обработки транзакций на сайте; для этого используется обычное пулирование текущих результатов с бэкенда, а бэкенд берет данные, запуская ETL-конвейер из нескольких повторяющихся задач.

— Сельдерей — продукт с противоречивой репутацией.

Как ты живешь с ним? По моим ощущениям, наши отношения с Celery сейчас на стадии «Приемки» — мы разобрались с тем, как работает фреймворк внутри, подобрали под себя настройки, разобрались с деплоем, «наложили» мониторинг и написали несколько библиотек для автоматизации рутинных задач.

Нам не хватило функционала из коробки, поэтому мы добавили его сами.

К сожалению, на момент выбора технологического стека для проекта у Celery было не так много конкурентов, и если бы мы использовали более простые решения, нам пришлось бы добавить намного больше.

В четвертой версии Celery мы ни разу не столкнулись с какими-либо ошибками.

Большая часть проблем была связана либо с нашим непониманием того, как все это работает, либо со сторонними факторами.

О некоторых библиотеках, написанных в рамках нашего проекта, я расскажу в своем выступлении.

- Мой любимый вопрос.

Как вы тестируете всю эту музыку? Задачи Celery хорошо проверяются функциональными тестами.

Мы тестируем интеграцию с помощью автоматизированных тестов и ручного тестирования на стендах и постановках QA. На данный момент мы еще не решили пару вопросов с тестированием периодических задач: как разрешить тестировщикам их запускать и как проверить правильность расписания этих задач (соответствие требованиям)? — А как насчет фронтенд-тестов и верстки? Каково общее соотношение ручного и автоматическое тестирование? На фронтенде мы используем Jest и пишем только модульные тесты для бизнес-логики.

55% наших критических для бизнеса случаев сейчас покрываются автотестами на Selenium, на данный момент у нас около 600 тестов в TestRail и 3000 тестов на бэкенде.



Сельдерей в загруженных проектах: немного практики

— О чём будет ваш доклад на Moscow Python Conf++? В отчет Я подробно расскажу, для каких задач и как можно использовать Celery, и сравню с существующими конкурентами.

Опишу, как можно избежать различных ошибок при проектировании сложной системы с большим количеством задач: какие настройки следует указать сразу, а какие можно оставить на потом, как развернуть новую версию кода, чтобы не потерять задачи.

при переключении трафика поделюсь написанными библиотеками для мониторинга задач и очередей.

Также я затрону тему реализации ETL-конвейеров на Celery и отвечу, как их красиво описать, какую политику повторов использовать, как гранулярно ограничить количество выполняемых задач в условиях ограниченности ресурсов.

Плюс я опишу, какие инструменты мы используем для реализации пакетной обработки задач, которая экономно использует доступную память.

В общем, если вы жаждете подробностей по всем вышеперечисленным пунктам, приходите.

Надеюсь, мой отчет окажется для вас полезным и интересным.

Теги: #python #Высокая производительность #Анализ и проектирование систем #сельдерей #московский Python conf++

Вместе с данным постом часто просматривают: