Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
- 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.
- Várjon legalább addig, ameddig a fejlécben szerepel. Ha korábban próbálkozik újra, általában egy másik
503vagy429kap. 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. - 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.
- 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.
- 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);
}
Mit csinálnak a népszerű SDK-k
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.