Авторизация
Сброс пароля
Разработка highload-сервиса для обработки 100 тысяч событий в секунду для СберМаркетинга
Заказчик: СберМаркетинг
Страница кейса/результат: https://evrone.ru/portfolio/sbermarketing

Evrone разработала для СберМаркетинга высоконагруженный сервис обработки и обогащения событий с производительностью не менее 100 тысяч запросов в секунду. Решение на Python и Granian использует Data Lake для временного хранения данных без потери событий.
1. Вводная задача от заказчика, проблематика, цели
СберМаркетинг обратился к нам с готовым техническим заданием на разработку сервиса для приема, первичной обработки и временного хранения обезличенных пользовательских событий. Решение должно было стать частью платформы веб-аналитики и обеспечить надежную передачу обогащенных данных в систему долгосрочного хранения.
Перед нашей командой стояли несколько ключевых задач:
- Создать сервис, способный стабильно обрабатывать не менее 100 тысяч запросов в секунду.
- Обеспечить прием и обработку событий с разным набором исходных данных.
- Привести поступающие события к единому и максимально полному формату за счет обогащения данных.
- Организовать временное хранение больших объемов потоковых данных перед их передачей в архив.
- Исключить потерю событий и даже отдельных частей данных на всех этапах обработки.
- Сохранить возможность дальнейшего развития решения силами Python-разработчиков, которые уже работали в команде заказчика.
Для нас главным вызовом стала необходимость одновременно обеспечить экстремально высокую производительность, надежность обработки и практичность дальнейшей эксплуатации. Мы должны были не просто добиться нужного количества запросов в секунду, а создать технологически обоснованное решение, которое СберМаркетинг сможет поддерживать и развивать в долгосрочной перспективе.
2. Описание реализации кейса и творческого пути по поиску оптимального решения
Мы начали проект с анализа требований к производительности и технологическому стеку. СберМаркетинг рассматривал Go как один из возможных вариантов, поскольку этот язык хорошо подходит для высоконагруженных микросервисов. При этом основной стек команды заказчика был построен вокруг Python, поэтому мы решили проверить, сможет ли Python обеспечить необходимую производительность при использовании подходящего высокопроизводительного runtime.
Мы провели серию экспериментов и сравнили несколько технологических подходов:
- Мы подготовили четыре тестовых сервиса на Go, Python, Python с Granian и Rust.
- Мы развернули тестовый стенд в Kubernetes и автоматизировали инфраструктуру с помощью Terraform.
- Мы подготовили Docker-образы для каждого варианта.
- Мы использовали Locust для нагрузочного тестирования.
- Мы постепенно увеличивали нагрузку и фиксировали промежуточные показатели производительности.
- Мы сравнивали результаты на одном ядре, чтобы получить объективную картину эффективности каждого подхода.
Тестирование показало, что Go достигал около 5,7 тысячи RPS на одном ядре, а связка Python и Granian — около 5,5 тысячи RPS. Результаты подтвердили нашу гипотезу: при грамотном выборе инструментов Python можно адаптировать для решения задач Big Data и высоконагруженной обработки событий без необходимости полностью менять технологический стек.
Rust показал наиболее высокую производительность — около 14 тысяч RPS на одном ядре. Однако мы учитывали не только технические показатели. Мы оценивали доступность специалистов, стоимость разработки и перспективы дальнейшей поддержки проекта. В результате Rust оказался менее практичным выбором для долгосрочного развития решения.
Мы остановились на связке Python и Granian. Granian, реализованный на Rust, обеспечил необходимую производительность, а Python позволил сохранить привычный для команды заказчика стек и быстро реализовать бизнес-логику.
Отдельное внимание мы уделили надежности хранения данных. Сервис должен был временно аккумулировать большие объемы потоковых событий и гарантировать их сохранность. Поэтому мы использовали acknowledge-подход с подтверждением доставки данных между компонентами системы и применили концепцию write-ahead log, которая позволяет фиксировать изменения до их записи в основное хранилище.
Для организации Data Lake мы выбрали Tarantool — in-memory платформу с гибкой схемой данных. Поскольку необходимые для проекта возможности были доступны в enterprise-версии, которую мы не могли полноценно протестировать, наша команда адаптировала community edition под требования проекта.
Мы также столкнулись с отсутствием готового Kubernetes-оператора для кластерного развертывания Tarantool. Мы самостоятельно проработали архитектуру кластеризации и даже консультировались с создателем платформы. В результате нам удалось собрать кластер, который обеспечивал необходимые для проекта функции и соответствовал требованиям к надежности.
3. Результаты сотрудничества
Мы предоставили СберМаркетингу результаты сравнительного тестирования четырех технологических подходов и вместе с командой заказчика выбрали оптимальную архитектуру. В качестве основы проекта мы использовали Python и Granian, что позволило совместить высокую производительность с привычным для заказчика стеком разработки.
Evrone завершила разработку высоконагруженного сервиса и передала решение команде СберМаркетинга. Мы реализовали систему, рассчитанную на обработку не менее 100 тысяч запросов в секунду, с механизмами обогащения и временного хранения поступающих событий.
В рамках проекта мы:
- создали сервис обработки потоковых данных на Python и Granian;
- реализовали Data Lake для временного хранения и дальнейшего обогащения событий;
- обеспечили надежную передачу данных между компонентами системы;
- применили механизмы подтверждения доставки и подход write-ahead log;
- адаптировали Tarantool community edition под требования проекта;
- решили задачу кластерного развертывания Tarantool в Kubernetes;
- провели unit-, нагрузочное, security- и автоматизированное тестирование компонентов;
- подготовили необходимую техническую документацию.
В результате СберМаркетинг получил производительное и масштабируемое решение, которое может поддерживаться существующими Python-разработчиками компании. Нам удалось избежать избыточного усложнения архитектуры и при этом обеспечить производительность, необходимую для обработки больших потоков событий.
4. Заключение
Этот проект показал, что при разработке highload-систем важно оценивать технологический стек не только по максимальным показателям производительности. Мы учитывали весь жизненный цикл продукта: от скорости обработки данных и надежности архитектуры до доступности специалистов и возможностей дальнейшего развития.
Evrone провела практическое сравнение Go, Python, Python с Granian и Rust и на основе реальных нагрузочных тестов помогла СберМаркетингу выбрать наиболее сбалансированный вариант. Мы сохранили Python как основной язык разработки, усилив его производительность с помощью Granian, реализованного на Rust.
В результате мы создали надежную инфраструктурную основу для обработки больших объемов событий и формирования Data Lake, которая соответствует требованиям высоконагруженной аналитической платформы и при этом остается понятной и поддерживаемой для команды заказчика.
Для Evrone этот кейс стал примером того, как инженерный подход, тестирование технологических гипотез и внимание к требованиям бизнеса позволяют находить оптимальные решения даже для систем с экстремальными нагрузками.


