Список «кто сейчас на сайте», обещанный в 2012 и уже работающий
25 августа 2012 года в этом блоге вышла запись о том, что поля статистики начали обновляться сами по себе, а закончилась она фразой: «Запланированная функция, список „Who is online“, появится совсем скоро!»
Та запись до сих пор здесь. Списку, о котором она объявляла, понадобилось четырнадцать лет. Теперь он есть, а счётчик, на который та запись ссылалась, всё это время работал.
Что он показывает
На странице статистики теперь есть живая панель: сколько человек находится на сайте прямо сейчас, а также список самых недавних из них — страна, откуда они подключились, город, если он известен, какая страница сайта у них открыта, и сколько времени прошло с момента, когда их видели в последний раз. По двенадцать за раз, сначала самые новые.
«Прямо сейчас» означает последние пять минут. Через час строки удаляются полностью.
Чего не означает «who»
Никто в этом списке не идентифицируется. Он строится на основе того же 16-байтового ежедневного хеша, который описан в статье о подсчёте без cookie, — ни за одной строкой в нём не стоит ни имени, ни аккаунта, ни cookie, ни сохранённого IP-адреса.
Также сохраняется только путь страницы, а не весь адрес целиком: /shop/boots, а не полная ссылка со всем, что к ней могла добавить поисковая система или рассылка.
И два человека из одного города, смотрящих одну и ту же страницу, — это просто две строки. Ничто в системе не может сказать, два ли это читателя или один читатель с телефона и с ноутбука. Это не недоработка, которую нужно когда-нибудь исправить в новой версии. Это осознанное решение, и это тот же компромисс, на который счётчик идёт везде: достаточно, чтобы быть полезным, но не настолько, чтобы следить за кем-то.
Реальное время без постоянного соединения
Современный способ сделать это — WebSocket или server-sent events: браузер держит одно соединение открытым, а сервер проталкивает через него обновления по мере их появления. Это изящное решение, и здесь оно было бы неверным.
Веб-сервер этого сайта использует один процесс на каждое открытое соединение, а его настоящая работа — отвечать на запросы счётчиков для пары тысяч сайтов. Соединение, удерживаемое открытым, — это процесс, который не может ответить никому другому. Пятьдесят человек, следящих за своей живой страницей, означали бы пятьдесят простаивающих процессов, ожидающих момента, чтобы доставить число, которое меняется раз в несколько минут.
Поэтому вместо этого страница сама спрашивает — раз в пятнадцать секунд — и получает небольшой блок JSON. Вокруг этого стоят три решения, которые важнее, чем сам интервал:
- Если запросы начинают завершаться ошибкой, частота снижается до одного раза в минуту — вместо того чтобы долбить сервер, которому и так, судя по всему, уже нелегко.
- В фоновой вкладке запросы прекращаются полностью и возобновляются сразу, как только вкладка снова становится активной. Никто не смотрит на скрытую вкладку, а запрос стоил бы ровно столько же, сколько и полезный.
- Строка updated N seconds ago считает вверх локально, раз в секунду, и не стоит вообще ничего. Запрос нужен только для того, чтобы изменить данные, а не для того, чтобы состарить их.
Ничего умного здесь нет. Это соразмерно — а на маленьком сервере это более ценное из двух качеств. Живое представление не должно стоить дороже в работе, чем то, за чем оно наблюдает.
Часть, которая не вернулась
В сентябре 2015 года вышла статья о том, как вкладка Users научилась отличать человека, активно читающего страницу, от того, кто открыл её в фоновой вкладке и забыл о её существовании.
Это различие пока не вернулось. Текущий список знает, когда посетителя видели в последний раз, но не знает, смотрит ли он на страницу. Это по-настоящему стоит знать — изрядная доля «посетителей» любого сайта на самом деле являются забытой вкладкой, — так что это в списке того, что предстоит сделать.
Надеюсь, не ещё четырнадцать лет.
Живой пример
Запись 2012 года заканчивалась ссылкой на живой пример, и это, похоже, правильный способ закончить и эту статью. Та исходная ссылка, кстати, до сих пор работает: счётчик за ней всё это время не останавливался и уже перевалил за 1,3 миллиона визитов.
Вот живой пример — смотреть можно без аккаунта.