Как грубый вариант:
1. пул воркеров, которые тянут информацию, передавая данные о сессии, но сами (пере)авторизацией не занимаются
2. отдельная горутина, которая занимается (пере)авторизацией
3. текущая сессия (токен, куки)
4. Condition Variable (
https://golang.org/pkg/sync/#Cond), с помощью которой синхронизируется доступ у текущей сессии
Изначально:
текущей сессии нет, воркеры ждут сигнала от Condition Variable
Горутина авторизации видит что текущей сессии нет, авторизуется, устанавливает текщую сессию и broadcast-ит событие с помощью Condition Variable. После чего засыпает до сигнала от Condition Variable.
Воркеры просыпаются и начинают работу.
Сессия протухла:
Воркер получает статус необходимости авторизации (например статус 401), сбрасывает текущую сессию (если она установлена и равна той про которую он знал), и broadcast-ит событие с помощью Condition Variable.
Горутина авторизации просыпается, видит что текущей сессии нет, снова начинает процесс авторизации.
В это время другие воркеры получают 401, они проверяют, что текущая сессия пуста и засыпают до сигнала от Condition Variable
Горутина авторизации, закончив процесс авторизации, устанавливает текщую сессию и broadcast-ит событие с помощью Condition Variable. После чего вновь засыпает до сигнала от Condition Variable.
Приостановленные воркеры просыпаются и переповторяют запросы.
Воркеры, которые не успели заснуть, просто переповторяют запрос с новым значением сессии.