valexeich
@valexeich

Как обработать статус код 429 и избежать race condition при параллельных запросах?

У меня возникла проблема при параллельных запросах к внешним API. Иногда получаю статус код 429 от сервера. В моем сценарии несколько запросов могут получить 429 одновременно, и я хочу, чтобы только один из них менял прокси, чтобы избежать конфликта. Как можно реализовать такое поведение? Говорю сразу мьютекс мне не подходит, так как это уже не будет параллельно.

Вот псевдокод:

const urls = ['https://example1', 'https://example2', 'https://example3']

const fetchData = async (url) => {
   const response = await fetch(url,  proxy=proxy)
   if (response.status === 429) {  
       // тут может быть такое что одновременно несколько запросов получили 429, и все таски                                      
      // пытаются изменить прокси, когда это нужно лишь единожды
     await changeProxy()
   }
   return response
}

Promise.all(urls.map(async (url) => {
  const response = await fetchData(url)
  ...
}));
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Говорю сразу мьютекс мне не подходит, так как это уже не будет параллельно.


С чего бы "уже не будет параллельно" ? Очень даже будет. По факту, при параллельных операциях всегда будет какая-нибудь блокировка, даже в Wait-Free алгоритмах, где используется CAS она есть, только на машинном уровне.

Как можно реализовать такое поведение?


Если не хочешь мьютекс (или другой блокирующий примитив), то используй CAS (Compare And Swap). Вот документация

Идея слудующая:
- хранишь где нибудь поле с этим прокси
- при начале каждой операции сохраняешь старое значение прокси
- когда получаешь 429, то CAS'ом меняешь, то что хранится на новое (сравниваешь со старым)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы