На настраиваемой главной странице нашего веб-сайта мы предлагаем пользователям возможность отображать модули, показывающие недавно обновленный контент, выбирая из более чем 100 модулей.
Все данные генерируются запросами MySQL, результаты которых кэшируются через memcached. Наша текущая система работает следующим образом: когда пользователь загружает страницу, содержащую модули, модуль, ему немедленно передаются данные из кеша, и запрос добавляется в очередь для обновления отдельным процессом Gearman (так что загрузка страницы не выполняется). не ждать запроса mysql). Затем этот запрос запускается каждые 15 минут для обновления данных в кеше. Сама очередь запросов периодически очищается, чтобы мы не обновляли данные, которые не запрашивались в последнее время.
Проблема в том, что делать, когда кеш по какой-то причине пуст. Это происходит не часто, но когда это происходит, пользователю в данный момент показывается пустой модуль, а данные обновляются в процессе gearman, так что чуть позже, когда тот же (или другой) пользователь перезагружает страницу, это данные для показа.
Наш трафик таков, что, если бы мы попытались выполнить запрос в режиме реального времени для пользователя, когда кэш пуст, у нас возникла бы серьезная проблема с паническим бегством — мы бы выполнили один и тот же (возможно, медленный) запрос много раз, как многие пользователи загружали страницу. Есть ли способ решить проблему «пустого модуля», не открывая риск панического бегства?