Stampede в Redis на списке с тремя локалями
После деплоя двадцать PHP-воркеров пересобрали один и тот же список заметок трижды. Redis заполнился и начал вытеснять ключи, которые только что записали.
Заметки о решениях, коде и компромиссах. Пишу их, пока задача ещё свежая.
После деплоя двадцать PHP-воркеров пересобрали один и тот же список заметок трижды. Redis заполнился и начал вытеснять ключи, которые только что записали.
Процесс Vue SSR кэшировал целый HTML в Memcached. Большие страницы статей заняли память толстыми слабами. Мелким фрагментам плиток негде было жить, hit rate падал при высоком RSS.
Эндпоинты списка брали строку заметки целиком. Колонка body это JSON с HTML на английском, русском и немецком. Buffer pool забился текстом, который сетка не рендерит.
Микрокэш HTML на 10 секунд в shared memory дёшев. Он же ломается, как только на запросе есть auth_token. Обход по cookie, не по догадке.
Сервер взял русский из URL. Первый клиентский проход прочитал navigator.language. Vue выбросил дерево. Страница работала, баг прятался до прыжка шапки.
Sanctum пишет auth_token как httpOnly. В JSON логина нет поля token. Если страница читает сессию, XSS её унесёт.
LaraBoom держит ресурс, поля и Service рядом. Host routes и app/Http это папки, которые я не создаю.
Воркер может умереть после вызова провайдера и до коммита. Redis отдаст job снова. Второй запуск должен быть пустым.
memory_get_usage() в конце запроса падал. Хост всё равно рос. Copy-on-write делал общие страницы OPcache частным RSS после гидрации Eloquent.
GIN на payload выглядит полным. WHERE title->>'ru' всё равно идёт seq scan. Containment и extract это разные работы.
Redis-транспорт отдаёт сообщение после падения снова. У Horizon то же правило. Ack после вызова провайдера это второй платёж.
Compose ждёт, пока php-fpm слушает. Kubelet убивает под, который ещё компилирует OPcache. Readiness и liveness это разные ручки.
Публичный сайт это Vue SSR. CMS часто React. Один webpack-граф везёт оба. TTI каталога платит за редактор.
Laravel владеет /api/login и httpOnly auth_token. Nest мапит DTO. Второй JWT в памяти это вторая личность.