Περιοριστές ταχύτητας σχεδιασμού
1) Γιατί περιορίζεται το ποσοστό
Ο περιορισμός των ποσοστών προστατεύει τη διαθεσιμότητα και τα οικονομικά των API: σταματά τις πλημμύρες, τις εκρήξεις των retrays, την ευπιστία, προστατεύει τις δαπανηρές λειτουργίες (χρηματικές συναλλαγές, παραγωγή εκθέσεων), εξομαλύνει το φορτίο των εξαρτώμενων συστημάτων (βάσεις δεδομένων/πάροχοι). Ο καλός σχεδιασμός δίνει δικαιοσύνη, προβλεψιμότητα της καθυστέρησης και σαφείς SLO.
Βασικοί στόχοι
Σταθερότητα RPS και προστασία υπερφόρτωσης υποστήριξης.
Ελεγχόμενη «ελαστικότητα» (επίδομα διάρρηξης).
Διαφοροποίηση πελάτη (ανά χρήστη/ανά οργάνωση/ανά κλειδί/ανά IP/ανά περιφέρεια).
Υπόδειγμα αξίας: διαφορετικές «τιμές» για διαφορετικές συναλλαγές.
2) Οριακοί τύποι
Όρια RPS: αιτήσεις ανά δευτερόλεπτο/λεπτό.
Ποσοστώσεις: συνολικός προϋπολογισμός ανά περίοδο (ημέρα/μήνα).
Ανταγωνιστικότητα: ταυτόχρονη λειτουργία (checkout, βαριά απασχόληση).
Ρυθμός/λωρίδα Bytes/sec (φορτίο/εκφόρτωση).
Σταθμισμένα όρια: το «κόστος» της αίτησης λόγω πολυπλοκότητας (για παράδειγμα, πολυπλοκότητα GraphQL, μέγεθος παρτίδας).
Προσαρμοστική: αυστηρότερη σε περίπτωση ανωμαλιών (ύποπτη δραστηριότητα/σφάλματα 401/403/5xx).
3) Αλγόριθμοι και χρόνος εφαρμογής τους
3. 1 Σταθερό μετρητή παραθύρων
Απλό: μετρητής ανά διάστημα (π.χ. 100 r/min).
Επαγγελματίες: Ελάχιστο κόστος. Κατά: «εκρήξεις ακμών» στα σύνορα του παραθύρου.
Πότε: διοικητικά πάνελ, χαμηλή ακρίβεια, χαμηλό κόστος.
3. 2 Συρόμενο παράθυρο (log/μετρητής)
Log - αποθηκεύει χρονοσφραγίδες πρόσφατων αιτημάτων, ακριβείς, ακριβείς στη μνήμη.
Μετρητής: ο μέσος όρος δύο παρακείμενων παραθύρων (κύλιση), ένας συμβιβασμός ακρίβειας και τιμής.
Πότε: δημόσια API μεσαίας κυκλοφορίας, χρειάζεστε ομαλότητα χωρίς σύνθετα μαθηματικά.
3. Κουβάς Token
Παράμετροι: ρυθμός 'r' (μάρκες/sec) και χωρητικότητα 'b' (διάρρηξη). Κάθε αίτημα «καίει» τη μάρκα.
Υπέρ: επίδομα φυσικής διάρρηξης, απλή εφαρμογή. Cons: Δεν υπάρχει αυστηρή ομοιότητα.
Όταν: σχεδόν πάντα για RPS, εάν «βόλεϊ» χρειάζονται μέσα στο 'b'.
3. 4 Διαρροή κουβά (στάγδην)
Σειρά αναμονής από την οποία «διαρροές» σε σταθερή ταχύτητα.
Pros: ακόμη και ροή εξόδου. Κατά: Περισσότερες καθυστερήσεις.
Πότε: εξομάλυνση των εξωτερικών «ευάλωτων» παρόχων.
3. 5 GCRA (Αλγόριθμος γενικευμένου ρυθμού κυττάρων)
Θεωρητική ώρα άφιξης (TAT):- «TAT _ next = max (TAT_current, now) + 1/r», το αίτημα γίνεται δεκτό εάν «τώρα <= TAT_current + burst/r».
- Υπέρ: αυστηρή, ακριβής, μικρή μνήμη (διατήρηση TAT ανά κλειδί). Κατά: δυσκολότερο να κατανοηθεί.
Πότε: χρειάζεται αυστηρός έλεγχος και ομαλότητα, κατανεμημένα όρια.
3. 6 Ανταγωνιστικά semaphores
Μετρητής ενεργού λειτουργίας. είσοδος - εάν υπάρχουν «εισιτήρια»· έξοδος - απελευθέρωση.
Πότε: λειτουργίες μακράς λειτουργίας, νήματα, WebSocket, λήψεις.
4) Οριακό βασικό μοντέλο
Κλείδα = συνδυασμός χαρακτηριστικών:- 'client _ i /' api _ key '/' user _ i /' org _ i
- 'IP/ASN/geo' (ακατέργαστη προστασία)
- «τελικό σημείο/μέθοδος» (θερμές διαδρομές)
- 'scope/plan/tier' (νομιμοποίηση)
- 'idempotency _ key' (εγγραφή πράξεων)
- Χρησιμοποιήστε μια ιεραρχία: πρώτα αυστηρή ανά κλειδί, στη συνέχεια ανά οργάνωση, στη συνέχεια παγκόσμια.
5) Μοντέλο κόστους
Ορισμός του «κόστους» (ιζ):- GraphQL: πολυπλοκότητα πεδίου × βάθος.
- REST: μέγεθος απόκρισης/αίτησης, τύπος λειτουργίας (ανάγνωση = 1, εγγραφή = 3, αναφορά = 10).
- Παρτίδα: «κόστος = λεπτό (n, ανώτατο όριο)».
- Περιορίζουμε τις μάρκες, όχι τις «αιτήσεις»: «προϋπολογισμός - = κόστος (q)».
6) Κατανεμημένη εφαρμογή
6. 1 Θησαυροφυλάκια
Κατά τη διαδικασία: εξαιρετικά γρήγορο, αλλά όχι γενικό όριο (κατάλληλο για τοπικά «μαλακά» όρια).
Redis: de facto πρότυπο. INCR/ΛΗΞΗ, Lua scripts (ατομικότητα), ZSET για συρόμενο παράθυρο, πλήκτρα με TTL.
Απεσταλμένος/NGINX/Kong/Traefik: ενσωματωμένα φίλτρα. βολικό για την περίμετρο.
Service Mesh: τοπικά όρια για το sidecar + παγκόσμιο συγχρονισμό.
6. 2 Ατομικότητα και αγωνιστικά
Lua in Redis: έλεγχος και επαύξηση σε ένα βήμα.
GCRA: αποθήκευση ενός TAT με CAS/σενάριο.
Συνέπεια ρολογιού: NTP, χρονοδιακόπτες μονοτόνης.
Sharding: συνεπής hash ανά κλειδί· να αποφεύγονται τα «ζεστά» θραύσματα.
6. 3 Γεωγραφική κατανομή
Τοπικά όρια για τις περιφερειακές συσπειρώσεις + ανώτερες παγκόσμιες (χοντρές).
CRDT/αντιγραφή - προσεκτική (καθυστερήσεις, διπλή κατανάλωση). Τα περιφερειακά όρια με περιθώριο κέρδους είναι προτιμότερα.
7) Πολιτικές και ιεράρχηση προτεραιοτήτων
Σχέδια: Δωρεάν/Pro/Επιχειρήσεις με διαφορετικά «r», «b», ποσοστώσεις.
Προτεραιότητες: Οι «ακριβές» διαδρομές έχουν μικρότερο ή μεγαλύτερο κόστος.
Κατάλογοι: επιτρεπόμενη λίστα για ενσωμάτωση, απόρριψη από ASN/διαμεσολαβητή/TOP.
Κλιμάκωση: εάν το ξεπεράσετε ξανά, χαμηλώστε το όριο, εισάγετε την απόδειξη εργασίας/captcha/προκλήσεις.
8) Παραδείγματα ρυθμίσεων
8. 1 Απεσταλμένος (φίλτρο ορίου HTTP, ψευδο)
yaml rate_limit:
domain: public-api descriptors:
- key: api_key rate_limit:
unit: second requests_per_unit: 50 burst: 100
- key: api_key value: payments. write rate_limit:
unit: second requests_per_unit: 5 burst: 10
8. 2 NGINX (lua + Redis, ψευδο)
nginx lua_shared_dict limits 10m;
location /api/ {
access_by_lua_block {
local key = ngx. var. arg_apikey.. ":".. ngx. var. request_method.. ":".. ngx. var. uri
-- token bucket in Redis (evalsha)
local allowed, retry_after = ratelimit_allow(key, 50, 100) -- r=50/s, b=100 if not allowed then ngx. header["Retry-After"] = retry_after return ngx. exit(429)
end
}
proxy_pass http://backend;
}
8. 3 Όρια ανταγωνισμού (ψευδο-κωδικός)
pseudo on_request_start(key):
if redis. incr_with_ttl("sem:" + key, ttl=60) > MAX_CONCURRENCY:
redis. decr("sem:" + key); reject(429)
on_request_finish(key):
redis. decr("sem:" + key)
8. 4 GCRA (ψευδοκώδικας)
pseudo params: r tokens/sec, burst b tat = redis. get(key) or now allowed_time = tat - (b / r)
if now < allowed_time: reject(429, retry_after = allowed_time - now)
tat_next = max(tat, now) + 1/r redis. set(key, tat_next, ttl = ceil(b/r) + safety)
9) Ενσωμάτωση με retrays, timeouts και διακόπτη κυκλώματος
Retry-budget: περιορισμός του μεριδίου των retrays στο X% της κύριας κίνησης.
Όταν είναι εφεδρικό, πάντα προσθέτουμε νευρικότητα - μειώνει τις σύγχρονες εκρήξεις.
Διακόπτης κυκλώματος: εάν υπάρχει υψηλό σφάλμα ('5xx', timeouts), χαμηλώστε τα όρια ή μεταφέρετε μερικές από τις διαδρομές σε «μόνο ανάγνωση».
Αντιστάθμιση: καθαρή· να εξετάσει το κόστος για να αποφύγει τον διπλασιασμό του προϋπολογισμού σας.
10) Παρατηρησιμότητα και διαχείριση
: 'rps _ επιτρέπεται', 'rps _ blocked', '429 _ rate', 'retry _ after _ avg', 'burst _ used', 'requirement _ remained', 'active _ concurrency'.
Ετικέτες: με όριο κλειδί, περιοχή, τελικό σημείο, σχέδιο.
Αρχεία καταγραφής αποφάσεων (δειγματοληψία): αιτία βλάβης, μετρητές ρεύματος, κλειδί TTL.
Ταμπλό: κάρτες θερμότητας ανά κλειδιά/τελικά σημεία, «καυτοί» πελάτες.
Προειδοποιήσεις: αύξηση 429> 2-5% σε κρίσιμες διαδρομές, συχνή «εξάντληση» ποσοστώσεων, ανισορροπία θραυσμάτων.
11) Δοκιμή και επικύρωση
Συμβατικοί έλεγχοι των πολιτικών (εάν υπάρχουν πίνακες).
Φόρτωση: εκρήξεις (x10 από r), μακριές πλατείες, «βρώμικα» μοτίβα (αργή-POST, μακριές συνδέσεις).
Κυκλοφορία χάους: άνιση ροή, μετατόπιση ρολογιού, πτώση Redis/ματιών.
Συμπερίληψη A/B: όρια ελατηρίου καναρινιού, σκιώδη διαλύματα (log, αλλά δεν μπλοκάρουν) πριν από την ένταξη.
12) Κρούσματα άκρων και λεπτότητες
Ρολόι skew: Χρησιμοποιήστε το 'τώρα ()' από μία πηγή (server), όχι από κεφαλίδες πελατών.
Idempotency-Key: για γραφή - μειώνει την ενίσχυση σε retras.
Εργασίες κατά παρτίδες: περιορισμός του μεγέθους της παρτίδας και του συνολικού κόστους.
Long-poll/WebSocket: περιορισμός του αριθμού των καναλιών/συνδρομών και της διάρκειας.
Εκκίνηση εν ψυχρώ: «θερμή» εκκίνηση μετρητών/προφόρτωσης. ειδάλλως εκρήξεις ψευδών 429.
Υπολογιστικά ακριβά αιτήματα: περιορισμός στην εκτέλεση της επιχειρηματικής λογικής.
Τα όρια TTL: TTL των κλειδιών πρέπει να καλύπτουν το περιθώριο ασφαλείας παραθύρου +.
13) Κλιμακώσεις αντισωμάτων
Στάδια: προειδοποίηση → 429 + 'Retry-After' → challenge (captcha/puzzle) → προσωρινό μπλοκ.
Σήματα: δακτυλικά αποτυπώματα συσκευής, συμπεριφορά δρομέα/χρονισμού, TOR/διαμεσολαβητή/φιλοξενία.
Οι πολιτικές πρέπει να είναι καθοριστικές και αναπαραγώγιμες για την εγκληματολογία.
14) Ασφάλεια και συμμόρφωση
Άρνηση εξ ορισμού σε κρίσιμες διαδρομές (εγγραφή/χρηματοδότηση).
Έλεγχος: διατήρηση των αποφάσεων σχετικά με τα όρια για τις κανονιστικές υποθέσεις και την επανεξέταση συμβάντων.
PII: οι περιορισμένες κλείδες δεν πρέπει να αποκαλύπτουν προσωπικά δεδομένα σε αρχεία καταγραφής.
15) Κατάλογος ελέγχου ετοιμότητας Prod
- Ορίζονται οι οριακές κλείδες και το μοντέλο κόστους.
- Επιλεγμένος αλγόριθμος (συμβολικός κουβάς/GCRA) και αποθήκευση (Redis/πύλη).
- Πολιτικές για πελάτες της βαθμίδας + παγκόσμιες ασφάλειες.
- Ανταγωνιστικά όρια για μακροπρόθεσμες συναλλαγές.
- Retry-budget, backoff με νευρικότητα, ενσωμάτωση με διακόπτη κυκλώματος.
- Ταμπλό/ειδοποιήσεις, αρχεία καταγραφής αποφάσεων δειγματοληψίας.
- Canary on and shadow mode.
- Δοκιμασίες εκρήξεων, μακρών πλατέων, βλάβες Redis, ρολόι skew.
- Τεκμηρίωση πελατών: 429, κωδικοί 'Retry-After', εκθετικά παραδείγματα backoff.
16) TL· DR
Χρήση συμβολικού κουβά ή GCRA με Redis/πύλη, περιορισμένα πλήκτρα σχεδιασμού και κόστος αιτήματος, προσθήκη ανταγωνιστικών semaphores για μακρινές λειτουργίες, ενσωμάτωση με retry-budget και διακόπτη κυκλώματος, παρακολούθηση 429 και «ικανότητα διάρρηξης», τα όρια εξάπλωσης μέσω καναριού/σκιάς και βεβαιωθείτε ότι θα δοκιμάσετε εκρήξεις και βλάβη αποθήκευση