Κέρδη:
- Μπορεί να ερμηνεύσει όρια ταχύτητας (RPM/ITPM/OTPM) και 429 σφάλματα
- Εφαρμόζει εκθετική υποχώρηση και επανάληψη με επανάληψη-μετά
- Ταξινομεί και χειρίζεται σωστά τους κοινούς κωδικούς σφάλματος HTTP (400/401/429/500/529)
Σε ένα περιβάλλον παραγωγής, κανένα API δεν ανταποκρίνεται τέλεια όλη την ώρα. Μερικές φορές στέλνετε αιτήματα πολύ γρήγορα και αγγίζετε το όριο. Μερικές φορές ο διακομιστής είναι προσωρινά απασχολημένος. Μερικές φορές το αίτημά σας είναι λάθος από την αρχή. Αυτό που διακρίνει μια σταθερή ολοκλήρωση από μια ερασιτεχνική προσπάθεια είναι ότι χειρίζεται αυτές τις καταστάσεις προγνωστικά και αυτόματα. Σε αυτήν την ενότητα θα μάθετε σχετικά με τα όρια ρυθμού (RPM/ITPM/OTPM), το σφάλμα 429, την επανάληψη της προσπάθειας με εκθετική επιστροφή και τη σωστή ταξινόμηση των κοινών κωδικών σφάλματος HTTP. Ο στόχος: να δημιουργηθεί μια ροή που να είναι τόσο ισχυρή που ο χρήστης δεν θα την προσέξει ποτέ.
Τι είναι τα όρια ταχύτητας;
Ο πάροχος περιορίζει πόση εργασία μπορεί να κάνει ένας διακόπτης σε μια δεδομένη χρονική περίοδο. Αυτή η προστασία. Προστατεύει τόσο την υποδομή όσο και εσάς από ξαφνικές εκρήξεις κόστους. Υπάρχουν τρεις συνήθεις τύποι ορίων:
- RPM (Αιτήματα ανά λεπτό): Αριθμός αιτημάτων ανά λεπτό.
- ITPM (Input Tokens Per Minute): Διακριτικό εισόδου που μπορεί να υποβληθεί σε επεξεργασία ανά λεπτό.
- OTPM (Output Tokens Per Minute): Διακριτικό εξόδου που μπορεί να παραχθεί ανά λεπτό.
Εάν υπερβείτε κάποιο από αυτά τα όρια, ο πάροχος απορρίπτει το αίτημα και επιστρέφει έναν κωδικό σφάλματος 429. Τα όρια γενικά ποικίλλουν ανάλογα με το επίπεδο του λογαριασμού σας (επίπεδο) και ενδέχεται να αυξηθούν με την πάροδο του χρόνου.
Συμβουλή: Μπορείτε να παρακολουθήσετε όταν πλησιάζετε το όριο από τις κεφαλίδες απόκρισης. Οι περισσότεροι πάροχοι αναφέρουν το όριο που απομένει με κεφαλίδες όπως x-ratelimit-remaining-*. Η παρακολούθηση αυτών των τιμών και η μείωση της κίνησης μπροστά είναι ο πιο ώριμος τρόπος για να αποφευχθεί το πρόβλημα χωρίς να λάβετε 429.
429 και Εκθετική Επανάληψη
Το 429 (όριο ρυθμού) είναι ένα προσωρινό σφάλμα και με δυνατότητα επανάληψης δοκιμής. Η σωστή απάντηση είναι να περιμένετε για λίγο το αίτημα και να προσπαθήσετε ξανά. Αλλά μια συνεχής αναμονή δεν αρκεί. Εάν όλοι προσπαθήσουν ξανά την ίδια στιγμή, το όριο θα συμπληρωθεί ξανά. Η λύση είναι η εκθετική υποχώρηση: αύξηση του χρόνου αναμονής εκθετικά με κάθε αποτυχημένη προσπάθεια.
# Δοκιμή λογικής εκθετικής υποχώρησης 1 → 429 → περιμένετε 1 δευτερόλεπτο δοκιμή 2 → 429 → περιμένετε 2 δευτερόλεπτα δοκιμή 3 → 429 → περιμένετε 4 δευτερόλεπτα δοκιμή 4 → 429 → περιμένετε 8 δευτερόλεπτα (+ μικρές τυχαίες "jitter")... παραιτηθείτε και αναφέρετε μετά από το πολύ N δοκιμές
Προσθέτοντας μια μικρή τυχαιότητα (jitter) σε αυτό αποτρέπει τη σύγκρουση αιτημάτων όταν προσπαθείτε να δοκιμάσετε ξανά την ίδια στιγμή. Επιπλέον, η απόκριση 429 συχνά φέρει μια κεφαλίδα «επανάληψη-μετά»: «δοκιμάστε ξανά σε τόσα πολλά δευτερόλεπτα». Ο σεβασμός αυτού του τίτλου είναι πιο ακριβής από την τυφλή αναμονή.
Προσοχή: Όταν παίρνετε ένα 429, το "αναγκάζοντάς το στέλνοντας περισσότερα αιτήματα" θα επιδεινώσει την κατάσταση. Το όριο συνεχίζει να συμπληρώνεται και δεν περνούν αιτήματα. Η σωστή απόκριση είναι η υποχώρηση, όχι η επιτάχυνση. Καλά νέα: τα περισσότερα επίσημα SDK επαναλαμβάνουν αυτόματα το 429 και τα σφάλματα διακομιστή με backoff — χρησιμοποιήστε αυτήν τη συμπεριφορά του SDK πριν το εγκαταστήσετε με μη αυτόματο τρόπο.
Ταξινόμηση κωδικών σφαλμάτων HTTP
Δεν είναι κάθε λάθος το ίδιο. Κρίσιμη διάκριση: μπορεί να επαναληφθεί ή είναι ζήτημα αιτήματος/ταυτότητας;
Κωδικός
Σημασία
Μπορεί να δοκιμαστεί ξανά;
σωστή απάντηση
400
Μη έγκυρο αίτημα (σφάλμα μορφής/παραμέτρου)
όχι
Διορθώστε το αίτημα. μην ξαναστείλεις τα ίδια
401
Σφάλμα ελέγχου ταυτότητας (το κλειδί δεν είναι έγκυρο/λείπει)
όχι
Διόρθωση κλειδιού/τίτλου
403
Χωρίς εξουσιοδότηση (χωρίς πρόσβαση στο μοντέλο/χαρακτηριστικό)
όχι
Ελέγξτε τα δικαιώματα/πεδίο
404
Δεν βρέθηκε (λανθασμένο αναγνωριστικό μοντέλου/τελικό σημείο)
όχι
Σωστή ταυτότητα/διεύθυνση μοντέλου
429
Υπέρβαση του ορίου ταχύτητας
Ναι
Υποχώρηση + επανάληψη-μετά
500
Σφάλμα διακομιστή
Ναι
Δοκιμάστε ξανά με retreat
529
Υπερφορτωμένος διακομιστής
Ναι
Δοκιμάστε ξανά με retreat
Χρυσός κανόνας: Τα 429, 500 και 529 είναι προσωρινά. Δοκιμάζεται ξανά με απόσυρση. 400, 401, 403, 404 είναι ζητήματα αιτήματος/ταυτότητας. Το να προσπαθήσετε ξανά δεν θα το λύσει και χάνεται προσπάθεια. Ο κωδικός σας πρέπει να κάνει διάκριση μεταξύ αυτών των δύο ομάδων.
Βήμα προς βήμα: Ανθεκτική κλήση
- Υποβάλετε το αίτημα. Εάν είναι επιτυχής, συνεχίστε.
- Ταξινομήστε τον κωδικό σφάλματος. Μπορεί να δοκιμαστεί ξανά;
- Εάν μπορείτε να δοκιμάσετε: ακολουθήστε την επανάληψη μετά, εφαρμόστε εκθετική ανατροπή + jitter, δοκιμάστε περιορισμένο αριθμό φορών (π.χ. 5 μέγιστο).
- Εάν δεν δοκιμάσετε: Διόρθωση (μορφοποίηση/κλειδί) και διακοπή. Μην επαναλάβετε το ίδιο λανθασμένο αίτημα στον βρόχο.
- Σκεφτείτε να τα παρατήσετε. Εάν εξακολουθεί να μην είναι επιτυχής μετά από n προσπάθειες, εμφανίστε ένα ευγενικό μήνυμα στον χρήστη και καταγράψτε το συμβάν (μονάδα παρακολούθησης 11).
# Ισχυρή κλήση ψευδο-κωδικοποιημένου = 0repeat: answer = request_at() if answer.success: επιστρέψτε την απάντηση εάν answer.code στο [429, 500, 529] και δοκιμάστε < 5: αναμονή = επανάληψη_μετά ?? (2^try sec + jitter) sleep(wait); δοκιμάστε += 1; git again if answer.code στο [400, 401, 403, 404]: save_error(response); επιστροφή "το αίτημα πρέπει να διορθωθεί" επιστροφή "μόνιμο σφάλμα, δοκιμάστε αργότερα"
# Ευγενικά σχόλια προς τον χρήστη (όταν εξαντληθούν οι επαναλήψεις) "Είμαι απασχολημένος αυτήν τη στιγμή, δεν μπόρεσα να επεξεργαστώ το αίτημά σας. Δοκιμάστε ξανά σύντομα, διαφορετικά έχω αποθηκεύσει το αίτημά σας, θα επικοινωνήσω μαζί σας όταν είναι έτοιμο."
Αδύναμη προτροπή / Ισχυρή προτροπή (εδώ: σχεδιασμός μηνύματος σφάλματος)
# WEAK (εμφανίζει πρωτογενές σφάλμα στον χρήστη)"Σφάλμα 429: rate_limit_error"
# ΔΥΝΑΤΟ (φιλικό προς το χρήστη, καθησυχαστικό, που υποδεικνύει δράση) "Υπήρξε μια προσωρινή συμφόρηση στο σύστημα. Λάβαμε το αίτημά σας με ασφάλεια και δοκιμάζεται ξανά αυτόματα. Εάν ένα αποτέλεσμα δεν εμφανιστεί μέσα σε λίγα δευτερόλεπτα, μπορείτε να ανανεώσετε τη σελίδα."
Η αποκάλυψη του ακατέργαστου τεχνικού σφάλματος στον τελικό χρήστη υπονομεύει την εμπιστοσύνη και μπορεί να είναι μια ευπάθεια ασφαλείας. Κατηγοριοποιήστε τα λάθη εσωτερικά και δώστε στον χρήστη ένα ήρεμο, προσανατολισμένο στη δράση μήνυμα. Απλά γράψτε τις τεχνικές λεπτομέρειες για το αρχείο.
Τρεις Μίνι Θήκες
Περίπτωση 1 — Σκάφος συνετρίβη σε τροχαία έκρηξη. Ένα bot εξυπηρέτησης πελατών έλαβε 429 αυξημένη επισκεψιμότητα την ημέρα της καμπάνιας. Δεν έγινε επανάληψη στον κώδικα, κάθε σφάλμα αντικατοπτρίστηκε απευθείας στον χρήστη ως "σφάλμα". Πρόσθεσαν εκθετική επανόρθωση + επανάληψη-μετά. με την ίδια κίνηση, τα αιτήματα περνούσαν με καθυστέρηση αρκετών δευτερολέπτων, ο χρήστης δεν είδε κανένα σφάλμα.
Περίπτωση 2 — Δοκιμάζοντας 400 στον βρόχο. Μια ενοποίηση έπαιρνε ένα 404 λόγω μη έγκυρου αναγνωριστικού μοντέλου, αλλά αντιμετώπιζε όλα τα σφάλματα ως "παροδικά" και προσπαθούσε ξανά σε έναν άπειρο βρόχο. Το κούτσουρο πρήστηκε και δημιουργήθηκε περιττό φορτίο. Πρόσθεσαν την ταξινόμηση σφαλμάτων: το 404 θεωρείται μόνιμο, ο βρόχος σταματά και το αναγνωριστικό μοντέλου διορθώνεται. Μάθημα: μην ξαναδοκιμάζεις κάθε λάθος.
Περίπτωση 3 — Διαχείριση του ορίου από μπροστά. Μια εργασία εμπλουτισμού δεδομένων εκτελούνταν συνεχώς στο όριο των 429. Ακολούθησαν την κεφαλίδα x-ratelimit-remaining και μείωσαν την κίνηση σύμφωνα με την ποσόστωση. Έτσι κράτησαν σταθερό ρυθμό ακριβώς κάτω από το όριο, χωρίς να πάρουν κανένα 429s? Η δουλειά έγινε πιο προβλέψιμα και πιο γρήγορα.
Συνήθη λάθη
- Αύξηση ταχύτητας στο 429: Κάνει την κατάσταση χειρότερη. Εναλλαγή σε υποχώρηση.
- Επανάληψη κάθε σφάλματος: Το 400/401/404 είναι μόνιμο. Το να προσπαθείς ξανά είναι χαμός.
- Χρήση σταθερής αναμονής: Δημιουργεί μια σύγκρουση. Χρησιμοποιήστε εκθετικό + jitter.
- Παράβλεψη «επανάληψης μετά από»: Είναι πιο ακριβές να συμμορφωθείτε με τον χρόνο που καθορίζεται από τον πάροχο.
- Αποκάλυψη του πρωτογενούς σφάλματος στον χρήστη: Κουνάει την εμπιστοσύνη, δημιουργεί τρωτά σημεία. Ταξινόμηση μέσα.
- Απεριόριστες επαναλήψεις: Ορίστε ένα ανώτατο όριο (π.χ. 5 επαναλήψεις). τότε παραιτηθείτε με χάρη.
Βαθύτερα: Ουρά, Συγχρονισμός και διακόπτες κυκλώματος
Η αντοχή μιας και μόνο επιθυμίας είναι το πρώτο βήμα. Η πραγματική ωριμότητα είναι να διαχειριστείτε έναν μεγάλο αριθμό αιτημάτων χωρίς να ξεπεράσετε τα όρια. Τρεις έννοιες μπαίνουν στο παιχνίδι εδώ.
Ουρά: Βάζετε αιτήματα σε μια ουρά για να τα στείλετε με ελεγχόμενο ρυθμό και όχι αμέσως. Η ουρά εξομαλύνει τις ξαφνικές εκρήξεις επισκεψιμότητας: Ακόμα κι αν φτάσουν 1.000 αιτήματα ταυτόχρονα, η ουρά θα τα απελευθερώσει με ρυθμό κάτω από το όριο. Με αυτόν τον τρόπο αποτρέπετε το 429, τότε δεν χρειάζεται να ανησυχείτε για τη διόρθωσή του.
Όριο συγχρονισμού: Περιορίζεις πόσα αιτήματα είναι «στον αέρα» ταυτόχρονα. Απεριόριστα παράλληλα αιτήματα γεμίζουν γρήγορα τα όρια RPM και TPM. Ένα εύλογο ανώτατο όριο συγχρονισμού (π.χ. όχι περισσότερα από 10 ταυτόχρονα αιτήματα) διατηρεί τα όρια και καθιστά το σύστημα προβλέψιμο.
Διακόπτης κυκλώματος: Εάν ο πάροχος συνεχίζει να επιστρέφει 500/529, αντί να δοκιμάζετε επιμελώς κάθε αίτημα, "σπάτε το κύκλωμα" για λίγο και αποτυγχάνετε γρήγορα το αίτημα χωρίς να το στείλετε ποτέ. Μετά από αναμονή, ενεργοποιείτε ξανά το κύκλωμα και προσπαθείτε. Αυτό το μοτίβο αποτρέπει τη συντριβή του συστήματός σας σε περίπτωση προσωρινής αποτυχίας του παρόχου.
Μαζί, αυτά τα τρία δημιουργούν ανθεκτικότητα σε επίπεδο συστήματος πέρα από τη λογική επανάληψης μιας κλήσης. Σε μικρή κλίμακα, η αυτόματη επανάληψη του SDK είναι επαρκής. Καθώς η κλίμακα μεγαλώνει, η ουρά, ο συγχρονισμός και ο διακόπτης κυκλώματος γίνονται απαραίτητες. Όλοι έχουν τον ίδιο κοινό στόχο: να αντικατοπτρίζουν ένα προσωρινό πρόβλημα στον χρήστη όχι ως συντριβή, αλλά ως αόρατη καθυστέρηση μερικών δευτερολέπτων.
Συνοπτικά
429 επιστρέφει όταν ξεπεραστούν τα όρια ταχύτητας (RPM/ITPM/OTPM). Αυτό είναι ένα προσωρινό σφάλμα και θα επαναληφθεί χρησιμοποιώντας την επανάληψη δοκιμής μετά και την εκθετική οπισθοδρόμηση + jitter. 500 και 529 είναι επίσης προσωρινά. Το 400/401/403/404 είναι ένα ζήτημα αιτήματος/ταυτότητας και δεν μπορεί να επιλυθεί προσπαθώντας ξανά. Μια ισχυρή ροή διαχωρίζει τα σφάλματα σε αυτές τις δύο ομάδες, δοκιμάζει περιορισμένο αριθμό φορών, παρακολουθεί το όριο από μπροστά και εμφανίζει μηνύματα ηρεμίας στον χρήστη.
Εργασία εφαρμογής
Σκεφτείτε την ενσωμάτωσή σας. (1) Καταγράψτε τους κωδικούς σφαλμάτων που ενδέχεται να συναντήσετε και διαχωρίστε τους σε "εκ νέου δοκιμή / μόνιμο". (2) Καταγράψτε το εκθετικό σας σχέδιο ανάσυρσης (αρχικό κράτημα, συντελεστής, καπάκι, jitter). (3) Καθορίστε τον τρόπο χρήσης της κεφαλίδας επανάληψης δοκιμής. (4) Γράψτε το ευγενικό μήνυμα που θα εμφανίζεται στον χρήστη όταν εξαντληθούν οι επαναλήψεις.
λίστα ελέγχου
- [ ] Μπορώ να εξηγήσω τα όρια RPM/ITPM/OTPM και 429.
- [ ] Μπορώ να εφαρμόσω τη λογική της εκθετικής υποχώρησης + jitter + επανάληψη-μετά.
- [ ] Μπορώ να ταξινομήσω τους κωδικούς σφάλματος ως επαναδοκιμάσιμους/μόνιμους.
- [ ] Ξέρω ότι δεν πρέπει να δοκιμάζουμε κάθε λάθος.
- [ ] Αντί για ακατέργαστο σφάλμα, μπορώ να δείξω στον χρήστη ένα ήρεμο, προσανατολισμένο στη δράση μήνυμα.