{"id":24680,"date":"2026-09-16T16:56:41","date_gmt":"2026-09-16T16:56:41","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/"},"modified":"2026-09-16T16:56:41","modified_gmt":"2026-09-16T16:56:41","slug":"gubernator-limitation-debit-distribuee-cloud-native-microservices","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/","title":{"rendered":"Gubernator : limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Aujourd&rsquo;hui, Mailgun a le plaisir de proposer en open source <a href=\"https:\/\/github.com\/mailgun\/gubernator\" target=\"_tabs\" rel=\"noopener noreferrer\">Gubernator<\/a>, un microservice de limitation de d\u00e9bit distribu\u00e9 \u00e0 haute performance. Que fait Gubernator\u00a0? Excellente question\u00a0:<\/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-2304\"><p class=\"h5 m-0\" id=\"toc-title-2304\">Table des mati\u00e8res<\/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=\"#fonctionnalites-de-gubernator\">Fonctionnalit\u00e9s de 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=\"#pourquoi-ne-pas-utiliser-redis\">Pourquoi ne pas utiliser Redis\u00a0?<\/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=\"#pourquoi-un-microservice\">Pourquoi un microservice\u00a0?<\/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=\"#pourquoi-gubernator-est-il-sans-etat\">Pourquoi Gubernator est-il sans \u00e9tat\u00a0?<\/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=\"#comment-fonctionne-gubernator\">Comment fonctionne Gubernator<\/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=\"#fonctionnement-de-gubernator\">Fonctionnement de 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=\"#comportement-global\">Comportement global<\/a><a class=\"scrollme link-body-color\" href=\"#effets-secondaires-du-comportement-global\">Effets secondaires du comportement global<\/a><a class=\"scrollme link-body-color\" href=\"#performances-de-gubernator\">Performances de Gubernator<\/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-en-tant-que-bibliotheque\">Gubernator en tant que biblioth\u00e8que<\/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=\"#conclusion\">Conclusion<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Fonctionnalit\u00e9s de Gubernator<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l&rsquo;ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires.\u00a0<\/li>\n\n\n\n<li>Gubernator ne d\u00e9pend pas de caches externes tels que Memcache ou Redis, ce qui \u00e9vite toute synchronisation de d\u00e9ploiement avec un service d\u00e9pendant. Il est donc tr\u00e8s simple d&rsquo;agrandir ou de r\u00e9duire dynamiquement le cluster dans un syst\u00e8me d&rsquo;orchestration tel que Kubernetes ou Nomad.<\/li>\n\n\n\n<li>Gubernator ne conserve aucun \u00e9tat sur le disque, et sa configuration lui est transmise par le client \u00e0 chaque requ\u00eate.<\/li>\n\n\n\n<li>Gubernator offre un acc\u00e8s GRPC et HTTP \u00e0 son API.<\/li>\n\n\n\n<li>Peut \u00eatre ex\u00e9cut\u00e9 en tant que sidecar pour les services n\u00e9cessitant une limitation de d\u00e9bit, ou comme service distinct.<\/li>\n\n\n\n<li>Peut \u00eatre utilis\u00e9 comme biblioth\u00e8que pour impl\u00e9menter un service de limitation de d\u00e9bit sp\u00e9cifique \u00e0 un domaine.<\/li>\n\n\n\n<li>Prend en charge une distribution de limitation de d\u00e9bit optionnelle \u00e0 coh\u00e9rence \u00e9ventuelle pour les environnements \u00e0 tr\u00e8s haut d\u00e9bit.\u00a0<\/li>\n\n\n\n<li>Gubernator est la <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\">prononciation anglaise du mot gouverneur en russe<\/a>, et \u00e7a sonne bien.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nous sommes convaincus que vous vous demandez <b>pourquoi nous avons d\u00e9cid\u00e9 de proposer Gubernator en open source<\/b>. Avant de d\u00e9tailler le fonctionnement de Gubernator, r\u00e9pondons d&rsquo;abord \u00e0 certaines de ces questions. La principale que vous vous posez est sans doute la suivante&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi ne pas utiliser Redis\u00a0?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs \u00e9l\u00e9ments nous ont interpell\u00e9s lors de l&rsquo;\u00e9valuation de Redis.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>L&rsquo;utilisation de la <a href=\"https:\/\/redislabs.com\/redis-best-practices\/basic-rate-limiting\/\" target=\"_tabs\" rel=\"noopener noreferrer\">mise en \u0153uvre de base de la limitation de d\u00e9bit dans Redis<\/a> entra\u00eenerait des allers-retours suppl\u00e9mentaires sur le r\u00e9seau, m\u00eame avec le <a href=\"https:\/\/redis.io\/topics\/pipelining\" target=\"_tabs\" rel=\"noopener noreferrer\">pipelining<\/a>. <\/li>\n\n\n\n<li>Nous pourrions r\u00e9duire les allers-retours en utilisant <a href=\"https:\/\/redis.io\/commands\/eval\" target=\"_tabs\" rel=\"noopener noreferrer\">https:\/\/redis.io\/commands\/eval<\/a> et en \u00e9crivant un script LUA que nous devrions maintenir pour chaque algorithme impl\u00e9ment\u00e9.<\/li>\n\n\n\n<li>Chaque requ\u00eate entra\u00eenerait au moins un aller-retour vers Redis. Si l&rsquo;on ajoute \u00e0 cela au moins un aller-retour vers notre microservice, on arrive \u00e0 un minimum de deux allers-retours par requ\u00eate vers notre service.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">La solution optimale pour Redis consiste \u00e0 \u00e9crire un script LUA qui impl\u00e9mente l&rsquo;algorithme de limitation de d\u00e9bit.\u00a0 Ce script est ensuite stock\u00e9 sur le serveur Redis et est appel\u00e9 pour chaque requ\u00eate de limitation de d\u00e9bit. Dans ce sc\u00e9nario, la majeure partie du travail est effectu\u00e9e par Redis, et notre microservice sert essentiellement de proxy pour y acc\u00e9der. Dans ce cas, deux options s&rsquo;offrent \u00e0 nous\u00a0:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Cr\u00e9er Gubernator en tant que biblioth\u00e8que de limitation de d\u00e9bit offrant un acc\u00e8s \u00e0 Redis. Cette biblioth\u00e8que serait utilis\u00e9e par tout service n\u00e9cessitant une limitation de d\u00e9bit.\u00a0<\/li>\n\n\n\n<li>\u00c9liminer Redis et impl\u00e9menter les algorithmes de distribution, de mise en cache et de limitation dans un microservice de limitation de d\u00e9bit, accompagn\u00e9 d&rsquo;un client GRPC l\u00e9ger \u00e0 utiliser par chaque service.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi un microservice\u00a0?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun est une entreprise polyglotte, dont la majorit\u00e9 de la base de code est en Python et en Golang. Si nous choisissons d&rsquo;impl\u00e9menter la limitation de d\u00e9bit sous forme de biblioth\u00e8que, cela n\u00e9cessite au minimum une version Python et une version Golang de cette biblioth\u00e8que. <b>Nous avons d\u00e9j\u00e0 emprunt\u00e9 cette voie en interne, avec une version Python et Golang pour une m\u00eame biblioth\u00e8que.<\/b> D&rsquo;apr\u00e8s notre exp\u00e9rience, les biblioth\u00e8ques partag\u00e9es entre les services pr\u00e9sentent les inconv\u00e9nients suivants.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Les correctifs de bugs et les nouvelles fonctionnalit\u00e9s de la biblioth\u00e8que impliquent, au mieux, une mise \u00e0 jour de la d\u00e9pendance. Au pire, il est n\u00e9cessaire de modifier tous les services qui utilisent la biblioth\u00e8que dans tous les langages pris en charge.<\/li>\n\n\n\n<li>Il est rare que l&rsquo;\u00e9quipe de d\u00e9veloppement souhaite maintenir ou \u00e9crire de nouvelles fonctionnalit\u00e9s dans les deux langages. Cela conduit g\u00e9n\u00e9ralement \u00e0 ce qu&rsquo;une version de la biblioth\u00e8que comporte plus de fonctionnalit\u00e9s ou soit mieux maintenue que l&rsquo;autre.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 mesure que le nombre de microservices et de langages de notre \u00e9cosyst\u00e8me ne cesse de cro\u00eetre, ces probl\u00e8mes s&rsquo;accumulent et s&rsquo;aggravent. En comparaison, les biblioth\u00e8ques GRPC et HTTP sont faciles \u00e0 cr\u00e9er et \u00e0 maintenir pour chaque langage n\u00e9cessitant un acc\u00e8s \u00e0 Gubernator.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les microservices, <b>il est possible d&rsquo;ajouter des correctifs et de nouvelles fonctionnalit\u00e9s sans perturber les services d\u00e9pendants<\/b>. Tant qu&rsquo;aucune modification critique de l&rsquo;API n&rsquo;est autoris\u00e9e, les services d\u00e9pendants peuvent adopter de nouvelles fonctionnalit\u00e9s sans qu&rsquo;il soit n\u00e9cessaire de mettre \u00e0 jour tous les services d\u00e9pendants.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le principal atout de Gubernator en tant que microservice est de cr\u00e9er un point de synchronisation pour les nombreuses requ\u00eates qui entrent dans le syst\u00e8me. Les requ\u00eates re\u00e7ues \u00e0 quelques microsecondes d&rsquo;intervalle peuvent \u00eatre optimis\u00e9es et coordonn\u00e9es par lots, ce qui r\u00e9duit la bande passante globale et la latence d&rsquo;aller-retour utilis\u00e9es par le service en cas de charge importante. Plusieurs services s&rsquo;ex\u00e9cutant sur un seul h\u00f4te, avec la m\u00eame biblioth\u00e8que fonctionnant dans leurs propres processus respectifs, ne disposent pas de cette capacit\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi Gubernator est-il sans \u00e9tat\u00a0?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gubernator est sans \u00e9tat dans la mesure o\u00f9 son fonctionnement ne n\u00e9cessite pas d&rsquo;espace disque. Aucune configuration ou donn\u00e9e de cache n&rsquo;est jamais synchronis\u00e9e sur le disque, car chaque requ\u00eate adress\u00e9e \u00e0 Gubernator inclut la configuration pour la limitation de d\u00e9bit.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 premi\u00e8re vue, on pourrait penser qu&rsquo;il s&rsquo;agit d&rsquo;une surcharge inutile pour chaque requ\u00eate. Toutefois, en r\u00e9alit\u00e9, une configuration de limitation de d\u00e9bit n&rsquo;est compos\u00e9e que de quatre entiers de 64 bits. La configuration se compose de Limit, Duration, Algorithm et Behavior (voir ci-dessous pour plus de d\u00e9tails sur le fonctionnement). C&rsquo;est gr\u00e2ce \u00e0 cette configuration simple que <b>Gubernator peut fournir une grande vari\u00e9t\u00e9 de cas d&rsquo;usage de limitation de d\u00e9bit exploitables par la client\u00e8le<\/b>. Voici quelques-uns de ces cas d&rsquo;usage\u00a0:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><b>Limitation en entr\u00e9e<\/b> &#8211; Limitation typique bas\u00e9e sur HTTP de type 402 Too Many Requests<\/li>\n\n\n\n<li><b>D\u00e9lestage du trafic<\/b> &#8211; Rejeter uniquement les requ\u00eates nouvelles ou non authentifi\u00e9es lorsque votre API est en mauvais \u00e9tat.<\/li>\n\n\n\n<li><b>Limitation en sortie<\/b> &#8211; Bombarder des serveurs SMTP externes avec des millions de messages n&rsquo;est pas une bonne id\u00e9e.<\/li>\n\n\n\n<li><b>Traitement de la file d&rsquo;attente<\/b> &#8211; Savoir si une requ\u00eate peut \u00eatre trait\u00e9e imm\u00e9diatement, ou si elle doit \u00eatre mise en file d&rsquo;attente et trait\u00e9e dans son ordre de r\u00e9ception.<\/li>\n\n\n\n<li><b>Gestion de la capacit\u00e9 des API<\/b> &#8211; Imposer des limites globales sur le nombre total de requ\u00eates qu&rsquo;un syst\u00e8me d&rsquo;API collectif peut traiter. Rejeter ou mettre en file d&rsquo;attente les requ\u00eates qui d\u00e9passent la capacit\u00e9 de fonctionnement normale du syst\u00e8me.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Outre les cas d&rsquo;usage susmentionn\u00e9s, une conception sans configuration a des implications majeures sur la conception et le d\u00e9ploiement des microservices\u00a0:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aucune synchronisation de configuration lors du d\u00e9ploiement. Lorsqu&rsquo;un service utilisant Gubernator est d\u00e9ploy\u00e9, il n&rsquo;est pas n\u00e9cessaire de pr\u00e9d\u00e9ployer une configuration de limitation de d\u00e9bit dans Gubernator.<\/li>\n\n\n\n<li>Les services utilisant Gubernator poss\u00e8dent leur propre mod\u00e8le de domaine de limitation de d\u00e9bit en fonction de leur probl\u00e9matique. Ainsi, les connaissances propres au domaine sont conserv\u00e9es en dehors de Gubernator, ce qui lui permet de se concentrer sur ce qu&rsquo;il fait de mieux\u00a0: limiter le d\u00e9bit\u00a0!<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Au-del\u00e0 de ces questions, parlons davantage de Gubernator dans son ensemble, en commen\u00e7ant par <b>son fonctionnement<\/b>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Comment fonctionne Gubernator<\/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 est con\u00e7u pour fonctionner comme un cluster distribu\u00e9 de pairs utilisant un cache en m\u00e9moire de toutes les limitations de d\u00e9bit actives \u00e0 ce moment-l\u00e0. Ainsi, aucune donn\u00e9e n&rsquo;est jamais synchronis\u00e9e sur le disque. \u00c9tant donn\u00e9 que la plupart des dur\u00e9es de limitation de d\u00e9bit sur le r\u00e9seau ne durent que quelques secondes, la perte du cache en m\u00e9moire lors d&rsquo;un red\u00e9marrage ou d&rsquo;une indisponibilit\u00e9 planifi\u00e9e n&rsquo;est pas dramatique. Pour Gubernator, <b>nous privil\u00e9gions les performances \u00e0 la pr\u00e9cision. En effet, il est acceptable qu&rsquo;un petit sous-ensemble du trafic effectue des requ\u00eates excessives pendant une courte p\u00e9riode (g\u00e9n\u00e9ralement quelques secondes) en cas de perte de cache.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsqu&rsquo;une requ\u00eate de limitation de d\u00e9bit est adress\u00e9e \u00e0 Gubernator, elle est accompagn\u00e9e d&rsquo;une cl\u00e9. Un algorithme de hachage coh\u00e9rent est alors appliqu\u00e9 pour d\u00e9terminer lequel des pairs sera le propri\u00e9taire de la requ\u00eate de limitation de d\u00e9bit. Le choix d&rsquo;un propri\u00e9taire unique pour une limitation de d\u00e9bit rend les incr\u00e9ments atomiques des comptages tr\u00e8s rapides et \u00e9vite la complexit\u00e9 et la latence li\u00e9es \u00e0 la distribution coh\u00e9rente des comptages sur un cluster de pairs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bien que simple et performante, <b>cette conception peut \u00eatre expos\u00e9e \u00e0 un afflux massif de requ\u00eates<\/b>, car un seul coordinateur est responsable de potentiellement plusieurs centaines de milliers de requ\u00eates vers une limitation de d\u00e9bit.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour y rem\u00e9dier, la client\u00e8le peut exiger l&rsquo;option `Behaviour=BATCHING`, qui permet aux pairs de prendre plusieurs requ\u00eates dans une fen\u00eatre donn\u00e9e (500 microsecondes par d\u00e9faut) et de les regrouper en un lot constituant une seule requ\u00eate de pair, ce qui r\u00e9duit consid\u00e9rablement le nombre total de requ\u00eates r\u00e9seau vers un seul pair Gubernator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Afin de s&rsquo;assurer que chaque pair du cluster calcule correctement le hachage d&rsquo;une cl\u00e9 de limitation de d\u00e9bit, <b>la liste des pairs du cluster doit \u00eatre distribu\u00e9e \u00e0 chacun d&rsquo;entre eux de mani\u00e8re opportune et coh\u00e9rente.<\/b> Actuellement, Gubernator prend en charge l&rsquo;utilisation d&rsquo;etcd ou de l&rsquo;API de points de terminaison Kubernetes pour d\u00e9couvrir les pairs Gubernator.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fonctionnement de Gubernator<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsqu&rsquo;un client ou un service effectue une requ\u00eate aupr\u00e8s de Gubernator, la configuration de la limitation de d\u00e9bit est fournie avec chaque requ\u00eate par le client. La configuration de la limitation de d\u00e9bit est ensuite stock\u00e9e avec l&rsquo;\u00e9tat actuel de la limitation de d\u00e9bit dans le cache local du propri\u00e9taire de la limitation de d\u00e9bit. Les limitations de d\u00e9bit et leur configuration qui sont stock\u00e9es dans le cache local n&rsquo;existeront que pour la dur\u00e9e sp\u00e9cifi\u00e9e dans la configuration de la limitation de d\u00e9bit.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois la dur\u00e9e expir\u00e9e, et si la limitation de d\u00e9bit n&rsquo;a pas fait l&rsquo;objet d&rsquo;une nouvelle requ\u00eate au cours de cette p\u00e9riode, elle est supprim\u00e9e du cache. <b>Les requ\u00eates ult\u00e9rieures avec la m\u00eame paire nom et unique_key recr\u00e9eront la configuration et la limitation de d\u00e9bit dans le cache, et le cycle se r\u00e9p\u00e9tera<\/b>. En revanche, les requ\u00eates ult\u00e9rieures pr\u00e9sentant des configurations diff\u00e9rentes \u00e9craseront la configuration pr\u00e9c\u00e9dente et la nouvelle configuration s&rsquo;appliquera imm\u00e9diatement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple de requ\u00eate de limitation de d\u00e9bit envoy\u00e9e via GRPC\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Et voici un exemple de r\u00e9ponse\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Comportement global<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9tant donn\u00e9 que les limitations de d\u00e9bit de Gubernator sont hach\u00e9es et g\u00e9r\u00e9es par un seul pair du cluster, les limitations de d\u00e9bit s&rsquo;appliquant \u00e0 chaque requ\u00eate dans un centre de donn\u00e9es entra\u00eeneraient la gestion de la requ\u00eate de limitation de d\u00e9bit par un seul pair pour l&rsquo;ensemble du centre de donn\u00e9es.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prenons l&rsquo;exemple d&rsquo;une limitation de d\u00e9bit avec <code>name=requests_per_datacenter<\/code> et <code>unique_id=us-east-1<\/code>. Imaginons maintenant qu&rsquo;une requ\u00eate soit adress\u00e9e \u00e0 Gubernator avec cette limitation de d\u00e9bit pour chaque requ\u00eate HTTP qui entre dans le centre de donn\u00e9es <code>us-east-1<\/code>. <b>Il pourrait s&rsquo;agir de centaines de milliers, voire potentiellement de millions de requ\u00eates par seconde, toutes hach\u00e9es et g\u00e9r\u00e9es par un seul pair du cluster.<\/b> En raison de ce potentiel probl\u00e8me d&rsquo;\u00e9volutivit\u00e9, Gubernator introduit un\u00a0 <code>behavior<\/code> configurable appel\u00e9 <code>GLOBAL<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsqu&rsquo;une limitation de d\u00e9bit est configur\u00e9e avec <code>behavior=GLOBAL<\/code>, la requ\u00eate de limitation de d\u00e9bit re\u00e7ue d&rsquo;un client ne sera pas transmise au pair propri\u00e9taire. Au lieu de cela, la r\u00e9ponse proviendra d&rsquo;un cache interne g\u00e9r\u00e9 par le pair qui a re\u00e7u la requ\u00eate. Les correspondances (<code>Hits<\/code>) li\u00e9es \u00e0 la limitation de d\u00e9bit seront regroup\u00e9es par le pair r\u00e9cepteur et envoy\u00e9es de mani\u00e8re asynchrone au pair propri\u00e9taire, o\u00f9 elles seront totalis\u00e9es et la valeur <code>OVER_LIMIT<\/code> sera calcul\u00e9e. Il incombe alors au pair propri\u00e9taire de mettre \u00e0 jour chaque pair du cluster avec le statut actuel de la limitation de d\u00e9bit, de sorte que les <b>caches internes des pairs soient r\u00e9guli\u00e8rement mis \u00e0 jour<\/b> avec le statut de limitation de d\u00e9bit le plus r\u00e9cent provenant du propri\u00e9taire.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Effets secondaires du comportement global<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puisque les <code>Hits<\/code> sont regroup\u00e9s et transmis au pair propri\u00e9taire de mani\u00e8re asynchrone, la r\u00e9ponse imm\u00e9diate au client n&rsquo;inclura pas les comptages <code>remaining<\/code> les plus pr\u00e9cis. Ce comptage ne sera mis \u00e0 jour qu&rsquo;une fois l&rsquo;appel asynchrone au pair propri\u00e9taire termin\u00e9 et que ce dernier aura eu le temps de mettre \u00e0 jour tous les pairs du cluster. Par cons\u00e9quent, l&rsquo;utilisation de <code>GLOBAL<\/code> permet une plus grande \u00e9volutivit\u00e9, mais au prix de la coh\u00e9rence. L&rsquo;utilisation de <code>GLOBAL<\/code> peut augmenter le volume de trafic par requ\u00eate de limitation de d\u00e9bit si le cluster est suffisamment grand. <b>L&rsquo;option <code>GLOBAL<\/code><\/b><b> ne devrait \u00eatre utilis\u00e9e que pour les limitations de d\u00e9bit \u00e0 tr\u00e8s haut volume qui ne s&rsquo;adaptent pas bien au comportement classique sans l&rsquo;option <\/b><b><code>GLOBAL<\/code><\/b><b>.<\/b><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Performances de Gubernator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dans notre environnement de production, pour chaque requ\u00eate vers notre API, nous envoyons deux requ\u00eates de limitation de d\u00e9bit \u00e0 Gubernator pour \u00e9valuation de la limitation\u00a0; l&rsquo;une pour \u00e9valuer la requ\u00eate HTTP, et l&rsquo;autre pour \u00e9valuer le nombre de destinataires auxquels une personne peut envoyer un email dans la dur\u00e9e impartie. Avec cette configuration, un seul n\u0153ud Gubernator traite plus de 2\u00a0000 requ\u00eates par seconde, la plupart des r\u00e9ponses par lots \u00e9tant renvoy\u00e9es en moins d&rsquo;une milliseconde.\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\">Les requ\u00eates de pairs transmises aux n\u0153uds propri\u00e9taires r\u00e9pondent g\u00e9n\u00e9ralement en moins de 30 microsecondes.\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\">Comme nombre de nos API publiques sont \u00e9crites en Python, nous ex\u00e9cutons plusieurs instances de l&rsquo;interpr\u00e9teur Python sur un seul n\u0153ud. Ces instances Python transmettent les requ\u00eates localement \u00e0 l&rsquo;instance Gubernator qui regroupe ensuite les requ\u00eates en lots et les transmet aux n\u0153uds propri\u00e9taires.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gubernator permet de choisir un comportement sans regroupement par lots, ce qui r\u00e9duirait encore la latence des requ\u00eates de limitation de d\u00e9bit des clients. Toutefois, en raison de nos exigences de d\u00e9bit, notre environnement de production utilise <code>Behaviour=BATCHING<\/code> avec la fen\u00eatre par d\u00e9faut de 500 microsecondes. En production, nous avons observ\u00e9 des lots de 1\u00a0000 requ\u00eates lors des pics d&rsquo;utilisation de l&rsquo;API. Pour les personnes qui n&rsquo;ont pas des exigences de trafic aussi \u00e9lev\u00e9es, il est possible de d\u00e9sactiver le traitement par lots pour obtenir des latences plus faibles, mais au d\u00e9triment du d\u00e9bit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gubernator en tant que biblioth\u00e8que<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous utilisez Golang, vous pouvez utiliser Gubernator en tant que biblioth\u00e8que. Cela s&rsquo;av\u00e8re utile si vous souhaitez impl\u00e9menter un service de limitation de d\u00e9bit avec un mod\u00e8le propre \u00e0 votre entreprise. C&rsquo;est ce que nous faisons en interne chez Mailgun avec un service que nous avons baptis\u00e9, avec beaucoup d&rsquo;imagination, <code>ratelimits<\/code>, et qui assure le suivi des limites impos\u00e9es par compte. <b>Ainsi, vous pouvez exploiter la puissance et la rapidit\u00e9 de Gubernator, tout en superposant une logique m\u00e9tier et en int\u00e9grant des probl\u00e8mes sp\u00e9cifiques \u00e0 un domaine dans votre service de limitation de d\u00e9bit.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous utilisez la biblioth\u00e8que, votre service devient un membre \u00e0 part enti\u00e8re du cluster participant au m\u00eame hachage et \u00e0 la m\u00eame mise en cache coh\u00e9rents qu&rsquo;un serveur Gubernator autonome. Il vous suffit de fournir l&rsquo;instance de serveur GRPC et d&rsquo;indiquer \u00e0 Gubernator l&#8217;emplacement des pairs dans votre cluster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;utilisation de Gubernator en tant que service universel de limitation de d\u00e9bit nous permet de nous appuyer sur une architecture de microservices sans compromettre l&rsquo;ind\u00e9pendance des services, et d&rsquo;\u00e9viter la duplication du travail requise par les solutions courantes de limitation de d\u00e9bit. <b>En proposant ce projet en open source, nous esp\u00e9rons que d&rsquo;autres personnes pourront collaborer et tirer parti du travail que nous avons initi\u00e9 ici.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Envie de travailler chez Mailgun\u00a0? Nous recrutons\u00a0! Et plusieurs postes de d\u00e9veloppement sont \u00e0 pourvoir. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">D\u00e9couvrez nos offres d&#8217;emploi actuelles ici.<\/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_07841cab97b4844ae7e59e9185eee00c\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                S&rsquo;inscrire            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_07841cab97b4844ae7e59e9185eee00c\">\r\n                Lancez-vous, c&rsquo;est facile ! Et c&rsquo;est gratuit.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">D\u00e9couvrez ce que vous pouvez accomplir avec la meilleure plateforme de livraison d\u2019emails au monde.<\/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>Aujourd&rsquo;hui, Mailgun a le plaisir de proposer Gubernator en open source, un microservice de limitation de d\u00e9bit distribu\u00e9 \u00e0 haute performance. Que fait Gubernator\u00a0? Excellente question.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24680","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\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l&#039;ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \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\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gubernator\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l&#039;ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \u2013\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-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 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/\",\"name\":\"Gubernator\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T16:56:41+00:00\",\"description\":\"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l'ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \u2013\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-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\\\/fr\\\/blog\\\/it-and-engineering\\\/gubernator-limitation-debit-distribuee-cloud-native-microservices\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gubernator : limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/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\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gubernator\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun","description":"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l'ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \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\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/","og_locale":"fr_FR","og_type":"article","og_title":"Gubernator\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun","og_description":"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l'ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \u2013","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-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 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/","name":"Gubernator\u00a0: limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T16:56:41+00:00","description":"Gubernator r\u00e9partit uniform\u00e9ment les requ\u00eates de limitation de d\u00e9bit sur l'ensemble du cluster, ce qui permet de faire \u00e9voluer le syst\u00e8me en ajoutant simplement des n\u0153uds suppl\u00e9mentaires. En savoir plus \u2013","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-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\/fr\/blog\/it-and-engineering\/gubernator-limitation-debit-distribuee-cloud-native-microservices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Gubernator : limitation de d\u00e9bit distribu\u00e9e cloud-native pour les microservices"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/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\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/24680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/24680\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=24680"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=24680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}