A Retry-After fejléc: mennyi ideig kell várni az újrapróbálkozás előtt

Retry-After EGY HTTP-válaszfejléc, amely közli az alkalmazásodnak, hogy mennyi ideig kell várnia a következő kérés elküldése előtt. Az érték másodpercek száma vagy HTTP-dátum. Amikor egy API elküldi, ez a legmegbízhatóbb válasz a "mikor próbálkozhatok újra?" kérdésre, mert attól a kiszolgálótól származik, amely elutasította a kérését. További információ: RFC 9110, 10.2.3.

Így néz ki a Retry-After

A fejlécnek 2 formátuma van. Az alkalmazásnak mindkettőt kezelnie kell.

Format Example Mit jelent ez?
Seconds Retry-After: 120 Várjon 120 másodpercet (2 percet) attól számítva, hogy megkapta a választ. Az érték nem negatív egész szám.
HTTP-dátum Retry-After: Fri, 31 Dec 1999 23:59:59 GMT Ezen időpont előtt ne küldje el újra a kérést. A dátum mindig GMT-ben van megadva.

A kiszolgálók a következő állapotkódokkal küldik Retry-After:

Állapot Mit Retry-After jelent? Source
429 Too Many Requests Mennyi ideig kell várni az új kérés elküldése előtt. A kiszolgáló tartalmazhatja. RFC 6585, 4. szakasz
503 Service Unavailable A szolgáltatás várhatóan mennyi ideig nem érhető el. A kiszolgáló tartalmazhatja. RFC 9110, 15.6.4. szakasz
413 Content Too Large Ha az állapot ideiglenes, a kiszolgálónak meg kell mondania, hogy mennyi idő után ér véget. RFC 9110, 15.5.14. szakasz
Bármilyen 3xx átirányítás A minimális várakozási idő az átirányítás követése előtt. RFC 9110, 10.2.3. szakasz

A fejléc nem kötelező. Egyes API-k inkább saját fejléceket használnak. Például a GitHub jelzi, hogy mikor áll vissza a korlát x-ratelimit-reset. További információkért lásd: GitHub API-kérelmek korlátja túllépve.

Retry-After kezelése

  1. Olvassa el mindkét formátumot. Ha az érték szám, akkor másodpercben van. Ellenkező esetben értelmezze dátumként, és vonja ki belőle az aktuális időt. Ha a dátum már a múltban van, azonnal újra próbálkozhat.
  2. Várjon legalább addig, ameddig a fejlécben szerepel. Ha korábban próbálkozik újra, általában egy másik 503 vagy 429 kap. Egyes API-k folyamatosan számlálják a kéréseket, miközben korlátozzák Önt, így a korai újrapróbálkozások hosszabb ideig tarthatnak. Lásd például a Microsoft Graph fojtásra vonatkozó útmutatót.
  3. Ha a fejléc hiányzik, térjen vissza jitteres backoffra. Duplázza meg a várakozást minden sikertelen kísérlet után, adjon hozzá egy véletlenszerű összeget, hogy sok ügyfél ne próbálkozzon újra ugyanabban a pillanatban, és korlátozza a várakozást.
  4. Korlátozza az újrapróbálkozásokat. Néhány kísérlet után adja vissza a hibát a hívó függvénynek.
  5. Ellenőrizze, hogy az újrapróbálkozás segíthet-e. Egyes API-k akkor térnek vissza 429, ha a kreditek vagy a költségkeret kimerültek. A várakozás nem oldja meg a problémákat. Példa: OpenAI insufficient_quota és credit_balance_exhausted.
function retryDelayMs(response, attempt) {
  const value = response.headers.get('retry-after');
  if (value) {
    const seconds = Number(value);
    const ms = Number.isNaN(seconds) ? Date.parse(value) - Date.now() : seconds * 1000;
    if (!Number.isNaN(ms)) {
      return Math.max(ms, 0);
    }
  }
  // No usable header: exponential backoff with jitter, capped at 30 seconds
  return Math.random() * Math.min(30_000, 1_000 * 2 ** attempt);
}

