Перейти к содержимому
← Все работы

AuraFlix

Бэкенд для стриминга, где интересны две задачи: запустить воспроизведение быстро и считать просмотры, не записывая в Postgres при каждом включении.

Начать воспроизведение до того, как файл доехал

Отдать видео одним ответом — значит заставить зрителя ждать весь файл целиком. Решение — HTTP range requests: плеер запрашивает диапазон байтов, сервер возвращает этот кусок с кодом 206, и воспроизведение начинается с первого чанка, пока остальное догружается следом. Перемотка работает по той же причине: плеер может сразу прыгнуть на нужный диапазон.

Воспроизведение стартует за секунду-две — а это то самое число, от которого зависит, останется человек или уйдёт.

Считать просмотры, не долбя базу

Счётчик просмотров — обманчиво дорогая функция. В наивной реализации каждый просмотр превращается в запись в Postgres, и самое популярное видео создаёт максимальную конкуренцию за одну строку ровно в тот момент, когда система загружена сильнее всего.

Поэтому счётчики идут в Redis прямо на пути запроса, а фоновый воркер сбрасывает их в Postgres пачками. Postgres видит периодическое батчевое обновление вместо записи на каждый просмотр. Счётчик становится eventually consistent — для счётчика просмотров это верный размен, а не компромисс.

Схема

Модели SQLAlchemy 2 с миграциями Alembic и написанный руками SQL там, где ORM выдавала запрос хуже того, который я написал бы напрямую.

AuraFlix — Salohiddin Yo'ldoshev