Gestionarea erorilor API-ului de urmărire: Cum să gestionați numerele de urmărire invalide, limitele de rată și reîncercările
Gestionați erorile API de urmărire separând datele de intrare nevalide, defecțiunile temporare, limitele de frecvență și rezultatele privind starea expedierii. Respingeți sau corectați numerele de urmărire nevalide în loc să le retrimiteți neschimbate, coordonați volumul solicitărilor atunci când sunt limitate și reîncercați defecțiunile temporare folosind o reîncercare exponențială limitată cu variație aleatorie. Înainte de a repeta o înregistrare sau o altă solicitare de scriere, stabiliți dacă prima încercare a reușit.
Pentru dezvoltatorii care conectează datele de urmărire la un sistem de gestionare a comenzilor, la o platformă de depozit sau la o pagină de urmărire destinată clienților, obiectivul nu este pur și simplu reducerea numărului de solicitări eșuate. Este asigurarea unei vizibilități fiabile asupra expedierilor, fără înregistrări duplicate, valuri de reîncercări, mesaje de livrare înșelătoare sau tichete de asistență inutile.
Clasificați defecțiunea înainte de a alege un răspuns
O integrare de urmărire are mai multe rezultate distincte de evaluat: dacă solicitarea de rețea s-a finalizat, dacă API-ul a acceptat operațiunea, dacă fiecare articol de urmărire solicitat a reușit și dacă evenimentele expedierii sunt disponibile. Tratarea tuturor celor patru ca un singur indicator de succes sau eșec creează erori evitabile.
Un răspuns HTTP de succes nu înseamnă neapărat că fiecare articol dintr-un lot a reușit. În schimb, o căutare procesată cu succes, dar fără evenimente de urmărire, nu reprezintă neapărat o defecțiune API. Inspectați corpul răspunsului și aplicați semnificația documentată de furnizor pentru fiecare rezultat.
| Condiție | Acțiune recomandată | Reîncercați neschimbat? |
|---|---|---|
| Număr format incorect sau câmp de solicitare nevalid | Validați și corectați datele de intrare | Nu |
| Date de autentificare lipsă sau nevalide | Verificați datele de autentificare, permisiunile și mediul | Nu până la corectare |
| Răspuns privind limita de frecvență | Amânați activitatea afectată și reduceți presiunea comună asupra solicitărilor | După timpul de așteptare necesar, dacă este sigur |
| Defecțiune temporară a serviciului | Aplicați o reîncercare limitată cu backoff și verificați siguranța operațiunii | De obicei, în limita unui buget de reîncercări |
| Timeout după trimiterea unei înregistrări | Verificați dacă înregistrarea există | Nu orbește |
| Căutare acceptată fără evenimente ale expedierii | Urmați ciclul de viață documentat al urmăririi | Folosiți reîmprospătarea programată, nu reîncercări rapide |
Codurile de stare HTTP oferă un punct de pornire, nu un arbore decizional complet specific furnizorului. RFC 9110 definește semantica HTTP, iar RFC 6585 definește 429 Too Many Requests. Integrarea dumneavoastră ar trebui să interpreteze, de asemenea, codurile de eroare ale aplicației documentate și rezultatele la nivel de articol.
Numere de urmărire nevalide: diferențiați datele de intrare incorecte de lipsa evenimentelor
„Număr de urmărire nevalid” poate descrie probleme diferite: un identificator formatat incorect, o combinație de transportator și număr care nu este acceptată, lipsa unui câmp obligatoriu pentru transportator sau o altă defecțiune de validare specifică furnizorului. Nu presupuneți că un număr este nevalid doar pentru că nu sunt returnate evenimente de urmărire.
Validați fără a deteriora identificatorul
- Stocați numerele de urmărire ca șiruri de caractere. Stocarea numerică poate elimina zerourile de la început sau poate modifica identificatorii lungi.
- Păstrați datele de intrare originale. Păstrați o valoare normalizată separată, astfel încât transformările să poată fi auditate.
- Normalizați cu prudență. Eliminați spațiile de la început și de la sfârșit acolo unde este potrivit, dar eliminați caracterele interne sau modificați literele doar atunci când regulile documentate permit acest lucru.
- Verificați local câmpurile obligatorii. Identificați numerele goale, identificatorii lipsă ai transportatorului și structurile nevalide ale solicitării înainte de a le trimite.
- Evitați o expresie regulată universală pentru numerele de urmărire. O regulă concepută pentru un transportator poate respinge identificatori valizi de la altul.
- Confirmați ce conține câmpul. Un număr de comandă, o referință de depozit și un număr de urmărire al transportatorului nu sunt interschimbabile decât dacă endpointul le acceptă explicit.
Dacă API-ul respinge explicit datele de intrare, direcționați-le către corectare, nu către o buclă automată de reîncercare. Includeți un motiv util, precum „identificatorul transportatorului este obligatoriu”, în loc să reduceți fiecare problemă de validare la „urmărire eșuată”.
Tratați „fără evenimente” ca o stare separată
O expediere poate avea un identificator de urmărire înainte ca evenimentele utile de deplasare să devină disponibile. Răspunsul corect depinde de modelul de stare documentat al API-ului și de contextul expedierii. Verificați dacă identificatorul provine din sistemul de expediere, dacă selecția transportatorului este corectă și dacă răspunsul indică date în așteptare, nu date de intrare respinse.
Folosiți stări interne distincte precum input_rejected, awaiting_events și temporarily_unavailable. Acestea sunt stări de aplicație sugerate, nu valori API standardizate. Ele ajută la prevenirea transformării unei lacune temporare de date într-un mesaj inexact pentru client.
Gestionați limitele de frecvență la nivelul integrării, nu al fiecărui procesator
RFC 6585 definește HTTP 429 ca răspuns de limitare a frecvenței și permite includerea unui antet Retry-After. Standardul nu stabilește o limită universală sau o metodă universală de contorizare pentru API-urile de urmărire. Limitele pot fi documentate pentru cont, date de autentificare, endpoint sau alt domeniu; folosiți regulile reale ale furnizorului.
RFC 9110 specifică două forme pentru Retry-After: un număr nenegativ de secunde sau o dată HTTP. Analizați-le pe ambele. Dacă valoarea este o dată, calculați cu atenție timpul de așteptare rămas și țineți cont de diferențele dintre ceasuri. Dacă lipsește sau nu poate fi utilizată, aplicați politica de rezervă configurată pentru backoff.
Un procesator care doarme independent nu este suficient atunci când alți procesatori continuă să utilizeze aceeași alocare. Plasați controlul frecvenței la limita comună pentru datele de autentificare sau contul relevant. Un planificator central, un token bucket comun sau un control distribuit echivalent poate coordona acest trafic.
- Identificați domeniul afectat. Determinați cărui endpoint, set de date de autentificare sau cont i se aplică limita.
- Respectați instrucțiunea de așteptare a serverului. Nu programați o reîncercare mai devreme decât permite o valoare validă
Retry-After. - Amânați activitatea afectată din coadă. Evitați blocarea traficului care nu are legătură atunci când limitele sunt cu adevărat independente.
- Reduceți concurența sau frecvența solicitărilor. Așteptarea o singură dată fără modificarea tiparului de solicitări poate recrea aceeași problemă.
- Reluați cu intervale între solicitări. Nu eliberați întregul volum restant simultan la încheierea perioadei de așteptare.
Acolo unde este acceptată, procesarea în loturi poate reduce numărul solicitărilor, dar trebuie să respecte regulile documentate privind dimensiunea lotului și contorizarea. Nu presupuneți că un lot consumă o singură unitate din alocare. De asemenea, folosiți webhook-uri acolo unde sunt disponibile pentru a reduce sondarea evitabilă, păstrând în același timp procesul de reconciliere necesar integrării dumneavoastră.
Folosiți reîncercări limitate cu backoff și variație aleatorie
Reîncercările sunt potrivite atunci când o defecțiune poate dispărea fără modificarea solicitării și repetarea operațiunii este sigură. Defecțiunile temporare de conexiune și anumite erori de server se pot încadra în această categorie. O sarcină formatată incorect, date de autentificare nevalide sau o problemă permanentă de permisiuni necesită, în general, corectare.
O soluție practică de rezervă este backoff-ul exponențial plafonat cu variație aleatorie completă:
backoff_window = min(max_delay, base_delay * 2^retry_index)
jitter_delay = random(0, backoff_window)
next_delay = max(valid_retry_after_delay, jitter_delay)
Aici, retry_index începe de la zero pentru prima reîncercare, iar absența lui Retry-After nu adaugă un timp minim suplimentar de așteptare. Acestea sunt alegeri de implementare, nu un algoritm HTTP obligatoriu. Selectați întârzierea de bază, plafonul, limita încercărilor și termenul total în funcție de volumul dumneavoastră de lucru și de îndrumările furnizorului.
Variația aleatorie distribuie solicitările în timp, în loc ca fiecare procesator să le repete după același program. Plafonul întârzierii limitează componenta exponențială; nu ar trebui să anuleze o perioadă mai lungă de așteptare solicitată valid de server. Dacă această așteptare depășește termenul limită al sarcinii, amânați sau încheiați sarcina conform politicii, în loc să reîncercați prea devreme.
Atribuiți un punct final fiecărui lanț de reîncercări
- Limită de încercări: limitați numărul solicitărilor suplimentare.
- Limită de timp scurs: opriți reîncercarea activității care a depășit intervalul util de procesare.
- Responsabilitate explicită: alegeți nivelul care controlează reîncercările, astfel încât reîncercările clientului HTTP și cele ale cozii să nu se multiplice neașteptat.
- Programare persistentă: stocați sarcinile amânate în loc să vă bazați pe perioade lungi de așteptare în procese cu durată scurtă.
- Cale de recuperare: trimiteți sarcinile epuizate într-o coadă de sarcini eșuate, care poate fi analizată, împreună cu motivul și acțiunea următoare.
În timpul unei întreruperi prelungite, luați în considerare un întrerupător de circuit care întrerupe temporar apelurile de rutină și permite verificări controlate de recuperare. Acesta este un model de reziliență a aplicației, nu o dovadă că un anumit furnizor de urmărire îl impune.
Rezolvați scrierile ambigue înainte de a le retrimite
Un timeout vă spune că aplicația nu a primit un răspuns complet. Nu dovedește că serverul a respins solicitarea sau că nu a procesat-o niciodată. Această distincție contează atunci când înregistrați numere de urmărire sau modificați configurația urmăririi.
RFC 9110 explică metodele idempotente și avertizează împotriva reîncercării automate a solicitărilor non-idempotente fără o bază care să confirme că repetarea este sigură sau că operațiunea inițială nu a fost aplicată. Evaluați semantica documentată a operațiunii, în loc să presupuneți că fiecare endpoint de urmărire funcționează ca o căutare doar pentru citire.
- Folosiți un mecanism de idempotență documentat de furnizor atunci când este disponibil, respectând domeniul și regulile sale de păstrare.
- Păstrați aceeași cheie de idempotență pentru reîncercările aceleiași operațiuni logice; nu presupuneți că un antet personalizat arbitrar va fi acceptat.
- Dacă este acceptat, verificați înregistrarea existentă înainte de a repeta o scriere ambiguă.
- Folosiți o constrângere locală de unicitate aliniată cu identitatea documentată a expedierii de către furnizor.
- Stocați rezultatul operațiunii, astfel încât redeliverarea unei sarcini din coadă să nu declanșeze automat o altă scriere.
Pentru operațiunile în loturi, păstrați rezultatul fiecărui articol. Reîncercați doar articolele clasificate ca eșuate temporar și reconciliați articolele ale căror rezultate rămân necunoscute. Reluarea întregului lot poate repeta activități reușite și poate consuma inutil alocarea de solicitări.
Aplicați politica furnizorului dumneavoastră de urmărire
Pentru o integrare 17TRACK, utilizați pagina Tracking API și documentația oficială API ca puncte de pornire pentru contractul specific furnizorului. Păstrați clasificatorul de erori configurabil, în loc să codificați rigid presupuneri dintr-un ghid HTTP generic.
Înainte de implementare, confirmați schema solicitării endpointului relevant, structura răspunsului, semnificația erorilor la nivel de articol, domeniul limitării de frecvență, constrângerile loturilor și regulile pentru trimiterile duplicate. Dacă utilizați livrarea de evenimente, verificați și cerințele privind confirmarea, autentificarea și redeliverarea. Acest ghid nu prescrie o limită numerică de frecvență 17TRACK, un program de reîncercare sau o funcție de idempotență.
Înregistrați fiecare regulă confirmată într-o mapare de la răspunsul furnizorului la acțiunea aplicației: corectarea datelor de intrare, repararea configurației, așteptare, reconciliere sau escaladare. O eroare nerecunoscută ar trebui să păstreze contextul de diagnosticare și să urmeze o cale de rezervă limitată, nu să reîncerce nelimitat în mod implicit.
Monitorizați calitatea recuperării și testați căile de defecțiune
Înregistrați operațiunea, endpointul, starea HTTP, codul de eroare al aplicației, numărul încercării, latența, acțiunea următoare programată și identificatorul solicitării furnizorului, atunci când este furnizat. Evitați înregistrarea cheilor API, a informațiilor inutile despre adrese sau a corpurilor de răspuns nelimitate. Mascati sau aplicați hash numerelor de identificare ale urmăririi atunci când valorile complete nu sunt necesare.
Monitorizați separat ratele datelor de intrare nevalide, limitarea frecvenței, vechimea cozii, reîncercările epuizate și ultima sincronizare reușită. O integrare poate avea o rată scăzută de erori HTTP, dar poate furniza în continuare informații învechite despre expediere. Paginile destinate clienților ar trebui să păstreze ultima stare cunoscută a expedierii și să diferențieze o defecțiune de reîmprospătare de o excepție de livrare raportată de transportator.
Înainte de lansare, testați date de intrare formatate incorect, identificatori valizi fără evenimente, ambele forme ale Retry-After, antete lipsă, defecțiuni parțiale ale loturilor, timeout-uri după scrieri și redeliverarea din coadă. Simulați, de asemenea, o întrerupere suficient de lungă pentru a epuiza bugetul de reîncercări. Testul reușește numai atunci când activitatea se oprește sau este amânată în mod previzibil, articolele reușite nu sunt reluate inutil, iar articolele eșuate rămân recuperabile.
Întrebări frecvente
Ar trebui ca un număr de urmărire nevalid să fie reîncercat automat?
Nu atunci când API-ul respinge explicit datele de intrare ca fiind nevalide. Corectați mai întâi numărul, selecția transportatorului sau câmpurile obligatorii. Dacă răspunsul înseamnă că evenimentele expedierii nu sunt încă disponibile, folosiți fluxul de reîmprospătare documentat, în loc să îl tratați ca pe o defecțiune de validare.
HTTP 200 înseamnă că o solicitare în lot a reușit complet?
Nu neapărat. Verificați schema răspunsului furnizorului pentru rezultatele la nivel de operațiune și de articol. Păstrați succesele și izolați defecțiunile, astfel încât reîncercarea unui articol să nu repete inutil restul.
Câte încercări de reîncercare ar trebui să permită o integrare de urmărire?
Nu există un număr universal. Stabiliți atât o limită de încercări, cât și un buget de timp scurs pe baza îndrumărilor furnizorului, a siguranței operațiunii și a duratei în care rezultatul rămâne util. O sincronizare de fundal programată poate tolera o fereastră de recuperare diferită de cea a unei solicitări interactive a clientului.
Ar trebui ca un timeout să marcheze imediat o expediere ca eșuată?
Nu. Un timeout al solicitării este un rezultat al integrării, nu un eveniment al expedierii. Păstrați ultima stare cunoscută a urmăririi, programați o recuperare sigură și evitați transformarea unei probleme de conectivitate într-o notificare de eșec al livrării.
Ce ar trebui să se întâmple când reîncercările sunt epuizate?
Mutați sarcina într-o coadă persistentă de sarcini eșuate sau de analiză, împreună cu contextul său de diagnosticare. Identificați dacă recuperarea necesită date de intrare corectate, restabilirea datelor de autentificare, asistența furnizorului sau o reluare controlată ulterioară. Nu o eliminați în tăcere și nu reporniți același ciclu nelimitat de reîncercări.
Surse
- RFC 9110: Semantica HTTP — semantica stărilor HTTP, metodele idempotente, considerații privind reîncercarea automată și câmpul Retry-After.
- RFC 6585: Coduri de stare HTTP suplimentare — definiția pentru 429 Too Many Requests și antetul opțional Retry-After.
- 17TRACK Tracking API — punctul oficial de acces pentru produsul Tracking API.
- Documentația API 17TRACK — referință pentru verificarea cerințelor de integrare specifice furnizorului.