Sok SDK kezeli Retry-After Az Ön számára, de csak addig, amíg elfogy az újrapróbálkozások. Ezután a kód hibát dob.

SDK Mit csinál alapértelmezés szerint
.NET standard rugalmassági kezelő Hatványozott visszalépéssel és izgalmakkal újrapróbálkozik 408, 429és 5xx legfeljebb háromszor válaszol. A késleltetéshez a(z) Retry-After elemet használja, mert a(z) ShouldRetryAfterHeader alapértelmezés szerint true.
Microsoft Graph SDK Használja a(z) Retry-After elemet, ha jelen van, ha pedig nem, alkalmazzon exponenciális késleltetést. A JSON-kötegen belüli kéréseket nem próbálja újra automatikusan.
OpenAI Python SDK Újrapróbálja a csatlakozási hibákat és a 408, 409, 429 és 5xx válaszokat 2 alkalommal, rövid exponenciális késleltetéssel. Állítsa max_retries értékre a módosításhoz.

Ellenőrizze az SDK dokumentációjában a pontos szabályzatot, és tesztelje, mi történik az utolsó újrapróbálkozás meghiúsulása után.

Az alkalmazás Retry-After kezelésének tesztelése

Ritkán kapsz egy Retry-After fejlesztés közben, és amikor mégis kapsz ilyet, nem tudod szabályozni annak értékét. Így a tesztelés módja dönti el, hogy Ön találja-e meg a hibákat a felhasználók előtt.

Approach Mit talál? Ami hiányzik
Várjon az éles üzemre Tényleges meghibásodások Minden, amíg egy felhasználó rá nem kattint
Mockolja az API-t a tesztekben, vagy hagyja, hogy a kódoló ügynök megírja a mockot A kód elemzi-e a fejlécet Azt, hogy a valódi HTTP-ügyfél vagy az SDK elég sokáig várakozik-e, és hogy az API valójában mit küld. Az alkalmazásnak egy csak tesztelési kapcsolóra is szüksége van a mock eléréséhez.
Hívd a valódi API-t, amíg korlátozni nem kezdi a hívásaidat. Valós viselkedés Nem válthatsz ki korlátozott választ igény szerint, és a valós kvótádat használod fel
Fogd el az alkalmazásod valós forgalmát, és adj vissza kérésre lassított válaszokat Hogy a valódi SDK és az újrapróbálkozási szabályzat vár-e olyan sokáig, mint amennyit a fejléc jelez Az alkalmazásban semmi sem változik, ezért nem teszteli a kódot izoláltan. Arra valók az egységtesztek.

Próbálja ki az alkalmazásában

A Dev Proxy elfogja az alkalmazás kéréseit a kiválasztott API-khoz, és Retry-After válaszokat ad vissza 429 fejléccel, miközben az alkalmazás folyamatosan hívja a valódi URL-címeket. A RetryAfterPlugin megjegyzi, hogy az egyes korlátozott kérések mikor próbálhatók újra. Ha az alkalmazás ezen időpont előtt ismét ugyanazt az URL-címet hívja meg, a Dev Proxy jelzi ezt, és ismét korlátozza a kérést. A bővítmény csak a válaszokat követi nyomon 429.

A GenericRandomErrorPlugin hibafájljában adja meg egy @dynamic válasz Retry-After értékét 429 értékre, és a Dev Proxy kitölti a másodpercek számát, és nyomon követi azt.

A kipróbálásához töltsön le egy előbeállítást, amely mindkét beépülő modult használja, és indítsa el vele a Dev Proxyt:

devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

Ezután futtassa az alkalmazást a szokásos módon, és figyelje meg, hogy mit csinál. A Dev Proxy telepítéséhez lásd: Dev Proxy beállítása.

További lépések

Lásd még