Кэширование в Symfony: мы сломали авторизацию и исправили это с помощью Lock

Мы добавили кэширование, чтобы ускорить работу бэкэнда.
Затем кэширование нарушило авторизацию.
Поначалу ситуация казалась безобидной. Сервису Symfony требовался JWT-токен для взаимодействия с внешним API. Запрос нового токена перед каждым вызовом был неэффективным, поэтому мы сохранили его в кэше и использовали повторно.
При нормальной нагрузке все работало.
При нагрузочном тестировании токен истекал, и несколько запросов одновременно проходили через один и тот же поток. Каждый из них видел пустой кэш и запрашивал у внешнего API новый JWT. Внешний API аннулировал предыдущий токен каждый раз, когда выдавал новый.
После этого часть приложения начала работать с уже недействительными токенами.
Решение заключалось не только в использовании общего Memcached, ведь проблема была не в хранилище, а в праве на обновление общего состояния.
В статье история о том, как мы с командой обнаружили состояние гонки, что изменил Kubernetes в этой проблеме и почему Symfony Lock с повторной проверкой кэша стал недостающей частью архитектуры.
Это отрывок статьи. Полную версию читайте на сайте источника по ссылке ниже.
Источник: Habr