Список «хто зараз на сайті», обіцяний у 2012 і вже працює
25 серпня 2012 року допис у цьому блозі повідомив, що поля статистики почали оновлюватися самостійно, і завершувався реченням: «Незабаром з'явиться запланована функція — список „Хто зараз онлайн“!»
Той допис і досі тут. Спискові, про який він оголошував, знадобилося чотирнадцять років. Тепер він є, а лічильник, на який той допис посилався, увесь цей час працював.
Що він показує
На сторінці статистики є панель у реальному часі: скільки людей перебуває на сайті просто зараз, і список найновіших із них — країна, звідки вони підключилися, місто, якщо воно відоме, яка сторінка сайту в них відкрита, і скільки часу тому їх бачили востаннє. По дванадцять за раз, спочатку найновіші.
«Просто зараз» означає останні п'ять хвилин. Через годину рядки видаляються повністю.
Що не означає «хто»
У цьому списку нікого не ідентифікують. Він побудований на тому самому щоденному 16-байтовому хеші, описаному в дописі про підрахунок без cookie-файлу — за жодним рядком не стоїть ні імені, ні облікового запису, ні cookie-файлу, ні збереженої IP-адреси.
Також він зберігає лише шлях сторінки, а не повну адресу: /shop/boots, а не повне посилання з усім, що пошукова система чи розсилка додали в кінець.
А двоє людей з одного міста, які дивляться на ту саму сторінку, — це просто два рядки. Ніщо в системі не може сказати, чи це два читачі, чи один читач з телефону й ноутбука. Це не недогляд, який чекає на виправлення в наступній версії. Це закладено в задум, і це той самий компроміс, який лічильник робить усюди: достатньо, щоб бути корисним, і недостатньо, щоб за кимось стежити.
Реальний час без утримання з'єднання відкритим
Сучасний спосіб реалізувати таке — WebSocket або server-sent events: браузер утримує одне з'єднання відкритим, а сервер надсилає через нього оновлення в міру їх появи. Це елегантна відповідь, і тут вона була б неправильною.
Вебсервер цього сайту використовує один процес на кожне відкрите з'єднання, а його справжня робота — відповідати на запити лічильників для кількох тисяч сайтів. Відкрите з'єднання — це процес, який не може відповісти більше нікому. П'ятдесят людей, які дивляться на свою сторінку в реальному часі, означали б п'ятдесят процесів, що простоюють в очікуванні, доки треба буде видати число, яке змінюється раз на кілька хвилин.
Тож замість цього сторінка сама запитує — раз на п'ятнадцять секунд — і отримує невеликий блок JSON. Навколо цього є три рішення, які важливіші за сам інтервал:
- Якщо запити починають завершуватися невдало, частота падає до одного разу на хвилину — замість того, щоб бомбардувати сервер, якому й так явно непросто.
- У фоновій вкладці запити припиняються повністю, і відновлюються тієї ж миті, коли вкладка знову стає активною. Приховану вкладку ніхто не дивиться, а запит коштував би стільки ж, скільки й корисний.
- Рядок updated N seconds ago рахує локально, раз на секунду, і не коштує нічого. Запит потрібен лише для того, щоб змінити дані, а не для того, щоб їх «зістарити».
У цьому немає нічого хитромудрого. Це пропорційно, а на невеликому сервері саме ця властивість цінніша за хитромудрість. Перегляд у реальному часі не повинен коштувати дорожче, ніж те, за чим він спостерігає.
Одна частина, яка не повернулася
У вересні 2015 року був допис про те, як вкладка Users навчилася відрізняти людину, яка активно читає сторінку, від тієї, хто відкрив її у фоновій вкладці й забув про її існування.
Ця відмінність не повернулася. Поточний список знає, коли відвідувача бачили востаннє; він не знає, чи дивиться ця людина на сторінку. Знати це справді варто — чимала частка «відвідувачів» будь-якого сайту — це покинута вкладка, — тож це в списку того, що ще належить побудувати.
Сподіваємося, не ще чотирнадцять років.
Живий приклад
Допис 2012 року завершувався посиланням на живий приклад, і це, схоже, правильний спосіб завершити і цей допис. До речі, те початкове посилання досі відкривається: лічильник за ним працював увесь цей час і вже перетнув позначку 1,3 мільйона візитів.
Ось живий приклад — щоб подивитися, обліковий запис не потрібен.