Выбор ответа Senior Сеть: Retrofit и OkHttp обновлено
Параллельные 401 и обновление токена
Вопрос
Пять запросов одновременно получили 401. Как избежать пяти параллельных refresh-запросов?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Синхронизировать refresh: первый обновляет, остальные ждут и повторяют с новым токеном. Без синхронизации каждый 401 запустит свой refresh, а если refresh-токен одноразовый, второй refresh вернёт ошибку и пользователя разлогинит.
Варианты ответа
- Синхронизировать refresh: первый обновляет, остальные ждут и повторяют с новым токеномправильный ответ
- Ничего не делать: сервер сам склеит одинаковые refresh-запросы по refresh-токену
- Отключить параллельные запросы в OkHttp, выставив
maxRequests = 1в Dispatcher - Увеличить таймауты, чтобы первый refresh успел закончиться до старта остальных
Разбор
Без синхронизации каждый 401 запустит свой refresh, а если refresh-токен одноразовый, второй refresh вернёт ошибку и пользователя разлогинит. Решение: критическая секция (mutex или synchronized), внутри которой сравнивают токен из упавшего запроса с текущим: если он уже обновлён другим потоком, повторяют запрос с новым токеном без refresh. Отключать параллельность и менять таймауты бессмысленно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.