Kürzlich erhielt ich Interview-Feedback von mehreren Internetnutzern, und allen wurden während des Interviews aktuelle BegrenzungsfragenFragen zur Strombegrenzung gestellt. Lassen Sie uns heute über verschiedene aktuelle Begrenzungslösungen in unserem Projekt sprechen.
Für allgemeine Strombegrenzungsszenarien gibt es zwei Dimensionenvon Informationen:
Für (
Verbindungen Für Daten) Strombegrenzung können wir die Strombegrenzung in der IP-Dimension festlegen, oder wir können die Strombegrenzung basierend auf einem einzelnen Server festlegen. Bilder
Jeder kennt die „Übertragungsrate“, beispielsweise die Download-Geschwindigkeit von Ressourcen. Einige Websites verfügen in diesem Bereich über eine detailliertere aktuelle Begrenzungslogik. Beispielsweise beträgt die Download-Geschwindigkeit für normale registrierte Benutzer 100.000/s und nach dem Erwerb einer Mitgliedschaft 10 Mio./s. Dahinter steckt die aktuelle Begrenzungslogik, die auf Benutzergruppen basiert oder Benutzer-Tags.
Schwarze und weiße Listen sind ein weit verbreitetes Mittel zur Begrenzung und Freigabe des Datenverkehrs in großen Unternehmensanwendungen, und schwarze und weiße Listen ändern sich oft dynamisch. Wenn beispielsweise eine IP in einem bestimmten Zeitraum zu häufig besucht wurde und vom System als Roboterbenutzer oder Verkehrsangriff identifiziert wird, wird die IP zur Blacklist hinzugefügt, wodurch ihr Zugriff auf Systemressourcen eingeschränkt wird was wir allgemein als „IP-Blockierung“ bezeichnen.
Die Crawler-Programme, die wir normalerweise sehen, wie das Crawlen von Bildern schöner Frauen auf Zhihu oder das Crawlen von Aktien-Timesharing-Informationen auf Brokerage-Systemen, müssen die Funktion zum Ändern der IP implementieren, um zu verhindern, dass sie zur schwarzen Liste hinzugefügt werden.
Manchmal stellen wir auch fest, dass das Netzwerk des Unternehmens nicht auf große öffentliche Websites wie 12306 zugreifen kann. Dies liegt auch daran, dass die ausgehenden IP-Adressen einiger Unternehmen dieselbe Adresse haben. Wenn die Anzahl der Besuche zu hoch ist, wird dies auch der Fall sein vom System identifiziert und dann zur Sperrliste hinzugefügt werden. Studenten, die Breitband zu Hause nutzen, sollten wissen, dass die meisten Netzwerkbetreiber Benutzer verschiedenen ausgehenden IP-Segmenten zuweisen oder die IP-Adresse des Benutzers von Zeit zu Zeit dynamisch ändern.
Die Whitelist ist einfacher zu verstehen. Sie ist gleichbedeutend mit einer Goldmedaille, die von der königlichen Familie verliehen wird. Sie können sich ungehindert durch verschiedene aktuelle Begrenzungsregeln bewegen. Einige E-Commerce-Unternehmen fügen beispielsweise die Konten sehr großer Verkäufer zur Whitelist hinzu, da diese Verkäufer häufig über eigene Betriebs- und Wartungssysteme verfügen und eine Schnittstelle zum IT-System des Unternehmens benötigen, um eine große Anzahl von Produktfreigaben und Nachbeständen durchzuführen , usw. Durchsuchen Sie außerdem das Backend des öffentlichen Kontos Programming Technology Circle und antworten Sie mit „Java“, um ein Überraschungsgeschenkpaket zu erhalten.
Verteilt unterscheidet sich vom Strombegrenzungsszenario auf einer einzelnen Maschine. Es berücksichtigt alle Server in der gesamten verteilten Umgebung als Ganzes. Für die IP-Strombegrenzung begrenzen wir beispielsweise eine IP auf maximal 10 Besuche pro Sekunde. Unabhängig davon, auf welchen Computer die Anfrage von dieser IP gelangt, unterliegt sie nur dem Zugriff auf den Serviceknoten im Cluster Strombegrenzung. Durch Regeln eingeschränkt.
Wir sollten die Strombegrenzungsinformationen besser in einer „zentralen“ Komponente speichern, damit sie den Zugriffsstatus aller Maschinen im Cluster erhalten kann. Derzeit gibt es zwei gängige Strombegrenzungslösungen:
Token-Bucket-Algorithmus Der Token-Bucket-Algorithmus ist derzeit der am weitesten verbreitete Strombegrenzungsalgorithmus und hat die folgenden zwei Schlüsselrollen:
Es ist nicht schwer, anhand ihrer jeweiligen Eigenschaften zu erkennen, dass beide Algorithmen eine „konstante“ Rate und eine „unbestimmte“ Rate haben. Der Token-Bucket erstellt Token mit einer konstanten Rate, aber die Rate, mit der Zugriffsanfragen Token erhalten, ist „nicht festgelegt“. Wie auch immer, es werden so viele Token ausgegeben, und wenn die Token weg sind, werden sie einfach warten. Der Leaky-Bucket verarbeitet Anfragen mit einer „konstanten“ Rate, aber die Rate, mit der diese Anfragen in den Bucket fließen, ist „variabel“.
Anhand dieser beiden Eigenschaften bestimmen die natürlichen Eigenschaften des Leaky-Buckets, dass er keinen Burst-Verkehr hat. Selbst wenn 1.000 Anfragen pro Sekunde eingehen, bleibt seine Zugriffsrate auf die Hintergrunddienstausgabe immer konstant. Der Token-Bucket ist anders. Seine Funktion kann eine bestimmte Menge an Token vorspeichern, wenn er plötzlichen Datenverkehr verarbeitet Bucket, aber es wird auch der Druck auf das Backend-System entsprechend erhöht.
Wenn wir beispielsweise 5 Benutzer pro Sekunde und 10 Benutzer innerhalb der 5. Sekunde haben, beträgt die Anzahl der Besuche im Zeitfenster von 0 bis 5 Sekunden 15. Wenn unsere Schnittstelle die Obergrenze des Zugriffs innerhalb des Zeitfensters auf 20 festlegt, beträgt die Gesamtzahl in diesem Zeitfenster 10, wenn die Zeit die sechste Sekunde erreicht, da das 1-Sekunden-Raster das Zeitfenster verlassen hat, also in Die Zahl der Besuche, die innerhalb der sechsten Sekunde empfangen werden können, beträgt 20-10=10.
Das Schiebefenster ist eigentlich ein Rechneralgorithmus. Es hat eine Besonderheit, wenn die Zeitspanne länger ist, wird der Strombegrenzungseffekt gleichmäßiger. Wenn das aktuelle Zeitfenster beispielsweise nur zwei Sekunden beträgt und sich alle Zugriffsanforderungen auf die erste Sekunde konzentrieren, kann sich die Anzahl der aktuellen Fenster erheblich ändern, wenn die Zeit um eine Sekunde zurückgeschoben wird. Eine Verlängerung des Zeitfensters kann die Wahrscheinlichkeit verringern davon
Wie Verifizierungscode, IP-Blacklist usw. Diese Mittel können böswillige Angriffe und Crawler-Erfassung wirksam verhindern;
Im Bereich der Strombegrenzung bietet Guava im Rahmen seines Multithreading-Moduls einen Anmeldedienst an, wenn ich beispielsweise den Datenverkehr der beiden steuern möchte Maschinen werden innerhalb von 20 pro Sekunde gesteuert. Wenn Sie Guava verwenden, können Sie nur die Anzahl der Besuche jeder Maschine unabhängig voneinander steuern RateLimiter为首的几个限流支持类,但是作用范围仅限于“当前”这台服务器,也就是说Guawa的限流是单机的限流,跨了机器或者jvm进程就无能为力了比如说,目前我有2台服务器[Server 1
,Server 2
Obwohl Guava keine Lösung für verteilte Systeme ist, ist es als einfache und leichte clientseitige Strombegrenzungskomponente sehr gut geeignet, den Strombegrenzungsalgorithmus zu erklären.
Nginx bietet zwei Methoden zur Strombegrenzung: eine zur Steuerung der Rate und Die andere besteht darin, die Anzahl gleichzeitiger Verbindungen zu steuern.
Kontrollieren Sie die RateWir müssen verwenden, um die Anzahl der Anfragen pro Zeiteinheit zu begrenzen, d Konvertieren Sie es Das heißt, eine einzelne IP darf nur eine Anfrage innerhalb von 500 Millisekunden weiterleiten, und die zweite Anfrage darf erst ab 501 ms weitergegeben werden.
Optimierte Version der Ratenkontrolle
Obwohl die obige Ratenkontrolle sehr genau ist, ist sie in einer Produktionsumgebung zu streng. In tatsächlichen Situationen sollten wir die Gesamtzahl der Zugriffe in einer IP-Einheit kontrollieren Die Gesamtzeit ist nicht wie oben, sondern auf Millisekunden genau. Wir können das Schlüsselwort „burst“ verwenden, um diese Einstellung zu aktivieren
burst=4
意思是每个IP最多允许4个突发请求
控制并发数
利用 limit_conn_zone
和 limit_conn
两个指令即可控制并发数
其中 limit_conn perip 10
表示限制单个 IP 同时最多能持有 10 个连接;limit_conn perserver 100
Kontrollieren Sie die Anzahl der ParallelitätVerwenden Sie
limit_conn_zone
und limit_conn perserver 100
bedeutet, dass der Server insgesamt 100 gleichzeitige Verbindungen gleichzeitig verarbeiten kann. Hinweis: Diese Verbindung wird erst gezählt, nachdem der Anforderungsheader vom Backend verarbeitet wurde.
Middleware-Strombegrenzung
Für eine verteilte Umgebung ist es nichts anderes als ein zentraler knotenähnlicher Ort zum Speichern der strombegrenzten Daten. Wenn ich beispielsweise möchte, dass die Zugriffsrate der Steuerschnittstelle 100 Anfragen pro Sekunde beträgt, muss ich die Anzahl der innerhalb der aktuellen 1 Sekunden empfangenen Anfragen irgendwo speichern und allen Knoten in der Clusterumgebung den Zugriff ermöglichen. Mit welcher Technologie können wir diese temporären Daten speichern?
Daher muss jeder gedacht haben, dass es Redis sein muss. Mit der Ablaufzeitfunktion von Redis können wir ganz einfach die Zeitspanne des aktuellen Limits festlegen (z. B. 10 Anfragen pro Sekunde oder 10 Anfragen alle 10 Sekunden). Gleichzeitig verfügt Redis auch über eine besondere Fähigkeit – die Skriptprogrammierung. Wir können die aktuelle Begrenzungslogik in ein Skript einbetten. Dadurch ist die aktuelle Begrenzungsverantwortung vollständig von der Serviceschicht getrennt Leistungsstarke Parallelitätseigenschaften und hohe Die verfügbare Clusterarchitektur kann auch den aktuell begrenzten Zugriff auf große Cluster (Reids + Lua
) gut unterstützen. 🎜🎜🎜Strombegrenzende Komponenten🎜🎜🎜Zusätzlich zu den oben vorgestellten Methoden gibt es derzeit einige Open-Source-Komponenten, die ähnliche Funktionen bereitstellen, wie z. B. Sentinel, was eine gute Wahl ist. Sentinel ist eine von Alibaba produzierte und in der Spring Cloud Alibaba-Komponentenbibliothek enthaltene Open-Source-Komponente. Sentinel bietet einen umfangreichen Satz an APIs und visuellen Verwaltungskonsolen für die Strombegrenzung, die uns bei der einfachen Verwaltung der Strombegrenzung helfen könnenIn realen Projekten wird häufig nur eine strombegrenzende Methode verwendet. Mehrere Methoden werden häufig in Verbindung miteinander verwendet, um der strombegrenzenden Strategie ein Gefühl der Hierarchie zu verleihen und das zu erreichen maximale Ausnutzung der Ressourcen. In diesem Prozess kann sich das Design der Strombegrenzungsstrategie auch auf das zuvor erwähnte Trichtermodell beziehen, das oben breit und unten eng ist. Auf das Design des Strombegrenzungsschemas für verschiedene Teile des Trichters sollte geachtet werden die hohe Verfügbarkeit der aktuellen Komponenten.
Nehmen Sie als Beispiel das tatsächliche Projekt, an dem ich teilgenommen habe. Durch die mobile Taobao-Umleitung werden Zugriffsanfragen zunächst über das MTOP-Gateway von Alibaba geleitet Unsere aktuelle Begrenzung erfolgt relativ locker. Warten Sie, bis die Anforderung über das Gateway den Back-End-Produktdetailseitendienst erreicht, und verwenden Sie dann eine Reihe von Middleware- und Strombegrenzungskomponenten, um eine detailliertere Strombegrenzungssteuerung für den Dienst durchzuführen
1) Tomcat verwendet maxThreads, um die Strombegrenzung zu implementieren.
2) Nginx's limit_req_zone
和 burst来实现速率限流。
3)Nginx的limit_conn_zone
和 limit_conn
两个指令控制并发连接的总数。
4)时间窗口算法借助 Redis的有序集合可以实现。
5)漏桶算法可以使用Redis-Cell来实现。
6)令牌算法可以解决Google的guava包来实现。
需要注意的是借助Redis实现的限流方案可用于分布式系统,而guava实现的限流只能应用于单机环境。如果你觉得服务器端限流麻烦,可以在不改任何代码的情况下直接使用容器限流(Nginx或Tomcat),但前提是能满足项目中的业务需求。
Tomcat 8.5 版本的最大线程数在 conf/server.xml
limit_conn
Die beiden Anweisungen steuern die Gesamtzahl gleichzeitiger Verbindungen . 4) Der Zeitfensteralgorithmus kann mithilfe der geordneten Sammlung von Redis implementiert werden. 🎜🎜5) Der Leaky-Bucket-Algorithmus kann mit Redis-Cell implementiert werden. 🎜🎜6) Der Token-Algorithmus kann durch Lösen des Guava-Pakets von Google implementiert werden. 🎜Es ist zu beachten, dass das aktuelle Begrenzungsschema mit Redis implementiert werden kann Verwendete verteilte Systeme, und die von guava implementierte Strombegrenzung kann nur auf eine eigenständige Umgebung angewendet werden. Wenn Sie die serverseitige Strombegrenzung als problematisch empfinden, können Sie die Container-Strombegrenzung (Nginx oder Tomcat) direkt verwenden, ohne Code zu ändern, aber nur, wenn sie die Geschäftsanforderungen des Projekts erfüllen kann. 🎜
Der Wert von maxThreads kann standardmäßig auf 150 erhöht werden (Tomcat-Version 8.5), aber dieser Wert ist nicht größer, desto besser. Es ist zu beachten, dass jeder gestartete Thread 1 MB verbraucht. Der JVM-Speicherplatz wird als Thread-Stapel verwendet. Je mehr Threads vorhanden sind, desto höher ist die GC-Belastung.
Abschließend ist zu beachten, dass das Betriebssystem bestimmte Einschränkungen hinsichtlich der Anzahl der Threads in einem Prozess hat. Die Anzahl der Threads in jedem Prozess von Windows darf 2000 nicht überschreiten, und die Anzahl der Threads in jedem Prozess von Linux darf 1000 nicht überschreiten.
Das obige ist der detaillierte Inhalt vonVerstehen Sie Strombegrenzungen und gängige Lösungen in zehn Minuten!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!