Проект «CSGOCases — Магазин кейсов CS:GO»

Проект «CSGOCases — Магазин кейсов CS:GO»

Веб-приложение с высокими требованиями к обеспечению Real-Time. Является коммерческим проектом с достаточно сложным стеком технологий.

Основная информация

Внимание! Это коммерческий проект, поэтому программный код лежит в приватном репозитории. У Вас есть возможность ознакомиться с ним непосредственно при встрече.

Самый сложный и крупный из всех проектов, которыми я когда-либо занимался. Если конвертировать затраченное на разработку время в среднее рабочее, ушло примерно 4-5 месяцев. При этом в ходе разработки были освоены Node.js и Socket.io, а также множество сопутствующих библиотек.

Архитектура приложения разбита на 2 части: одна на PHP, другая на Node.js. PHP отвечает за построение основного контента и реализует API для AJAX-запросов, которые не требуют Real-Time. Node.js отвечает за своевременное обновление и передачу свежих данных всем пользователям сайта. К таким данным относятся:

  1. Формирование ленты с последним дропом в шапке сайта.
  2. Формирование списка последних выведенных предметов.
  3. Построение рейтинга игроков: обновление позиций и статистических показателей.
  4. Ведение глобальной статистики (количество открытых кейсов, выведенных предметов, зарегистрированных пользователей и текущий онлайн).
  5. Появление нового дропа в инвентаре пользователя.
  6. Обслуживание вывода предметов.
  7. Обновление карточки с лучшим дропом за последний час.

Чтобы обеспечить стрессоустойчивость сервера на Node.js и уменьшить нагрузку на базу данных, было решено передавать свежие данные раз в 5-15 секунд, растягивая на это время их появление на сайте. Таким образом для пользователей сохраняется визуальная непрерывность. В случае падения Node.js сервера данные не пропадают с сайта, поскольку ранее происходило их периодическое сохранение в базу, а многие задачи по обновлению данных на себя перенимает PHP.

Для удобства работы со временем и поддержки пользователей из разных часовых поясов используется библиотека Moment.js. Она предоставляет множество функций для анализа и обработки дат. Единственная проблема, с которой данная библиотека не может справиться, это когда у пользователя указано неверное время. При это теряется синхронизация времени, что вызывает незначительные баги при работе с сайтом.

При разработке JS-библиотек было решено следовать модульному подходу. За сборку компонентов и валидацию кода отвечает Babelify и Browserify в GULP. Сложнее всего было научить свежую версию GULP'а собирать несколько отдельных пакетов модулей и строить по ним карту.

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

Наверх