Pull to refresh

Умные сессии

Reading time 2 min
Views 3.7K
Решаем проблемы производительности.

Исходные данные.
Транслируем футбольные матчи через интернет. Посетителей: в обычные дни 5 000 — 10 000, в дни матчей 100 000 — 150 000.

В дата-центре
  • 5 веб-серверов с апачем и ПХП, наружу вывешены через аппаратный балансировщик загрузки
  • 2 пула мемкеша: для сессий и данных из веб-сервисов

Проблема
При большом наплыве посетителей происходит перегрузка локальной сети из-за большого количества обращений к мемкешу. Усугублящие факторы: 100Мбит сеть, оба пула на одних и тех же серверах.

Решения
  • Наращивание сети до 1Гбит после окончания серии матчей
  • Увеличение времени хранения кеша (как временная мера)
  • Использование технологии умных сессий

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

В чём суть технологии

  1. Мы не создаём сессию, если она реально не нужна.
  2. Мы не обновляем сессию в хранилище, если она не изменилась.

В самом деле, сайт у нас платный, даже если у нас 150 000 уникальных в сутки, то людей готовых заплатить реально мало. Посетители распределяются примерно следующим образом:
  • 70% — Зеваки. Открыли главную страницу, поняли что не то, что нужно, закрыли. То есть SЕО поработал хорошо, а нам разгребай.
  • 28% — Фанаты. Денег нет, но пользуются нашим сайтом, чтобы следить за информация по ходу матча (голы, замены). Обычно не регистрируются, ибо информация доступна и так.
  • 2% — Реально смотрят матчи, зарегистрировавшись и заплатив.


Реализация

Поскольку у нас используется мемкеш, то у нас уже есть объект Session, который перегружает стандартный функционал сессий и позволяет хранить последнии в мемкеше. Дополнительно мы делаем следующее:
  • Глобальный session_start() помещаем в if, чтобы сессия не создавалась, когда не просят.
    if(!empty($_COOKIE[ini_get('session.name')]))
    session_start();
  • В месте, где пользователя логиним добавляем старт сессии, ибо здесь уже надо:
    if(empty($_COOKIE[ini_get('session.name')]))
    session_start();
  • И наконец в нашем объекте создаём дополнительную статическую переменую, где храним содержимое сессии при чтении, а при записи делаем следующую проверку в самом начале:
    if(self::$data !== null && self::$data == $currentData)
    return strlen($currentData);


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

Коментарии приветствуются.

UPD: Суть поста показать не какой я крутой, а в том, что в ПХП есть мелочи настолько обыденные, что мы перестаём обращать на них внимание, а ведь иногда они не слишком продуманы и оказывают влияние на производительность.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+29
Comments 70
Comments Comments 70

Articles