Comments 23
UFO just landed and posted this here
UFO just landed and posted this here
В топике тоже упоминается вариант с блокировками. И даже написано, что это «правильный подход».
0
Мне ваш дисклеймер понравился, нужно добавить себе это в резюме :).
+10
Есть и другой вариант — начиная с определенного времени (например за 10 сек до протухания) — отдать одному клиенту miss и поставить флаг что начато перестроение ключа. А остальным клиентам в течение 10 секунд отдавать старую версию, в надежде что за это время значение будет перестроено тем первым
0
Интересная идея, спасибо вам за нее.
Правда у нас кеш не протухает, а перетирается обновлениями. те мы проблему решили железом — больше мемкешей, меньше вытеснения и неограниченное время жизни. В нашем случае еще меньше обращений к бд (по сути только запись) и еще меньше время ответа
Правда у нас кеш не протухает, а перетирается обновлениями. те мы проблему решили железом — больше мемкешей, меньше вытеснения и неограниченное время жизни. В нашем случае еще меньше обращений к бд (по сути только запись) и еще меньше время ответа
0
а патч автопролонгейт не пробовали?
очень помогает во многих случаях
очень помогает во многих случаях
0
Не вижу в нем смысла. Инвалидация кеша должна происходить по изменению сущностей, а не по времени. А наименее запрашиваемые объекты мемкеш и так вытеснит. Я не утверждаю, что инвалидация по времени — зло. Но в абсолютном большинстве случаев она порождает нарушение целостности данных
0
а можно подробнее, почему приведенный первый график описывает именно ту самую проблему одновременного доступа к кешу? казалось бы, трафик вырос — и число соединений тоже.
+1
Проблему одновременного перестроения кеша описывают «маленькие красные горбики», которые после применения патча исчезли.
+1
writing из nginx_stub_status? в том смысле, что за мгновения до «горбиков» все лочили друг друга, а потом разом отдали? имхо с натяжкой, writing может скакать по куче других причин, а вот если бы вы привели одновременно latency и cpu usage — можно было бы смотреть предметнее.
0
Идея отличная. Рализация отвратительная, на двойку — для применения этого подхода надо не патчить APC (happy debugging, bitches), а реализовать функционал на уровне приложения. У вас же в приложении есть какой-нибудь MyFramework_Cache, вот туда и вписывайте.
+2
Лучшим вариантом решения было бы обновлять данные в кэше в фоне. Например, видим что данные устарели, отдаём клиенту быстро старые данные (мгновенное), и не задерживая посетителя, начинаем в фоне ложить в кэш новые данные (конечно запуская эту процедуру только один раз, продолжая другим посетителям отдавать старые данные до завершения операции обновления).
Вопрос — как это лучше сделать, какие есть варианты?
Вопрос — как это лучше сделать, какие есть варианты?
0
Может быть научить кеш общаться с какой-нить очередью и при протухании кеша добавлять туда job?
0
Ну так и делать, сам же всё описал. У нас например вот так:
$value = PersistentCache::getInstance(cache_key, time = 60, callback, callback_params)->getValue();
Внутри когда начинает подходить время отдаем старое значение, ставим флаг о начале перегенерации и запускаем её по окончанию генерации страницы.
$value = PersistentCache::getInstance(cache_key, time = 60, callback, callback_params)->getValue();
Внутри когда начинает подходить время отдаем старое значение, ставим флаг о начале перегенерации и запускаем её по окончанию генерации страницы.
0
Вот о последней строчке поподробней пожайлуста.
Обязательно для этого использовать php_fpm? Используется какая-нибудь ещё очередь сообщений?
Обязательно для этого использовать php_fpm? Используется какая-нибудь ещё очередь сообщений?
0
Sign up to leave a comment.
Articles
Change theme settings
Борьба с одновременным перестроением кеша с помощью RED