Ιστολόγιο

Περιορίζαμε τις δικές μας υπηρεσίες

Το API του Mythex επιτρέπει 300 αιτήματα τον λεπτό από μία διεύθυνση δικτύου. Αυτό το όριο υπάρχει για να μας προστατεύει από έναν άνθρωπο ή ένα script που βομβαρδίζει το API. Στην παραγωγή, άρχισε να αρνείται τις δικές μας υπηρεσίες — το κομμάτι του edge που σερβίρει δημοσιευμένες εφαρμογές και την υπηρεσία που τρέχει τον πράκτορα τεχνητής νοημοσύνης — επειδή καθεμία από αυτές φτάνει στο API από μόλις λίγες διευθύνσεις. Τα αιτήματα που φέρουν το εσωτερικό μας διαπιστευτήριο εξαιρούνται τώρα, και όλοι οι άλλοι περιορίζονται ακριβώς όπως πριν.

Το σύμπτωμα

Το API άρχισε να απαντά σε ορισμένες από τις δικές μας εσωτερικές κλήσεις με 429 Too Many Requests. Χτυπήθηκαν τρία είδη κλήσεων, και καθένα αφορά κάποιον που χρησιμοποιεί το Mythex:

  • Αναζήτηση ποια εφαρμογή βρίσκεται σε προσαρμοσμένο domain. Όταν ένας επισκέπτης ανοίγει μια δημοσιευμένη εφαρμογή στο δικό της domain, το edge μας ρωτά το API πού βρίσκεται αυτός ο ιστότοπος. Ένα 429 εκεί σημαίνει επισκέπτης που δεν μπορεί να φτάσει σε ιστότοπο.
  • Αποθήκευση μιας σειράς πράκτορα που τρέχει. Καθώς δουλεύει ο πράκτορας, η πρόοδός του αποθηκεύεται όσο προχωρά, ώστε μια απάντηση να επιζεί από ανανέωση ή κομμένη σύνδεση. Ένα 429 εκεί σημαίνει πρόοδος που δεν αποθηκεύτηκε.
  • Έλεγχος πρόσβασης σε προεπισκόπηση. Η προεπισκόπηση μιας εφαρμογής που χτίζετε είναι προστατευμένη, και η πύλη ρωτά το API. Ένα 429 εκεί σημαίνει προεπισκόπηση που δεν ανοίγει.

Καμία από αυτές δεν ήταν άνθρωποι που καλούσαν το API. Όλες ήμασταν εμείς.

Γιατί συνέβη

Ένα όριο ανά διεύθυνση κάνει μία βασική υπόθεση: μία διεύθυνση είναι περίπου ένας καλών. Για ανθρώπους, αυτό είναι αρκετά κοντά. Για τη δική μας υποδομή, είναι λάθος.

  • Η υπηρεσία edge που σερβίρει δημοσιευμένες εφαρμογές και προεπισκοπήσεις φτάνει στο API από λίγες κοινές διευθύνσεις εξόδου. Κάθε επισκέπτης κάθε δημοσιευμένης εφαρμογής, και κάθε έλεγχος προεπισκόπησης, φαίνεται ότι προέρχεται από μία από αυτές τις λίγες.
  • Ο ενορχηστρωτής — η υπηρεσία που τρέχει τις σειρές του πράκτορα — φτάνει στο API από μία διεύθυνση container. Κάθε σειρά που τρέχει, για κάθε χρήστη, μοιράζεται αυτή τη διεύθυνση.

Άρα ο προϋπολογισμός που προοριζόταν για έναν άνθρωπο μοιραζόταν σε όλη την κίνηση μιας ολόκληρης υπηρεσίας. Αυτές οι υπηρεσίες τον εξαντλούσαν μεταξύ τους, και ο περιοριστής έκανε αυτό που του είπαμε: τις απέρριπτε.

Η διόρθωση

Οι δικές μας υπηρεσίες ήδη αποδεικνύουν ποιες είναι. Κάθε εσωτερική κλήση φέρει ένα εσωτερικό διακριτικό, και κάθε διαδρομή κάτω από την εσωτερική ενότητα του API ελέγχει αυτό το διακριτικό πριν κάνει οτιδήποτε.

Ο περιοριστής αιτημάτων χρησιμοποιεί τώρα τον ίδιο έλεγχο. Ένα αίτημα του οποίου το διακριτικό ταιριάζει με το εσωτερικό βρίσκεται σε λίστα επιτρεπόμενων και δεν μετράει στον προϋπολογισμό ανά διεύθυνση. Όλα τα υπόλοιπα μετρούνται ακριβώς όπως πριν: 300 αιτήματα τον λεπτό ανά διεύθυνση.

