{"id":24389,"date":"2026-09-16T11:47:45","date_gmt":"2026-09-16T11:47:45","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/gubernator-cloud-native-distributed-rate-limiting-microservices-2\/"},"modified":"2026-09-16T11:47:45","modified_gmt":"2026-09-16T11:47:45","slug":"gubernator-cloud-native-distributed-rate-limiting-microservices","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/","title":{"rendered":"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mailgun freut sich, heute  <a href=\"https:\/\/github.com\/mailgun\/gubernator\" target=\"_tabs\" rel=\"noopener noreferrer\">Gubernator<\/a> als Open Source bereitzustellen \u2013 einen hochleistungsf\u00e4higen, verteilten Rate-Limiting-Microservice. Was macht Gubernator? Gute Frage:<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-7949\"><p class=\"h5 m-0\" id=\"toc-title-7949\">Inhaltsverzeichnis<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#funktionen-von-gubernator\">Funktionen von Gubernator<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#warum-nicht-redis-nutzen\">Warum nicht Redis nutzen?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#warum-ein-microservice\">Warum ein Microservice?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#warum-ist-gubernator-zustandslos\">Warum ist Gubernator zustandslos?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wie-gubernator-funktioniert\">Wie Gubernator funktioniert<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#betrieb-von-gubernator\">Betrieb von Gubernator<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#globales-verhalten\">Globales Verhalten<\/a><a class=\"scrollme link-body-color\" href=\"#nebeneffekte-des-globalen-verhaltens\">Nebeneffekte des globalen Verhaltens<\/a><a class=\"scrollme link-body-color\" href=\"#gubernator-leistung\">Gubernator-Leistung<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#gubernator-als-bibliothek\">Gubernator als Bibliothek<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#fazit\">Fazit<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Funktionen von Gubernator<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren.\u00a0<\/li>\n\n\n\n<li>Gubernator ist nicht auf externe Caches wie Memcache oder Redis angewiesen. Daher gibt es keine Deployment-Synchronisierung mit einem abh\u00e4ngigen Dienst. Dies macht die dynamische Vergr\u00f6\u00dferung oder Verkleinerung des Clusters in einem Orchestrierungssystem wie Kubernetes oder Nomad zu einer trivialen Angelegenheit.<\/li>\n\n\n\n<li>Gubernator speichert keinen Zustand auf der Festplatte. Die Konfiguration wird pro Anfrage vom Client \u00fcbergeben.<\/li>\n\n\n\n<li>Gubernator bietet sowohl GRPC- als auch HTTP-Zugang zu seiner API.<\/li>\n\n\n\n<li>L\u00e4sst sich als Sidecar f\u00fcr Dienste, die Rate-Limiting ben\u00f6tigen, oder als separater Dienst ausf\u00fchren.<\/li>\n\n\n\n<li>L\u00e4sst sich als Bibliothek verwenden, um einen dom\u00e4nenspezifischen Rate-Limiting-Dienst zu implementieren.<\/li>\n\n\n\n<li>Unterst\u00fctzt optional eine Eventually-Consistent-Verteilung von Rate-Limits f\u00fcr Umgebungen mit extrem hohem Durchsatz.\u00a0<\/li>\n\n\n\n<li>Gubernator ist die  <a href=\"https:\/\/www.google.com\/search?q=how+to+say+governor+in+russian&amp;oq=how+to+say+govener+in+russ\" target=\"_tabs\" rel=\"noopener noreferrer\">englische Aussprache des russischen Worts f\u00fcr Gouverneur<\/a> \u2013 und es klingt einfach cool.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Sicherlich haben Sie viele Fragen dazu, <b>warum wir uns entschieden haben, Gubernator als Open Source bereitzustellen<\/b>. Bevor wir also darauf eingehen, wie Gubernator funktioniert, lassen Sie uns zun\u00e4chst einige dieser Fragen beantworten. Die wichtigste Frage, die Sie sich wahrscheinlich stellen, ist&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum nicht Redis nutzen?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Evaluierung von Redis sind uns einige Dinge aufgefallen.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Die Nutzung der  <a href=\"https:\/\/redislabs.com\/redis-best-practices\/basic-rate-limiting\/\" target=\"_tabs\" rel=\"noopener noreferrer\">grundlegenden Rate-Limit-Implementierung von Redis<\/a>  w\u00fcrde zus\u00e4tzliche Netzwerk-Roundtrips verursachen, selbst mit  <a href=\"https:\/\/redis.io\/topics\/pipelining\" target=\"_tabs\" rel=\"noopener noreferrer\">Pipelining<\/a>. <\/li>\n\n\n\n<li>Wir k\u00f6nnten die Roundtrips reduzieren, indem wir  <a href=\"https:\/\/redis.io\/commands\/eval\" target=\"_tabs\" rel=\"noopener noreferrer\">https:\/\/redis.io\/commands\/eval<\/a>  nutzen und ein LUA-Skript schreiben, das wir f\u00fcr jeden implementierten Algorithmus pflegen m\u00fcssten.<\/li>\n\n\n\n<li>Jede einzelne Anfrage w\u00fcrde zu mindestens einem Roundtrip zu Redis f\u00fchren. Kombiniert mit mindestens einem Roundtrip zu unserem Microservice bedeutet dies mindestens zwei Roundtrips pro Anfrage an unseren Dienst.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Die optimale L\u00f6sung f\u00fcr Redis besteht darin, ein LUA-Skript zu schreiben, das den Rate-Limit-Algorithmus implementiert.\u00a0 Dieses Skript wird dann auf dem Redis-Server gespeichert und f\u00fcr jede Rate-Limit-Anfrage aufgerufen. In diesem Szenario wird die meiste Arbeit von Redis erledigt und unser Microservice fungiert im Grunde als Proxy f\u00fcr den Zugriff auf Redis. Da dies der Fall ist, haben wir zwei Optionen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gubernator als Rate-Limit-Bibliothek erstellen, die Zugriff auf Redis bietet. Diese Bibliothek w\u00fcrde von jedem Dienst verwendet werden, der Rate-Limiting ben\u00f6tigt.\u00a0<\/li>\n\n\n\n<li>Redis eliminieren und die Verteilungs-, Caching- und Limiting-Algorithmen in einem Rate-Limiting-Microservice implementieren, der einen schlanken GRPC-Client f\u00fcr die Nutzung durch jeden Dienst bereitstellt.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Warum ein Microservice?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun ist ein polyglottes Unternehmen, wobei Python und Golang den Gro\u00dfteil unserer Codebasis ausmachen. Wenn wir uns entscheiden, Rate-Limiting als Bibliothek zu implementieren, erfordert dies mindestens eine Python- und eine Golang-Version der Bibliothek. <b>Wir sind diesen Weg intern bereits mit einer Python- und Golang-Version derselben Bibliothek gegangen.<\/b> Unserer Erfahrung nach haben gemeinsam genutzte Bibliotheken \u00fcber verschiedene Dienste hinweg die folgenden Nachteile.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Fehlerbehebungen und Funktionsupdates in der Bibliothek erfordern im besten Fall ein Update der Abh\u00e4ngigkeit. Im schlimmsten Fall sind \u00c4nderungen an allen Diensten erforderlich, die die Bibliothek verwenden, und zwar in allen unterst\u00fctzten Sprachen.<\/li>\n\n\n\n<li>Selten m\u00f6chte das Entwicklungsteam neue Funktionen in beiden Sprachen pflegen oder schreiben. Dies f\u00fchrt in der Regel dazu, dass eine Version der Bibliothek mehr Funktionen aufweist oder besser gepflegt wird als die andere.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Da die Anzahl der Microservices und Sprachen in unserem \u00d6kosystem weiter w\u00e4chst, summieren sich diese Probleme und verschlimmern sich. Im Vergleich dazu lassen sich GRPC- und HTTP-Bibliotheken f\u00fcr jede Sprache, die Zugriff auf Gubernator ben\u00f6tigt, leicht erstellen und pflegen.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei Microservices <b>k\u00f6nnen Fehlerbehebungen und neue Funktionen ohne Unterbrechung abh\u00e4ngiger Dienste hinzugef\u00fcgt werden<\/b>. Solange Breaking Changes an der API nicht zul\u00e4ssig sind, k\u00f6nnen abh\u00e4ngige Dienste neue Funktionen aktivieren, ohne dass alle abh\u00e4ngigen Dienste aktualisiert werden m\u00fcssen.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das wichtigste Merkmal von Gubernator als Microservice ist, dass er einen Synchronisationspunkt f\u00fcr die vielen Anfragen schafft, die in das System gelangen. Anfragen, die innerhalb von wenigen Mikrosekunden eingehen, lassen sich optimieren und in Batches (Stapel) zusammenfassen. Dies reduziert die Gesamtbandbreite und die Roundtrip-Latenz, die der Dienst unter hoher Last aufweist. Mehrere Dienste, die alle auf einem einzigen Host laufen und bei denen dieselbe Bibliothek in ihren jeweiligen Prozessen ausgef\u00fchrt wird, verf\u00fcgen nicht \u00fcber diese F\u00e4higkeit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum ist Gubernator zustandslos?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gubernator ist zustandslos, da f\u00fcr den Betrieb kein Speicherplatz auf der Festplatte erforderlich ist. Es werden niemals Konfigurations- oder Cache-Daten auf die Festplatte synchronisiert. Das liegt daran, dass jede Anfrage an Gubernator die Konfiguration f\u00fcr das Rate-Limit enth\u00e4lt.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst k\u00f6nnte man meinen, dies bedeute einen unn\u00f6tigen Overhead f\u00fcr jede Anfrage. In der Realit\u00e4t besteht eine Rate-Limit-Konfiguration jedoch nur aus vier 64-Bit-Ganzzahlen. Die Konfiguration setzt sich aus Limit, Duration (Dauer), Algorithm (Algorithmus) und Behavior (Verhalten) zusammen (siehe unten f\u00fcr Details zur Funktionsweise). Gerade aufgrund dieser einfachen Konfiguration <b>kann Gubernator genutzt werden, um eine Vielzahl von Rate-Limit-Anwendungsf\u00e4llen bereitzustellen, die Clients einsetzen k\u00f6nnen<\/b>. Einige dieser Anwendungsf\u00e4lle sind:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><b>Ingress-Limiting<\/b>\u00a0\u2013 Typisches HTTP-basiertes Limiting im Stil von \u201e402 Too Many Requests\u201c<\/li>\n\n\n\n<li><b>Traffic Shedding<\/b>\u00a0\u2013 Nur neue oder nicht authentifizierte Anfragen ablehnen, wenn sich Ihre API in einem schlechten Zustand befindet.<\/li>\n\n\n\n<li><b>Egress-Limiting<\/b>\u00a0\u2013 Externe SMTP-Server mit Millionen von Nachrichten zu bombardieren, ist keine gute Idee.<\/li>\n\n\n\n<li><b>Queue-Verarbeitung<\/b>\u00a0\u2013 Wissen, wann eine Anfrage sofort bearbeitet werden kann oder in die Warteschlange gestellt und in der Reihenfolge ihres Eingangs verarbeitet werden sollte.<\/li>\n\n\n\n<li><b>API-Kapazit\u00e4tsmanagement<\/b>\u00a0\u2013 Globale Limits f\u00fcr die Gesamtzahl der Anfragen festlegen, die ein kollektives API-System verarbeiten kann. Anfragen, die die normale Betriebskapazit\u00e4t des Systems \u00fcberschreiten, ablehnen oder in die Warteschlange stellen.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich zu den genannten Anwendungsf\u00e4llen hat ein konfigurationsloses Design gro\u00dfe Auswirkungen auf das Design und Deployment von Microservices:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Keine Synchronisierung der Konfiguration beim Deployment. Wird ein Dienst bereitgestellt, der Gubernator nutzt, muss vorab keine Rate-Limit-Konfiguration f\u00fcr Gubernator deployt werden.<\/li>\n\n\n\n<li>Dienste, die Gubernator verwenden, besitzen ihr eigenes Rate-Limit-Domain-Modell f\u00fcr ihren Problembereich. Dadurch wird dom\u00e4nenspezifisches Wissen aus Gubernator ferngehalten, sodass sich Gubernator auf das konzentrieren kann, was es am besten kann: Rate-Limiting.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Abgesehen von diesen Fragen lassen Sie uns mehr \u00fcber Gubernator als Ganzes sprechen, beginnend damit, <b>wie es funktioniert<\/b>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie Gubernator funktioniert<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4850\" width=\"700\" height=\"481\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/gubernator.png\" alt=\"Gubernator architecture chart\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/gubernator.png 700w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/gubernator-300x206.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Gubernator ist so konzipiert, dass es als verteilter Cluster von Peers ausgef\u00fchrt wird, die einen In-Memory-Cache aller derzeit aktiven Rate-Limits nutzen. Daher werden niemals Daten auf die Festplatte synchronisiert. Da die meisten netzwerkbasierten Rate-Limit-Dauern nur f\u00fcr wenige Sekunden aufrechterhalten werden, ist der Verlust des In-Memory-Caches w\u00e4hrend eines Neustarts oder einer geplanten Ausfallzeit kein gro\u00dfes Problem. Bei Gubernator <b>ziehen wir Leistung der Genauigkeit vor, da es bei einem Cache-Verlust akzeptabel ist, wenn ein kleiner Teil des Datenverkehrs f\u00fcr kurze Zeit (meist Sekunden) zu viele Anfragen stellt.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wird eine Rate-Limit-Anfrage an Gubernator gestellt, wird die Anfrage mit einem Schl\u00fcssel versehen und ein konsistenter Hashing-Algorithmus angewendet, um zu bestimmen, welcher Peer der Besitzer der Rate-Limit-Anfrage wird. Die Wahl eines einzigen Besitzers f\u00fcr ein Rate-Limit macht atomare Inkrementierungen von Z\u00e4hlern sehr schnell und vermeidet die Komplexit\u00e4t und Latenz, die mit der konsistenten Verteilung von Z\u00e4hlern \u00fcber einen Cluster von Peers einhergeht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obwohl einfach und performant, <b>k\u00f6nnte dieses Design anf\u00e4llig f\u00fcr einen Ansturm von Anfragen (Thundering Herd) sein<\/b>, da ein einziger Koordinator f\u00fcr m\u00f6glicherweise Hunderttausende von Anfragen an ein Rate-Limit verantwortlich ist.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um dem entgegenzuwirken, k\u00f6nnen Clients `Behaviour=BATCHING` anfordern. Dadurch k\u00f6nnen Peers mehrere Anfragen innerhalb eines festgelegten Zeitfensters (standardm\u00e4\u00dfig 500 Mikrosekunden) entgegennehmen und in einer einzigen Peer-Anfrage zusammenfassen. Dies reduziert die Gesamtzahl der Netzwerkanfragen an einen einzelnen Gubernator-Peer enorm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um sicherzustellen, dass jeder Peer im Cluster den richtigen Hash f\u00fcr einen Rate-Limit-Schl\u00fcssel exakt berechnet, <b>muss die Liste der Peers im Cluster zeitnah und konsistent an jeden Peer verteilt werden.<\/b> Derzeit unterst\u00fctzt Gubernator die Nutzung von etcd oder der Kubernetes-Endpoints-API zur Erkennung von Gubernator-Peers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Betrieb von Gubernator<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn ein Client oder Dienst eine Anfrage an Gubernator stellt, wird die Rate-Limit-Konfiguration bei jeder Anfrage vom Client bereitgestellt. Die Rate-Limit-Konfiguration wird dann zusammen mit dem aktuellen Rate-Limit-Status im lokalen Cache des Rate-Limit-Besitzers gespeichert. Rate-Limits und deren Konfiguration, die im lokalen Cache gespeichert sind, existieren nur f\u00fcr die angegebene Dauer der Rate-Limit-Konfiguration.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach Ablauf der Dauer und wenn das Rate-Limit innerhalb der Dauer nicht erneut angefragt wurde, wird es aus dem Cache verworfen. <b>Nachfolgende Anfragen f\u00fcr denselben Namen und dasselbe unique_key-Paar erstellen die Konfiguration und das Rate-Limit im Cache neu, und der Zyklus wiederholt sich<\/b>. Andererseits \u00fcberschreiben nachfolgende Anfragen mit unterschiedlichen Konfigurationen die vorherige Konfiguration und wenden die neue Konfiguration sofort an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine beispielhafte Rate-Limit-Anfrage \u00fcber GRPC k\u00f6nnte wie folgt aussehen:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                        rate_limits:rn    # Scopes the request to a specific rate limit rn  - name: requests_per_secrn    # A unique_key that identifies this rate limit requestrn    unique_key: account_id=123|source_ip=172.0.0.1rn    # The number of hits we are requestingrn    hits: 1rn    # The total number of requests allowed for this rate limitrn    limit: 100rn    # The duration of the rate limit in millisecondsrn    duration: 1000rn    # The algorithm used to calculate the rate limit  rn    # 0 = Token Bucketrn    # 1 = Leaky Bucketrn    algorithm: 0rn    # The behavior of the rate limit in gubernator.rn    # 0 = BATCHING (Enables batching of requests to peers)rn    # 1 = NO_BATCHING (Disables batching)rn    # 2 = GLOBAL (Enable global caching for this rate limit)rn    behavior: 0\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Eine beispielhafte Antwort w\u00e4re:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    rate_limits:rn      # The status of the rate limit.  OK = 0, OVER_LIMIT = 1rn    - status: 0,rn      # The current configured limitrn      limit: 10,rn      # The number of requests remainingrn      remaining: 7,rn      # A unix timestamp in milliseconds of when the rate limit will reset,rn      #  or if OVER_LIMIT is set it is the time at which the rate limitrn      # will no longer return OVER_LIMIT.rn      reset_time: 1551309219226,rn      # Additional metadata about the request the client might find usefulrn      metadata:rn        # This is the name of the node that owns this requestrn        &quot;owner&quot;: &quot;api-n03.staging.us-east-1.mailgun.org:9041&quot;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Globales Verhalten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da Gubernator-Rate-Limits gehasht und von einem einzigen Peer im Cluster verarbeitet werden, w\u00fcrden Rate-Limits, die f\u00fcr jede Anfrage in einem Rechenzentrum gelten, dazu f\u00fchren, dass die Rate-Limit-Anfrage von einem einzigen Peer f\u00fcr das gesamte Rechenzentrum verarbeitet wird.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Betrachten wir zum Beispiel ein Rate-Limit mit <code>name=requests_per_datacenter<\/code> und <code>unique_id=us-east-1<\/code>. Stellen Sie sich nun vor, dass f\u00fcr jede HTTP-Anfrage, die in das Rechenzentrum <code>us-east-1<\/code> eingeht, eine Anfrage an Gubernator mit diesem Rate-Limit gestellt wird. <b>Dies k\u00f6nnten Hunderttausende oder sogar potenziell Millionen von Anfragen pro Sekunde sein, die alle gehasht und von einem einzigen Peer im Cluster verarbeitet werden.<\/b> Aufgrund dieses potenziellen Skalierungsproblems f\u00fchrt Gubernator ein\u00a0konfigurierbares <code>behavior<\/code> (Verhalten) namens <code>GLOBAL<\/code> ein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wird ein Rate-Limit mit <code>behavior=GLOBAL<\/code> konfiguriert, wird die von einem Client empfangene Rate-Limit-Anfrage nicht an den besitzenden Peer weitergeleitet. Stattdessen wird sie aus einem internen Cache beantwortet, der von dem Peer verwaltet wird, der die Anfrage empfangen hat. <code>Hits<\/code> f\u00fcr das Rate-Limit werden vom empfangenden Peer als Batch zusammengefasst und asynchron an den besitzenden Peer gesendet. Dort werden die Hits summiert und das <code>OVER_LIMIT<\/code> berechnet. Es liegt dann in der Verantwortung des besitzenden Peers, jeden Peer im Cluster mit dem aktuellen Status des Rate-Limits zu aktualisieren, sodass <b>die internen Caches der Peers routinem\u00e4\u00dfig aktualisiert werden<\/b>\u00a0\u2013 mit dem aktuellsten Rate-Limit-Status vom Besitzer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nebeneffekte des globalen Verhaltens<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Da <code>Hits<\/code> gebatcht und asynchron an den besitzenden Peer weitergeleitet werden, enth\u00e4lt die unmittelbare Antwort an den Client nicht die genauesten <code>remaining<\/code>-Z\u00e4hlwerte. Dieser Z\u00e4hlwert wird erst aktualisiert, nachdem der asynchrone Aufruf an den Besitzer-Peer abgeschlossen ist und der besitzende Peer Zeit hatte, alle Peers im Cluster zu aktualisieren. Infolgedessen erm\u00f6glicht die Verwendung von <code>GLOBAL<\/code> eine gr\u00f6\u00dfere Skalierung, jedoch auf Kosten der Konsistenz. Die Nutzung von <code>GLOBAL<\/code> kann die Traffic-Menge pro Rate-Limit-Anfrage erh\u00f6hen, wenn der Cluster gro\u00df genug ist. <b><code>GLOBAL<\/code><\/b><b> sollte nur f\u00fcr extrem hochvolumige Rate-Limits verwendet werden, die mit dem traditionellen Nicht-<\/b><b><code>GLOBAL<\/code><\/b><b>-Verhalten schlecht skalieren.<\/b><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gubernator-Leistung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In unserer Produktionsumgebung senden wir f\u00fcr jede Anfrage an unsere API zwei Rate-Limit-Anfragen zur Auswertung an Gubernator: eine zur Bewertung der HTTP-Anfrage und die andere zur Bewertung der Anzahl der Empf\u00e4nger, an die eine Person innerhalb der spezifischen Dauer eine E-Mail senden kann. Unter diesem Setup bearbeitet ein einzelner Gubernator-Knoten \u00fcber 2.000 Anfragen pro Sekunde, wobei die meisten gebatchten Antworten in weniger als einer Millisekunde zur\u00fcckgegeben werden.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4851\" width=\"847\" height=\"382\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss1.png\" alt=\"Average rate limits response time graph\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss1.png 847w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss1-300x135.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss1-768x346.png 768w\" sizes=\"(max-width: 847px) 100vw, 847px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">An besitzende Knoten weitergeleitete Peer-Anfragen antworten typischerweise in unter 30 Mikrosekunden.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4852\" width=\"841\" height=\"389\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss2.png\" alt=\"Average get peer rate limits response time graph\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss2.png 841w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss2-300x139.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/ss2-768x355.png 768w\" sizes=\"(max-width: 841px) 100vw, 841px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Da viele unserer \u00f6ffentlich zug\u00e4nglichen APIs in Python geschrieben sind, f\u00fchren wir viele Python-Interpreter-Instanzen auf einem einzigen Knoten aus. Diese Python-Instanzen leiten Anfragen lokal an die Gubernator-Instanz weiter, die diese dann in Batches zusammenfasst und an besitzende Knoten weiterleitet.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gubernator erm\u00f6glicht es der Nutzerschaft, ein Nicht-Batching-Verhalten zu w\u00e4hlen, was die Latenz f\u00fcr Client-Rate-Limit-Anfragen weiter reduzieren w\u00fcrde. Aufgrund von Durchsatzanforderungen verwendet unsere Produktionsumgebung jedoch <code>Behaviour=BATCHING<\/code> mit dem standardm\u00e4\u00dfigen 500-Mikrosekunden-Fenster. In der Produktion haben wir w\u00e4hrend der Spitzen-API-Nutzung Batch-Gr\u00f6\u00dfen von 1.000 beobachtet. Andere, die nicht dieselben hohen Traffic-Anforderungen haben, k\u00f6nnten das Batching deaktivieren und w\u00fcrden geringere Latenzen feststellen, allerdings auf Kosten des Durchsatzes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gubernator als Bibliothek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie Golang nutzen, k\u00f6nnen Sie Gubernator als Bibliothek verwenden. Dies ist n\u00fctzlich, wenn Sie einen Rate-Limit-Dienst implementieren m\u00f6chten, der auf Ihrem eigenen unternehmensspezifischen Modell aufbaut. Wir tun dies intern hier bei Mailgun mit einem Dienst, den wir kreativ <code>ratelimits<\/code> genannt haben und der die Limits pro Account verfolgt. <b>Auf diese Weise nutzen Sie die Leistung und Geschwindigkeit von Gubernator, legen aber dennoch Gesch\u00e4ftslogik dar\u00fcber und integrieren dom\u00e4nenspezifische Probleme in Ihren Rate-Limiting-Dienst.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie die Bibliothek verwenden, wird Ihr Dienst zu einem vollwertigen Mitglied des Clusters und nimmt an demselben konsistenten Hashing und Caching teil wie ein eigenst\u00e4ndiger Gubernator-Server. Alles, was Sie tun m\u00fcssen, ist die GRPC-Serverinstanz bereitzustellen und Gubernator mitzuteilen, wo sich die Peers in Ihrem Cluster befinden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Nutzung von Gubernator als vielseitiger Rate-Limiting-Dienst erm\u00f6glicht es uns, auf eine Microservice-Architektur zu vertrauen, ohne Kompromisse bei der Dienstunabh\u00e4ngigkeit einzugehen oder die Doppelarbeit zu riskieren, die bei g\u00e4ngigen Rate-Limiting-L\u00f6sungen erforderlich ist. <b>Wir hoffen, dass durch die Ver\u00f6ffentlichung dieses Projekts als Open Source auch andere mitwirken und von der Arbeit profitieren k\u00f6nnen, die wir hier begonnen haben.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00f6chten Sie bei Mailgun arbeiten? Wir stellen ein. Und es sind mehrere Stellen im Entwicklungsteam offen. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">Aktuelle Stellenangebote hier ansehen.<\/a><\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_1973cc8b17fd4594d8702baa05899a4c\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Registrieren            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_1973cc8b17fd4594d8702baa05899a4c\">\r\n                Loslegen ist ganz einfach. Und es ist kostenlos.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Erfahren Sie, was Sie mit der weltbesten Plattform f\u00fcr E-Mail-Zustellung alles erreichen k\u00f6nnen.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Mailgun freut sich, heute Gubernator als Open Source bereitzustellen \u2013 einen hochleistungsf\u00e4higen, verteilten Rate-Limiting-Microservice. Was macht Gubernator? Eine gute Frage.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24389","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/\",\"name\":\"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T11:47:45+00:00\",\"description\":\"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/gubernator-cloud-native-distributed-rate-limiting-microservices\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun","description":"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/","og_locale":"de_DE","og_type":"article","og_title":"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun","og_description":"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013","og_url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/","url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/","name":"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T11:47:45+00:00","description":"Gubernator verteilt Rate-Limit-Anfragen gleichm\u00e4\u00dfig \u00fcber den gesamten Cluster. Das bedeutet, dass Sie das System durch das einfache Hinzuf\u00fcgen weiterer Knoten skalieren. Weiterlesen \u2013","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/gubernator-cloud-native-distributed-rate-limiting-microservices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Gubernator: Cloud-natives, verteiltes Rate-Limiting f\u00fcr Microservices"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24389\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=24389"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=24389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}