SemaphoreSlim координирует только потоки одного процесса. При нескольких экземплярах приложения каждый может одновременно пересчитать один и тот же отсутствующий ключ кеша.
Почему SemaphoreSlim не решает задачу защиты от cache stampede в распределённой системе и что использовать вместо него?
SemaphoreSlim координирует только потоки одного процесса. При нескольких экземплярах приложения каждый может одновременно пересчитать один и тот же отсутствующий ключ кеша.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
SemaphoreSlim координирует только потоки одного процесса. При нескольких экземплярах приложения каждый может одновременно пересчитать один и тот же отсутствующий ключ кеша.
Для распределённого single-flight используют общую блокировку или иной протокол выбора одного обновляющего узла. У блокировки должны быть ограниченный срок, уникальный токен владельца и безопасное освобождение; при истечении lease старый владелец не должен перезаписывать более свежий результат.
Также помогают разброс TTL и stale-while-revalidate, если устаревшие данные допустимы. Распределённый lock не устраняет все отказы: нужны таймаут ожидания, повторная проверка кеша после захвата и защита БД от перегрузки.