This post is also available in: Английский
- ограничение количества одновременных просмотров с одного аккаунта (Вы же не хотите, чтобы под одним аккаунтом смотрели видео все знакомые одного счастливого покупателя? Точнее, пусть смотрят, но хотя бы по очереди, а не одновременно ),
- запрет на просмотр любого видео для пользователей, получивших абонемент на просмотр по ошибке или вследствие некой махинации,
- оценка качества и популярности видео,
- возврат в точку, где просмотр был прерван (с любого устройства),
- и последнее в списке, но отнюдь не по важности – обеспечение удобства для пользователя.
Разумеется, не стоит забывать, что каждый видеопортал имеет свои специфичные задачи, которые немыслимы без сведений о просмотрах. В этой статье мы обсудим особенности реализации такого сервиса.
В первом приближении задача выглядит не очень сложной, пока не столкнешься с тем, что ряд мобильных платформ не поддерживает Adobe Flash и плеер реализуется посредством HTML5. Также бывает, что устройство не поддерживает сокетные соединения и единственная возможность передачи данных к сервису аналитики – это HTTP GET или POST запросы (например, в некоторых Smart TV платформах). Это может приводить к серьезной нагрузке на сервер. Поддерживать весь этот «зоопарк» становится непростой задачей.
Для решения всех этих задач компанией DENIVIP Media был разработан сервис видеоаналитики на базе таких технологий как Node.js, MongoDB, Redis, WebSocket. Решение опубликовано на GitHub и доступно в виде облачного сервиса.
Данное решение является высокопроизводительным, распределенным и надежным. В его архитектуhe заложено горизонтальное масштабирование основных компонентов системы.
Возможности сервиса:
- Сбор статистики как посредством сокетных соединений, так и через HTTP-GET и HTTP-POST запросы
- Ведение полного лога просмотров
- Контроль количества открытых сессий просмотра с одного аккаунта
- Запрет просмотра с определенного аккаунта
- Получение информации о точке, в которой пользователь остановил просмотр фильма, что дает нам возможность услужливо продолжить показ с этого места, при следующем заходе пользователя
- Получение различной информации об открытых сессиях просмотра или сводной отчетности посредством HTTP API
- Управление сервисом из CMS (системы управления контентом)
Одновременная поддержка соединений через сокеты и обычные HTTP GET и POST запросы позволяет нам легко собирать статистику как из классического веб-браузера на ПК, так и из браузеров мобильных устройств и, что не маловажно, из мобильных приложений.
Сервис реализован как Open Source решение и доступен в нашем репозитории на GitHub. С hosted-версией сервиса Вы можете БЕСПЛАТНО ознакомиться уже сейчас. Просто свяжитесь с нами
Увидеть сервис в действии можно по адресу: http://217.65.3.254:83/index.html. Поскольку страница показывает возможности сервиса через WebSockets, при просмотре необходимо использовать браузеры, поддерживающие эту технологию, такие как Google Chrome или Mozilla Firefox. iPad и iPhone также отлично справятся с задачей.
На демонстрационной странице показан процесс сбора статистики (информация передается на сервер каждые 2 секунды), а также работа с API-интерфейсом сервиса. Вы можете увидеть количество открытых сессий пользователя, точку останова просмотра фильма, историю просмотров. Идентификатор пользователя передается в параметрах URL-запроса демонстрационной страницы. Дополнительное описание и структура работы приведена в wiki.
Технические подробности
Сервис может функционировать как в составе кластера, так и в единственном экземпляре. Каждая нода в кластере может состоять из нескольких процессов node.js. Балансировка между процессами node.js в кластере происходит на уровне ОС.
Каждый node.js процесс сервиса сбора статистики состоит из 4х подсистем:
- HTTP GET/POST — по умолчанию слушает 443 порт. POST — для устройств, которые поддерживают постоянные TCP соединения, и GET — для остальных устройств.
- WebSockets — по умолчанию слушает 80 порт.
- Flash Policy — по умолчанию слушает 843 порт. Также, через GET запрос /crossdomain.xml к HTTP серверу на 443 порт можно получить файл политик через Security.loadPolicyFile
- Command — сервер-подписчик канала Redis для рассылки команд каждому из экземпляров node.js
В качестве хранилища статистики выступает MongoDB.
Сервис разрабатывался и тестировался на node.js v0.8.2. Также необходимы следующие модули:
- log4js
- websocket
- mongodb
- redis
- underscore
- deteformat
Модули присутствуют в репозитарии вместе с проектом. Также необходима MongoDB 2.0.4+
Установка сервиса
- Забрать исходные коды сервиса с GitHub в соответствующую директорию
- Хотя все необходимые для работы сервиса модули уже собраны, возможно, потребуется их пересобрать посредством NPM. Для этого в директории проекта необходимо выполнить команду:
1npm install
список необходимых модулей указан в package.json и будет обработан автоматически при выполнении указанной выше команды. Модуль «hub» положен к остальным модулям для удобства доступа, не устанавливается через npm, не требует установки и сборки.
- Создать 2 БД в MongoDB: statslog и apiaggregates
- Создать в MySQL базу для выгрузки данных из MongoDB с соответствующими правами
- Настроить конфигурационные файлы
- Запустить сервис сбора статистики
1node stat/index.js
- Запустить сервис обработки запросов к API
1node api/index.js
Настройка сервиса
Конфигурирование сервиса происходит через файл config.js. В данном файле настраивается и часть сервиса, отвечающая за сбор информации (stat) и часть, отвечающая за обработку API вызовов (api).
Более подробно об опциях конфигурирования Вы можете узнать из документации к сервису на GitHub.
В качестве заключения …
В состав сервиса не входит система генерации отчетов. Ее возможно реализовать, используя расширение API, либо прямое обращение к аналитической базе под управлением СУБД MySQL. И тот, и другой варианты имеют свои плюсы и минусы. И, конечно, это тема для следующего разговора.
Не переключайтесь!