Основная информация
Внимание! Это коммерческий проект, поэтому программный код лежит в приватном репозитории. У Вас есть возможность ознакомиться с ним непосредственно при встрече.
Самый сложный и крупный из всех проектов, которыми я когда-либо занимался. Если конвертировать затраченное на разработку время в среднее рабочее, ушло примерно 4-5 месяцев. При этом в ходе разработки были освоены Node.js и Socket.io, а также множество сопутствующих библиотек.
Архитектура приложения разбита на 2 части: одна на PHP, другая на Node.js. PHP отвечает за построение основного контента и реализует API для AJAX-запросов, которые не требуют Real-Time. Node.js отвечает за своевременное обновление и передачу свежих данных всем пользователям сайта. К таким данным относятся:
- Формирование ленты с последним дропом в шапке сайта.
- Формирование списка последних выведенных предметов.
- Построение рейтинга игроков: обновление позиций и статистических показателей.
- Ведение глобальной статистики (количество открытых кейсов, выведенных предметов, зарегистрированных пользователей и текущий онлайн).
- Появление нового дропа в инвентаре пользователя.
- Обслуживание вывода предметов.
- Обновление карточки с лучшим дропом за последний час.
Чтобы обеспечить стрессоустойчивость сервера на Node.js и уменьшить нагрузку на базу данных, было решено передавать свежие данные раз в 5-15 секунд, растягивая на это время их появление на сайте. Таким образом для пользователей сохраняется визуальная непрерывность. В случае падения Node.js сервера данные не пропадают с сайта, поскольку ранее происходило их периодическое сохранение в базу, а многие задачи по обновлению данных на себя перенимает PHP.
Для удобства работы со временем и поддержки пользователей из разных часовых поясов используется библиотека Moment.js. Она предоставляет множество функций для анализа и обработки дат. Единственная проблема, с которой данная библиотека не может справиться, это когда у пользователя указано неверное время. При это теряется синхронизация времени, что вызывает незначительные баги при работе с сайтом.
При разработке JS-библиотек было решено следовать модульному подходу. За сборку компонентов и валидацию кода отвечает Babelify и Browserify в GULP. Сложнее всего было научить свежую версию GULP'а собирать несколько отдельных пакетов модулей и строить по ним карту.
В данном проекте было разработано так много компонентов и функций, что рассказывать о них можно сутками. Если Вас интересуют подробности и детали, свяжитесь со мной.