Как заставить несколько параллельных PHP запросов ждать обновления кэша? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть стандартный сценарий, когда у вас есть несколько параллельных запросов, пытающихся получить доступ к одному и тому же ключу в кэше на основе Redis.

Когда срок действия этого ключа истек, запрашивающий процесс уведомляет какого-то внешнего работника о том, что его необходимо пересчитать (возможно, этот работник находится на другом сервере). Работник пересчитывает его и обновляет кеш.

Когда кеш горячий, все в порядке, потому что я могу продолжать обслуживать устаревшие данные из кеша, пока новое значение не будет пересчитано.

Проблема в том, что кеш холодный и в Redis еще нет данных для обслуживания. Запрашивающий процесс должен ждать, пока значение не будет сгенерировано внешним работником. Я не могу использовать разогрев кеша в этом случае, потому что только запрошенные ключи должны быть кешированы из-за ограниченного размера кеша.

Итак, вопрос в том, как я могу сделать PHP запросов на ожидание, пока вычисленное значение станет доступным в Redis? Или каково будет общее решение в этом случае?

Возможные решения, о которых я уже говорил:

Команда Redis blpop, вероятно, не будет работать, потому что пересчитываемое значение отсутствует в списке и выглядит как обходной путь. Может быть, можно реализовать какую-то блокировку на основе файлов? Однако веб-приложение и рабочий находятся на отдельных серверах, и NFS, например, не поддерживает блокировки файлов.

Единственное возможное рабочее решение, о котором я могу подумать, - это иметь бесконечное время l oop, которое отправляет эхо-запрос Redis каждые X миллисекунд. с некоторым временем ожидания Y max. Однако действительно ли это хорошее и практичное решение? Потому что я не фанат бесконечных циклов в предположительно недолговечных веб-запросах. Кроме того, сотни запросов потенциально могут выполнять бесконечные циклы и ждать, пока значение будет пересчитано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...