005. Как аналитику сделать API для прода и не облажаться — Александр Кучин
By Яндекс Образование
Share:
Создание API для продакшена: Руководство для аналитиков
В данном выступлении Александр Кучин, руководитель аналитики в Skyeng, делится опытом создания API для продакшена аналитиками, акцентируя внимание на практических аспектах и избежании распространенных ошибок.
1. Введение и контекст
- Проблема: В Skyeng существовала проблема с разрозненностью данных и экспериментов между множеством команд, что приводило к пересечению выборок и неэффективной коммуникации.
- Решение: Была разработана платформа для экспериментов, которая унифицировала процессы и данные.
- Фокус доклада: Сегодняшняя тема — создание API, являющегося ключевым компонентом этой платформы, для интеграции с продакшен-сервисами. API позволяет передавать информацию о статусе пользователя (свободен/занят в эксперименте) в продакшен-системы, предотвращая пересечение пользователей в экспериментах.
2. Зачем аналитикам создавать API?
- Необходимость: Аналитикам часто требуется интегрировать свои модели (например, рекомендательные системы) или сложные отчеты с продакшен-сервисами для предоставления результатов в реальном времени.
- Примеры:
- Интеграция модели рекомендаций с продакшеном для выдачи результатов в реальном времени.
- Предоставление сложных аналитических отчетов в продакшен в реальном времени.
- Интеграция с внутренней платформой экспериментов для обеспечения взаимодействия с продакшен-сервисами.
- Общая черта: Все эти сценарии требуют обработки запросов в реальном времени, которые могут поступать как по одному, так и в тысячах экземпляров.
3. Создание простого API с помощью R
- Инструмент: Пакет
plumberв R Studio позволяет легко создавать API. - Процесс:
- Создание нового R-проекта.
- Написание кода с использованием специальных комментариев-аннотаций (
#*) перед функциями, которые будут являться эндпоинтами API. - Определение параметров эндпоинта (например,
user_id). - Запуск тестового API.
- Пример (упрощенный):
- Задача: Случайным образом разыгрывать приз среди миллиона пользователей ежедневно.
- Эндпоинт
/user: Принимаетuser_id, загружает всех пользователей, находит нужного и определяет, является ли он победителем. - Примечание: Автор признает, что данный пример неоптимален, так как можно было бы просто хранить победителя, а не перебирать всех пользователей. В реальной задаче Skyeng решалась проблема определения статуса пользователя (свободен/занят в эксперименте).
4. Развертывание API в Docker
- Проблема: API, запущенное в RStudio, доступно только пока RStudio запущено. Для продакшена требуется более надежное решение.
- Решение: Контейнеризация с помощью Docker.
- Docker: Позволяет упаковать все окружение (операционную систему, зависимости) в контейнер, который может быть запущен независимо от рабочей машины.
- Шаги по созданию Docker-образа:
- Создание скрипта для запуска API: Простой R-скрипт, который запускает API на определенном порту (например, 8700) с помощью
plumber. - Создание Dockerfile:
- Использование готового образа R (например,
rocker/r-ver). - Установка необходимых R-пакетов (например,
plumber,dplyr). - Копирование файлов проекта (скрипт API, данные) в контейнер.
- Открытие порта для доступа к API.
- Определение точки входа (команда для запуска скрипта API при старте контейнера).
- Использование готового образа R (например,
- Сборка Docker-образа: Команда
docker build. - Запуск Docker-контейнера: Команда
docker run.- Привязка томов (volumes): Позволяет монтировать файлы с хост-машины в контейнер (например, файл с данными пользователей), обеспечивая взаимодействие между контейнером и внешней средой.
- Проброс портов: Сопоставление порта внутри контейнера с портом на хост-машине.
- Создание скрипта для запуска API: Простой R-скрипт, который запускает API на определенном порту (например, 8700) с помощью
- Проверка: После запуска контейнера API доступно по указанному порту.
5. Оптимизация производительности API
- Проблема: Первоначальная версия API может работать медленно (например, более 1 секунды на запрос), что неприемлемо для продакшена.
- Этапы оптимизации:
- Оптимизация чтения данных:
- Вместо чтения всего большого DataFrame, читать только необходимые данные (например, данные конкретного пользователя).
- Использование функции
saveRDS()с параметромcompress = FALSEдля ускорения сохранения и чтения данных (хотя это увеличивает размер файла).
- Оптимизация поиска:
- Использование базового синтаксиса R для поиска может быть медленным.
- Применение пакета
data.tableдля более эффективного поиска по ключу. - Использование хэш-таблиц (реализованных через
new.env()в R) для поиска поuser_idс O(1) сложностью.
- Оптимизация чтения данных:
- Результат: Достижение времени ответа в пределах 200 миллисекунд.
6. Обработка нагрузки и масштабирование
- Проблема: Даже если один запрос выполняется быстро, большое количество одновременных запросов может привести к перегрузке.
- Инструмент: Пакет
locustдля нагрузочного тестирования.- Позволяет симулировать нагрузку и генерировать отчеты о производительности.
- Масштабирование:
- Балансировщик нагрузки (например, Nginx): При высокой нагрузке автоматически запускает дополнительные экземпляры контейнера с API. При снижении нагрузки — удаляет лишние экземпляры.
7. Безопасность и логирование
- Авторизация:
- Реализация через фильтры
plumber(например, проверка наличия токена в списке разрешенных). Фильтр может как пропускать запрос дальше, так и возвращать ошибку.
- Реализация через фильтры
- Логирование:
- Реализация через фильтры
plumber, которые записывают информацию о запросах в лог-файлы, не останавливая выполнение запроса. Это позволяет собирать статистику и анализировать обращения.
- Реализация через фильтры
8. Заключение и выводы
- Легкость создания: Создать базовое API для продакшена с помощью R и
plumberотносительно легко. - Сложность эффективности: Написать по-настоящему эффективный код, который будет быстрым, выдерживать нагрузку и иметь базовую безопасность, гораздо сложнее, особенно для аналитиков.
- Ключевые аспекты: Скорость ответа, устойчивость к нагрузке, безопасность и логирование.
- Рекомендация: Если есть возможность, лучше делегировать разработку API профессиональным разработчикам. Однако, для аналитиков, которым нужно быстрое решение, создание API своими силами с использованием готовых инструментов является жизнеспособным вариантом.
Вопросы и ответы
- Причина медленного API: Неоптимизированные DataFrame и медленный поиск.
- Websocket API: Автор не смог дать рекомендацию по пакетам для Websocket API, так как это выходит за рамки его опыта.
- Преимущества перед ClickSense/Power BI: API предназначено для внутренней интеграции с продакшен-системами, а не для создания отчетов, как BI-инструменты.
- Тестирование и вывод в продакшен: Процесс тестирования был длительным, включал взаимодействие с разработчиками, использование платформы для тестирования и автоматизированные тесты. API работает стабильно уже несколько месяцев.
- Время разработки аналитиком vs. разработчиком: Создание базового API аналитиком занимает меньше времени, чем оформление ТЗ для разработчика. Однако, создание эффективного API требует значительных усилий.
- Риски безопасности и нагрузки: Автор признает эти риски и подчеркивает важность их учета.
Key Concepts
- API (Application Programming Interface): Интерфейс, позволяющий различным программам взаимодействовать друг с другом.
- Plumber: R-пакет для создания API.
- Docker: Платформа для контейнеризации приложений.
- Dockerfile: Файл с инструкциями для сборки Docker-образа.
- Docker-образ: Шаблон для создания Docker-контейнера.
- Docker-контейнер: Изолированная среда для запуска приложения.
- Volumes (в Docker): Механизм для монтирования файлов и директорий между хост-системой и контейнером.
- Data.table: R-пакет для быстрой обработки данных.
- Hash Table (Хэш-таблица): Структура данных, обеспечивающая быстрый поиск по ключу.
- Load Testing (Нагрузочное тестирование): Процесс проверки производительности системы под высокой нагрузкой.
- Locust: Инструмент для нагрузочного тестирования.
- Load Balancer (Балансировщик нагрузки): Устройство или программа, распределяющая сетевой трафик между несколькими серверами.
- Authorization (Авторизация): Процесс проверки прав доступа пользователя к ресурсу.
- Logging (Логирование): Запись информации о событиях в системе.
Chat with this Video
AI-PoweredHi! I can answer questions about this video "005. Как аналитику сделать API для прода и не облажаться — Александр Кучин". What would you like to know?
Chat is based on the transcript of this video and may not be 100% accurate.