Выбор ответа Senior Сеть: Retrofit и OkHttp обновлено

Параллельные 401 и обновление токена

Вопрос

Пять запросов одновременно получили 401. Как избежать пяти параллельных refresh-запросов?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Синхронизировать refresh: первый обновляет, остальные ждут и повторяют с новым токеном. Без синхронизации каждый 401 запустит свой refresh, а если refresh-токен одноразовый, второй refresh вернёт ошибку и пользователя разлогинит.

Варианты ответа

  1. Синхронизировать refresh: первый обновляет, остальные ждут и повторяют с новым токеномправильный ответ
  2. Ничего не делать: сервер сам склеит одинаковые refresh-запросы по refresh-токену
  3. Отключить параллельные запросы в OkHttp, выставив maxRequests = 1 в Dispatcher
  4. Увеличить таймауты, чтобы первый refresh успел закончиться до старта остальных

Разбор

Без синхронизации каждый 401 запустит свой refresh, а если refresh-токен одноразовый, второй refresh вернёт ошибку и пользователя разлогинит. Решение: критическая секция (mutex или synchronized), внутри которой сравнивают токен из упавшего запроса с текущим: если он уже обновлён другим потоком, повторяют запрос с новым токеном без refresh. Отключать параллельность и менять таймауты бессмысленно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.