Кешируйте погоду по нормализованному городу, единицам измерения и нужным параметрам с допустимым TTL. При массовом промахе объединяйте обновление одного ключа, иначе 50k RPS обрушатся на источник.
Задача: есть endpoint getWeather, который возвращает температуру в городе. На него большая нагрузка. Как реализовать кэширование? Что происходит при cache miss под высокой нагрузкой (50k RPS)?
Кешируйте погоду по нормализованному городу, единицам измерения и нужным параметрам с допустимым TTL. При массовом промахе объединяйте обновление одного ключа, иначе 50k RPS обрушатся на источник.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Кешируйте погоду по нормализованному городу, единицам измерения и нужным параметрам с допустимым TTL. При массовом промахе объединяйте обновление одного ключа, иначе 50k RPS обрушатся на источник.
Часто используют небольшой локальный кеш и общий распределённый кеш. Если данные слегка устаревают допустимо, stale-while-revalidate позволяет отдать прошлое значение и обновить его в фоне одним исполнителем.
Для холодного ключа нужны single-flight, ограничение ожидания и лимит обращений к погодному провайдеру. Разброс TTL уменьшает одновременное истечение разных ключей. Ошибки и «город не найден» кешируют по отдельной короткой политике; произвольные ключи ограничивают, чтобы не заполнить память мусором.