Δύο λεπτομέρειες εμπόδισαν αυτό να γίνει τρύπα:

  1. Ένα λάθος διακριτικό δεν παίρνει εξαίρεση. Η λίστα επιτρεπόμενων ταιριάζει μόνο με το πραγματικό εσωτερικό διακριτικό. Ένα αίτημα με κατασκευασμένο διακριτικό μετράει και περιορίζεται όπως κάθε άλλο, και οι εσωτερικές διαδρομές το απορρίπτουν με 401 Unauthorized.
  2. Το ίδιο το όριο δεν άλλαξε. Δεν ανεβάσαμε τον αριθμό για να χωρέσουμε το πρόβλημα. Η αύξηση θα είχε κρύψει το πρόβλημα μέχρι να αυξηθεί ξανά η κίνηση, και θα είχε αποδυναμώσει την προστασία για την περίπτωση για την οποία υπάρχει το όριο.

Μεταφέραμε τις ρυθμίσεις του περιοριστή σε μία μικρή συνάρτηση και γράψαμε τεστ εναντίον της. Το ένα στέλνει 20 αιτήματα με το εσωτερικό διακριτικό σε περιοριστή που επιτρέπει 5, και περιμένει να περάσουν και τα 20. Ένα άλλο στέλνει απλά αιτήματα από μία διεύθυνση και περιμένει να περάσουν τα πρώτα πέντε και να απορριφθούν τα επόμενα. Ένα τρίτο στέλνει αιτήματα με πλαστό διακριτικό και περιμένει να απορριφθούν με τον ίδιο τρόπο.

Τι κρατήσαμε από όλο αυτό

  • Τα όρια έχουν υποθέσεις. Το «μία διεύθυνση, ένας καλών» είναι ενσωματωμένο σε ένα όριο ανά διεύθυνση. Παύει να ισχύει μόλις οι δικές σας υπηρεσίες βρίσκονται πίσω από κοινές διευθύνσεις — και πολλές βρίσκονται: load balancers, δίκτυα edge, containers, δίκτυα γραφείων.
  • Ξεχωρίστε την δική σας κίνηση με βάση την ταυτότητα, όχι τη διεύθυνση. Οι διευθύνσεις είναι ο τρόπος που φτάνει η κίνηση, όχι ποιος την έστειλε. Είχαμε ήδη ένα διαπιστευτήριο που αποδεικνύει ότι μια κλήση είναι δική μας· ο περιοριστής απλώς δεν το κοίταζε.
  • Μην το διορθώνετε ανεβάζοντας τον αριθμό. Ένα μεγαλύτερο όριο θα είχε εξαφανίσει τα 429 για λίγο, θα προστάτευε λιγότερο, και θα είχε αποτύχει ξανά αργότερα.
  • Κοιτάξτε ποιος περιορίζεται. Ένα 429 που πέφτει στη δική σας υπηρεσία είναι αναφορά σφάλματος για τα όριά σας, όχι ένδειξη ότι ο περιοριστής δουλεύει.

Τι σημαίνει αν χτίζετε στο Mythex

Τίποτα να αλλάξετε από την πλευρά σας. Οι δημοσιευμένες εφαρμογές σε προσαρμοσμένα domain, οι σειρές πράκτορα και οι προεπισκοπήσεις δεν εξαρτώνται πια από το πόσο απασχολημένο είναι το υπόλοιπο Mythex. Η κίνηση της δικής σας εφαρμογής είναι δική σας υπόθεση: το όριο που περιγράφεται εδώ αφορά το API μας, όχι τις εφαρμογές που δημοσιεύετε.

Αν τρέχετε δικό σας backend, η ίδια παγίδα ισχύει για κάθε όριο ρυθμού που προσθέτετε. Οι οδηγοί μας για τι είναι ένα API και τη λίστα ελέγχου ασφαλείας για εφαρμογές που χτίζονται με AI είναι καλό σημείο εκκίνησης. Και για άλλη μια περίπτωση όπου η δική μας υποδομή μπλόκαρε τον εαυτό της, δείτε πώς φτάσαμε σε μηδέν σφάλματα 502 στις αναπτύξεις.

Mythex · Pricing · Χτίστε οτιδήποτε με AI · Πρότυπα ιστοσελίδων και εφαρμογών · Το Mythex σε σύγκριση · Γλωσσάρι δημιουργίας εφαρμογών με AI · Δωρεάν εργαλεία δημιουργίας εφαρμογών με AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)