{"id":24964,"date":"2019-07-16T00:00:00","date_gmt":"2019-07-16T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/"},"modified":"2026-09-16T19:10:06","modified_gmt":"2026-09-16T19:10:06","slug":"was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/","title":{"rendered":"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Vor einigen Monaten\u00a0<a href=\"https:\/\/www.mailgun.com\/de\/?blog_category=ip-warm-up\" target=\"_tabs\" rel=\"noopener noreferrer\">haben wir das automatische IP-Warm-up ver\u00f6ffentlicht<\/a>, aber wir sind nie dazu gekommen, \u00fcber dessen Implementierung zu sprechen. Heute werfen wir einen Blick unter die Haube und versuchen zu verstehen, wie unser IP-Warm-up funktioniert. Wir beginnen mit etwas Kontext und tauchen sp\u00e4ter im Beitrag in die interessanten technischen Details ein.<\/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-4803\"><p class=\"h5 m-0\" id=\"toc-title-4803\">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=\"#warum-das-ip-warm-up-so-wichtig-ist\">Warum das IP-Warm-up so wichtig ist<\/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=\"#warm-up-plan\">Warm-up-Plan<\/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=\"#ein-bestimmtes-volumen-aufrechterhalten\">Ein bestimmtes Volumen aufrechterhalten<\/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=\"#ist-es-wirklich-so-einfach\">Ist es wirklich so einfach?<\/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=\"#physische-systeme\">Physische Systeme<\/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=\"#ein-wenig-regelungstechnik\">Ein wenig Regelungstechnik<\/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=\"#die-theorie-auf-unser-problem-anwenden\">Die Theorie auf unser Problem anwenden<\/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=\"#ergebnisse\">Ergebnisse<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Warum das IP-Warm-up so wichtig ist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Seien wir ehrlich\u00a0\u2013 niemand erh\u00e4lt gerne eine Unmenge an Informationen auf einmal. Das Gleiche gilt f\u00fcr E-Mail-Anbieter, die Ihre E-Mails empfangen. Spammer versenden ihre Kampagnen in der Regel \u00fcber einen sehr kurzen Zeitraum, daher m\u00f6gen die Anbieter dieses Verhalten nicht. Um sich vor Missbrauch zu sch\u00fctzen, blockieren sie Nachrichten, die von einer IP-Adresse stammen, \u00fcber die noch nie zuvor eine E-Mail versendet wurde. Einige Anbieter akzeptieren die Nachrichten vielleicht noch, aber diese landen dann direkt im Spam. Das n\u00fctzt niemandem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit diese Nachrichten im Posteingang landen, sollten wir zun\u00e4chst weniger davon zustellen und das Volumen im Laufe der Zeit erh\u00f6hen, um eine Reputation aufzubauen; daher kommt der Begriff \u201eWarm-up\u201c. Denken Sie daran, wie Sie einen Motor warmlaufen lassen, bevor Sie Vollgas geben, oder sich im Fitnessstudio aufw\u00e4rmen, bevor Sie Gewichte heben\u00a0\u2013 es ist in etwa so \u00e4hnlich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie sich\u00a0<a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">Registrieren<\/a>\u00a0f\u00fcr ein Mailgun-Konto registrieren, erhalten Sie eine geteilte IP-Adresse. Eine geteilte IP-Adresse wird von mehreren Kunden genutzt, sie ist also bereits aufgew\u00e4rmt und hat eine gute Reputation. Sie m\u00fcssen sich dar\u00fcber keine Gedanken machen, es sei denn, ein anderer Absender sorgt daf\u00fcr, dass ihre Reputation sinkt. Nun m\u00f6chten Sie eine\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/faqs.html?highlight=dedicated&amp;utm_source=Mailgun&amp;utm_medium=Blog&amp;utm_campaign=Blog%20Links#faq\" target=\"_tabs\" rel=\"noopener noreferrer\">dedizierte IP-Adresse<\/a>hinzuf\u00fcgen, und wir haben bereits dar\u00fcber gesprochen,\u00a0<a href=\"https:\/\/www.mailgun.com\/de\/?blog_category=cheat-sheet-what-you-should-know-about-dedicated-ips\" target=\"_tabs\" rel=\"noopener noreferrer\">warum dies sinnvoll ist<\/a>\u00a0, wenn Ihr Versandvolumen steigt. Die dedizierte IP-Adresse, die Sie erhalten, ist neu und hat keine Reputation, daher wissen E-Mail-Anbieter nichts dar\u00fcber. Wir w\u00e4rmen sie nicht vor, da wir m\u00f6chten, dass Ihre IP-Adresse an Ihren Versand gekn\u00fcpft ist und Sie im Laufe der Zeit Ihre eigene Reputation aufbauen k\u00f6nnen. Das f\u00fchrt zu besseren Ergebnissen. Bedeutet das, dass Sie von Anfang an nur wenige Nachrichten versenden sollten? Ja, wir wissen, dass das nicht optimal ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier kommt das automatische IP-Warm-up ins Spiel. Wenn eine dedizierte IP-Adresse hinzugef\u00fcgt wird, bleibt die geteilte IP-Adresse weiterhin in Ihrem Konto, sodass wir den Traffic w\u00e4hrend des Warm-ups dorthin umleiten k\u00f6nnen. Im Laufe der Zeit erh\u00f6hen wir das Volumen schrittweise, um immer mehr Nachrichten zu versenden, bis die dedizierte IP-Adresse vollst\u00e4ndig aufgew\u00e4rmt ist und Sie startklar sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein sehr\u00a0<b>wichtiger<\/b>\u00a0Punkt ist jedoch, dass der Warm-up-Prozess allein keine hervorragende Zustellbarkeit garantiert. Ihre Praktiken als Absender bestimmen die Zustellbarkeit. \u00dcbernehmen Sie daher die Verantwortung f\u00fcr die von Ihnen versendeten Nachrichten und die Empf\u00e4nger, die diese erhalten. Andernfalls verschlechtern Sie die IP-Reputation nur langsam, anstatt sie sofort zu ruinieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warm-up-Plan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wir haben festgestellt, dass E-Mail-Anbieter in der Regel sowohl auf st\u00fcndliche als auch auf t\u00e4gliche Volumen achten. Das Volumen k\u00f6nnte jeden Tag um einige Prozent erh\u00f6ht werden. Das ist sehr praktisch, da dieser Zinseszinseffekt zu\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Exponential_growth\" target=\"_tabs\" rel=\"noopener noreferrer\">exponentiellem Wachstum<\/a>\u00a0und der M\u00f6glichkeit f\u00fchrt, das Volumen in relativ wenigen Schritten zu erh\u00f6hen. Wir nennen diese Schritte \u201eStufen\u201c. Diese Stufen bilden einen \u201eWarm-up-Plan\u201c, der wie folgt aussieht:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4911\" width=\"800\" height=\"174\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/table-1.png\" alt=\"table-1\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/table-1.png 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/table-1-300x65.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/table-1-768x167.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn wir die t\u00e4glichen Mengen grafisch darstellen, ergibt sich folgendes Bild:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4912\" width=\"982\" height=\"336\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/rampup.png\" alt=\"rampup\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/rampup.png 982w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/rampup-300x103.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/rampup-768x263.png 768w\" sizes=\"(max-width: 982px) 100vw, 982px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Er besteht aus 14 Stufen, und in jeder Stufe versenden wir eine bestimmte Menge an Nachrichten von einer dedizierten IP-Adresse. Dieses Volumen wurde von unserem Team f\u00fcr Zustellbarkeit durch Recherchen sorgf\u00e4ltig ermittelt und wird regelm\u00e4\u00dfig aktualisiert, sobald neue Erkenntnisse vorliegen. Es hat sich herausgestellt, dass der Versand der richtigen Menge an Nachrichten ein interessantes technisches Problem darstellt, und wir m\u00f6chten einige Details zu unserer L\u00f6sung teilen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ein bestimmtes Volumen aufrechterhalten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Werfen wir einen genaueren Blick auf die Implementierung eines Algorithmus, mit dem wir eine vorgegebene Menge an Nachrichten versenden k\u00f6nnen. Da wir nun eine geteilte und eine dedizierte IP-Adresse zusammen haben, sollten wir uns \u00fcberlegen, wie wir den Traffic zwischen den beiden aufteilen. Der einfachste Weg dazu ist die Implementierung eines\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Load_balancing_(computing)#Client-side_random_load_balancing\" target=\"_tabs\" rel=\"noopener noreferrer\">zuf\u00e4lligen Load-Balancing-Algorithmus<\/a>. Stellen Sie sich vor, wir werfen eine M\u00fcnze, um zu bestimmen, von welcher IP-Adresse eine Nachricht gesendet wird, wobei die geteilte IP-Adresse \u201eKopf\u201c und die dedizierte IP-Adresse \u201eZahl\u201c ist. Wenn wir die Anzahl der von der dedizierten IP-Adresse gesendeten Nachrichten verringern wollten, w\u00fcrden wir die Wahrscheinlichkeit \u00e4ndern, dass das Ergebnis \u201eZahl\u201c lautet. Das w\u00fcrde unsere M\u00fcnze zwar verf\u00e4lschen, aber es ist zu unserem Vorteil. So k\u00f6nnte das in Golang 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                                    var rnd = rand.New(rand.NewSource(98))trnvar probabilityOfDedicated = 0.2rnif rnd.Float64() &lt; probabilityOfDedicated {rn  return &quot;dedicated&quot;rn}rnreturn &quot;shared&quot;\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\">Die <code>probabilityOfDedicated<\/code> kann jeden Float-Wert von 0 bis 1,0 annehmen. Bei einem Wert von 1,0 werden alle Nachrichten \u00fcber die dedizierte IP-Adresse gesendet, und bei null gehen alle \u00fcber die geteilte IP-Adresse. Wenn wir den Wert auf 0,5 setzen, ist die Wahrscheinlichkeit f\u00fcr den Versand \u00fcber die dedizierte oder die geteilte IP-Adresse gleich hoch. Es ist im Wesentlichen ein Regler, der den Versand steuert.\u00a0Sehen wir uns an, wie wir eine Rate von 350 Nachrichten pro Stunde von der dedizierten IP-Adresse aufrechterhalten k\u00f6nnen, indem wir diesen Wert aktualisieren. Die einfachste L\u00f6sung w\u00e4re, die <code>probabilityOfDedicated<\/code> auf eins zu setzen und sie nach Erreichen der Grenze von 350 Nachrichten wieder auf null zur\u00fcckzusetzen. Das ist ein wenig abrupt, sollte aber funktionieren.<\/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                                    const cap = 350rnfunc getProbabilityOfDedicated(sentMessages int) float64 {rn  if sentMessages &lt; cap {rn    return 1rn  }rn  return 0rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4913\" width=\"800\" height=\"303\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/whatifItoldya.png\" alt=\"whatifItoldya\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/whatifItoldya.png 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/whatifItoldya-300x114.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/whatifItoldya-768x291.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Ist es wirklich so einfach?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. Optimierungstechniken wie Batch-Verarbeitung und Caching werden zu unseren besten Freunden. Sie erf\u00fcllen ihren Zweck hervorragend, verursachen aber zwangsl\u00e4ufig eine Verz\u00f6gerung zwischen der Berechnung, der Aktualisierung und der Verteilung eines Wertes \u00fcber alle Knoten eines Clusters. Nennen wir diese Verz\u00f6gerung im Folgenden Tr\u00e4gheit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In unserem Beispiel gibt es viele Faktoren, die zur Tr\u00e4gheit beitragen. Erstens erfolgen die Aktualisierungen der Statistiken aufgrund von Optimierungen im Dienst zum Z\u00e4hlen der Nachrichten m\u00f6glicherweise nicht wirklich in\u00a0Echtzeit. Zweitens gibt es durch das Caching eine Verz\u00f6gerung zwischen der Berechnung und der Verteilung unseres Wertes f\u00fcr die\u00a0<i>Wahrscheinlichkeit der Auswahl einer dedizierten IP-Adresse<\/i>. Bis wir bemerken, dass die 350. Nachricht versendet wurde und es Zeit ist, anzuhalten, k\u00f6nnten weitere Nachrichten durchrutschen, bevor die Aktualisierung wirksam wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist ein funktionierendes Beispiel. Sie k\u00f6nnen es gerne in den\u00a0<a href=\"https:\/\/play.golang.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Go Playground<\/a>\u00a0einf\u00fcgen und damit experimentieren:<\/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                                    package mainrnrnimport (rn  &quot;fmt&quot;rn  &quot;math\/rand&quot;rn  &quot;sync&quot;rn  &quot;time&quot;rn)rnrnvar (rn  mutex        = &amp;sync.Mutex{}rn  rnd          = rand.New(rand.NewSource(99))rn  messagesSent = 0   \/\/ keep track of the messages that IP sendsrn  probability  = 0.0 \/\/ probability of picking a dedicated IPrn)rnrnconst (rn  sampleRateMsec = 50.0  \/\/ how often the system is being refreshedrn  cap            = 350.0 \/\/ this is how many messages we want to sendrn)rnrn\/\/ deliverySimulator will emulate the message sending process.rn\/\/ It will pick the dedicated IP based on the probability.rnfunc deliverySimulator() {rn  for {rn    mutex.Lock()rn    if rnd.Float64() &lt; probability {rn      \/\/ We don&#039;t know how fast the messages arern      \/\/ being submitted, let&#039;s throw somern      \/\/ randomness in there to make it unpredictable.rn      messagesSent += rnd.Intn(10)rn    } else {rn      \/\/ Shared IP will be picked here.rn    }rn    mutex.Unlock()rn    time.Sleep(time.Millisecond)rn  }rn}rnrnfunc calcProbabilityOfDedicated(sent int) float64 {rn  if sent &lt; cap {rn    return 1rn  }rn  return 0rn}rnrnfunc main() {rn  go deliverySimulator()rnrn  \/\/ Control loop.rn  for i := 0; i &lt; 8; i++ {rn    mutex.Lock()rnrn    \/\/ Get messages.rn    sent := messagesSentrnrn    \/\/ Calculate probability.rn    probability = calcProbabilityOfDedicated(sent)rnrn    fmt.Println(&quot;sent:&quot;, sent, &quot;probability:&quot;, probability)rn    mutex.Unlock()rnrn    time.Sleep(time.Duration(sampleRateMsec) * time.Millisecond)rn  }rn}\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\">Hier ist die Ausgabe, die wir erhalten:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4914\" width=\"235\" height=\"187\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results1.png\" alt=\"results1\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Huch, es sieht so aus, als h\u00e4tten wir viel mehr Nachrichten versendet als geplant; fast 25\u00a0% mehr, um genau zu sein. Was k\u00f6nnen wir dagegen tun? Wir k\u00f6nnten einen Schwellenwert festlegen, um den Vorgang im Voraus zu stoppen, aber dieser m\u00fcsste f\u00fcr alle Kunden unterschiedlich sein, da sie Nachrichten in unterschiedlichen Raten einreichen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was w\u00e4re, wenn wir uns die Tr\u00e4gheit zunutze machen k\u00f6nnten? Was w\u00e4re, wenn wir schrittweise abbremsen k\u00f6nnten?<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4915\" width=\"800\" height=\"677\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/moment-before-disaster-311-1.jpg\" alt=\"moment-before-disaster-311-1\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/moment-before-disaster-311-1.jpg 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/moment-before-disaster-311-1-300x254.jpg 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/moment-before-disaster-311-1-768x650.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Physische Systeme<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tr\u00e4gheit ist in der physischen Welt sehr verbreitet. Um mechanische Systeme zu steuern, muss die Tr\u00e4gheit stets ber\u00fccksichtigt werden. K\u00f6nnen wir daraus etwas lernen?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die ersten Versuche, einen automatischen Regler f\u00fcr physische Systeme zu entwickeln, gehen auf das 17. Jahrhundert zur\u00fcck, und zwar mit dem\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Centrifugal_governor\" target=\"_tabs\" rel=\"noopener noreferrer\">Fliehkraftregler<\/a>. Dieser war damals ein wesentlicher Bestandteil jeder Dampfmaschine. Spulen wir vor ins fr\u00fche 20. Jahrhundert, wo die Theorie hinter dem\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/PID_controller\" target=\"_tabs\" rel=\"noopener noreferrer\">Proportional-Integral-Derivative-Regler (PID-Regler)<\/a>\u00a0entwickelt wurde, nachdem man beobachtet hatte, wie Schiffe gesteuert werden, indem verschiedene Umwelt- und Systemfaktoren ber\u00fccksichtigt werden. Heutzutage werden PID-Regler \u00fcberall eingesetzt, von Quadcoptern bis hin zu Toastern, denn sie sind sehr einfach und effektiv. Nat\u00fcrlich gibt es noch viele andere Steueralgorithmen, aber die meisten sind nicht ann\u00e4hernd so elegant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ein wenig Regelungstechnik<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sprechen wir \u00fcber die Theorie hinter PID-Reglern. Zun\u00e4chst einmal funktionieren sie nur, wenn es eine R\u00fcckkopplungsschleife gibt. R\u00fcckkopplungsschleifen sind recht einfach, da das Ergebnis der Aktion wieder in den Eingang des Reglers eingespeist wird. Das ist wie ein\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Ouroboros\" target=\"_tabs\" rel=\"noopener noreferrer\">Ouroboros<\/a>\u00a0falls diese Symbolik aus der Mythologie weiterhilft, und falls nicht, gibt es dieses Diagramm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>                                    +------------+<br>\n                           input    |            | output<br>\n                           +------&gt; |            | +------&gt;<br>\n                                    |   system   |<br>\n                           control  |            | feedback<br>\n                           +------&gt; |            | +------+<br>\n                           |        +------------+        |<br>\n                           |                              |<br>\n                           |        +------------+        |<br>\n                           +------+ | controller | &lt;------+\n                                    +------------+<\/code>Diagramm 1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sehen wir uns den\u00a0<b>Controller<\/b>-Block genauer an und \u00f6ffnen ihn.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4916\" width=\"800\" height=\"322\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/PID_diagram3.png\" alt=\"PID_diagram3\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/PID_diagram3.png 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/PID_diagram3-300x121.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/PID_diagram3-768x309.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wow, das ist eine Menge. Das ist ein wenig \u00fcberw\u00e4ltigend, also schl\u00fcsseln wir es etwas auf.\u00a0Zun\u00e4chst m\u00fcssen wir die Terminologie kl\u00e4ren. Hier sind einige Begriffe, mit denen Sie vertraut sein sollten:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Process_variable\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Prozessvariable<\/b><\/a>\u00a0\u2013\u00a0<i>y(t)<\/i>, der aktuelle Wert dessen, was wir steuern m\u00f6chten. In unserem Fall w\u00e4re das die Anzahl der von einer IP-Adresse versendeten Nachrichten, die als R\u00fcckkopplung dient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Setpoint_(control_system)\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Sollwert<\/b><\/a>\u00a0\u2013\u00a0<i>r(t)<\/i>, der Wert, den wir erreichen m\u00f6chten. In unserem Beispiel ist es die Obergrenze von 350 Nachrichten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Fehler<\/b>\u00a0\u2013 <i>e(t)<\/i>, die aktuelle Differenz zwischen einem Sollwert und einer Prozessvariable.\u00a0<i>e(t) = r(t) \u2013 y(t)<\/i>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Stellgr\u00f6\u00dfe<\/b>\u00a0\u2013 <i>u(t)<\/i>, die Ausgabe des Reglers. Diese steuert unsere\u00a0<i>Wahrscheinlichkeit f\u00fcr die Auswahl einer dedizierten IP-Adresse<\/i>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alle Variablen werden als Funktion\u00a0<i>f(t)<\/i> geschrieben. Das bedeutet, dass sich ihr Wert in Bezug auf die Zeit\u00a0<i>t<\/i> \u00e4ndert. Es handelt sich also um einen Wert\u00a0<i>zu genau diesem Zeitpunkt<\/i>.\u00a0Das Diagramm l\u00e4sst sich durch die klassische Formel aus jedem Lehrbuch der Regelungstechnik beschreiben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4917\" width=\"1144\" height=\"145\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/equation.png\" alt=\"equation\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/equation.png 1144w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/equation-300x38.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/equation-768x97.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/equation-1024x130.png 1024w\" sizes=\"(max-width: 1144px) 100vw, 1144px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt vier Terme in dieser Gleichung\u00a0\u2013 proportional + integral + derivativ + Bias. Jeder von ihnen tr\u00e4gt zum Steuersignal bei, und die Gewichtung ihrer Beitr\u00e4ge kann durch die entsprechenden Koeffizienten festgelegt werden:\u00a0<i>Kp<\/i>,\u00a0<i>Ki<\/i>,\u00a0<i>Kd<\/i>\u00a0und\u00a0<i>Kb<\/i>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der\u00a0<b>proportionale Term<\/b>\u00a0(Block P in Diagramm 2) ist der wichtigste Bestandteil der Gleichung. Wie der Name schon sagt, ist er proportional zum Fehler. Je gr\u00f6\u00dfer der Fehler, desto mehr Steuerkraft wird auf das System ausge\u00fcbt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der\u00a0<b>integrale Term<\/b>\u00a0(Block I in Diagramm 2) ist n\u00fctzlich, um den Sollwert schneller zu erreichen. Er summiert die Fehler im Laufe der Zeit und versucht, dem proportionalen Term bei deren Korrektur zu helfen. F\u00fcr unseren Anwendungsfall hat er jedoch einen sehr wichtigen Nachteil\u00a0\u2013 ein potenzielles \u00dcberschwingen. Die Eigenschaft des integralen Terms besteht darin, dass er anfangs nur langsam greift. Wenn sich jedoch mit der Zeit gen\u00fcgend Fehler angesammelt haben, kann er das System \u00fcbersteuern und \u00fcber den Sollwert hinausschie\u00dfen. Im extremsten Fall kann dies zu dem sogenannten\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Integral_windup\" target=\"_tabs\" rel=\"noopener noreferrer\">Integral Windup<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der\u00a0<b>derivative Term<\/b>\u00a0(Block D in Diagramm 2) ist proportional zur \u00c4nderungsrate. W\u00e4hrend wir den Fehler reduzieren, wird der derivative Term tats\u00e4chlich negativ. Wir k\u00f6nnen uns das so vorstellen: Wenn wir uns dem Sollwert zu schnell n\u00e4hern, bremst er uns ab. Dies f\u00fchrt in der Regel zu einer allm\u00e4hlicheren \u00c4nderung der Prozessvariable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der\u00a0<b>Bias-Term<\/b>\u00a0(Block B in Diagramm 2) ist lediglich eine Konstante. Er wird nicht oft verwendet, kann aber n\u00fctzlich sein, um den Wert weiter anzutreiben, wenn er sich nah am Sollwert befindet. An diesem Punkt ist der Fehler klein und der proportionale Term nicht besonders ausgepr\u00e4gt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stellen Sie sich diese Terme wie eine Jury vor, die dar\u00fcber abstimmt, was der n\u00e4chste Schritt sein sollte. Der Regler handelt auf Grundlage der vergebenen Punkte. Da sie unterschiedliche Pers\u00f6nlichkeiten haben, bewerten sie alle etwas unterschiedlich. Der Proportionale ist das vern\u00fcnftigste Jurymitglied und vergibt immer eine h\u00f6here Punktzahl, je weiter wir vom Sollwert entfernt sind. Der Integrale wird ungeduldig, wenn wir den Fehler zu lange nicht reduzieren, sodass er mit der Zeit eine h\u00f6here Punktzahl vergibt. Der Derivative ist immer nerv\u00f6s und vergibt Minuspunkte, wenn der Fehler zu schnell reduziert wird. Der Bias vergibt immer dieselbe Punktzahl, egal was passiert.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4918\" width=\"1024\" height=\"441\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/classic_PID_final2.png\" alt=\"classic_PID_final2\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/classic_PID_final2.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/classic_PID_final2-300x129.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/classic_PID_final2-768x331.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Die Theorie auf unser Problem anwenden<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir nun mit der Theorie vertraut sind, wenden wir sie an. Wir k\u00f6nnen den bestehenden Regelkreis aus dem vorherigen Beispiel verwenden. Eines der schwierigsten Dinge bei der Implementierung ist die Auswahl geeigneter Steuerkoeffizienten. Das Einstellen des PID-Prozesses ist nicht einfach, und es gibt\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/PID_controller#Overview_of_tuning_methods\" target=\"_tabs\" rel=\"noopener noreferrer\">einige Techniken<\/a>\u00a0, die uns dabei helfen k\u00f6nnen. Wir haben jedoch festgestellt, dass der schnellste Weg darin besteht, ein Simulationsskript zu erstellen und mit den Parametern zu experimentieren. Sie sind vielleicht nicht perfekt, aber sie reichen aus, um das Problem zu l\u00f6sen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So k\u00f6nnen wir uns die Koeffizienten in Bezug auf unser Problem vorstellen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Proportional<\/b>\u00a0verringert die\u00a0<i>Wahrscheinlichkeit f\u00fcr die Auswahl einer dedizierten IP-Adresse<\/i>, je n\u00e4her wir der gew\u00fcnschten Obergrenze kommen. Zu Beginn ist der Wert dieses Terms also gro\u00df und sinkt auf null, w\u00e4hrend wir immer mehr Nachrichten versenden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Integral<\/b>\u00a0ist knifflig und wir brauchen es vielleicht nicht einmal, da wir nicht korrigieren k\u00f6nnen: das\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Overshoot_(signal)\" target=\"_tabs\" rel=\"noopener noreferrer\">\u00dcberschwingen<\/a>. Die Nachrichten k\u00f6nnen nach dem Versand nicht gel\u00f6scht werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Derivativ<\/b>\u00a0ist ein sehr wichtiger Aspekt. Er hilft uns dabei, die Situation zu korrigieren, wenn die Nachrichten zu schnell \u00fcbermittelt werden. Wenn das passiert, wird der Term gro\u00df genug und beginnt, anderen Termen entgegenzuwirken. Da er in diesem Fall negativ ist, verringert er die Wahrscheinlichkeit und damit auch die Menge der Nachrichten, die \u00fcber eine dedizierte IP-Adresse versendet werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Bias<\/b>\u00a0kann sehr n\u00fctzlich sein, wenn wir nicht vorhaben, uns auf den integralen Term zu verlassen. Wenn wir uns der gew\u00fcnschten Obergrenze stark n\u00e4hern, ist der proportionale Term klein und kann den Wert nicht mehr so stark in diese Richtung treiben. In diesem Moment k\u00f6nnte der Bias f\u00fcr einen kleinen Schub sorgen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir nun all das wissen, k\u00f6nnen wir <code>calcProbabilityOfDedicated<\/code> durch folgenden Code ersetzen:<\/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                                    const (rn  \/\/ These coefficients has been picked by trial-and-error.rn  Kp = 0.42     \/\/ proportional coefficientrn  Ki = 0.000001 \/\/ can be removed to simplify the algorn  Kd = 1.2      \/\/ derivative coefficientrn  Kb = 0.1      \/\/ fairly small in this examplern)rnrnvar (rn  errorVal  = 0.0rn  prevError = 0.0rn  integral  = 0.0rn)rnrnfunc calcProbabilityOfDedicated(sent int) float64 {rn  prevError = errorValrnrn  \/\/ Calculate terms.rn  errorVal = cap - float64(sent)rn  integral = integral + (errorVal * float64(sampleRateMsec))rn  derivative := (errorVal - prevError) \/ float64(sampleRateMsec)rnrn  \/\/ Calculate PID control responsern  probability := Kp*errorVal + Ki*integral + Kd*derivative + Kbrnrn  \/\/ With given parameters the output is roughly within [0: 100]rn  \/\/ Let&#039;s shape it to [0: 1]rn  probability \/= 100rn  if probability &gt; 1 {rn    return 1rn  }rn  if probability &lt; 0 {rn    return 0rn  }rnrn  return probabilityrn}\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\">So erhalten wir Folgendes:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4919\" width=\"403\" height=\"184\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results2.png\" alt=\"results2\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results2.png 403w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results2-300x137.png 300w\" sizes=\"(max-width: 403px) 100vw, 403px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wie Sie sehen, funktioniert es reibungslos. Wir haben schnell auf 300 erh\u00f6ht, dann verlangsamt und schlie\u00dflich 350 erreicht, woraufhin die Wahrscheinlichkeit auf nat\u00fcrliche Weise auf fast null gesunken ist. Wie fantastisch ist das denn?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ergebnisse<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In der Realit\u00e4t stellt der Algorithmus den Wert vielleicht nicht pr\u00e4zise ein, aber er hat einen gro\u00dfen Vorteil\u00a0\u2013 er l\u00e4sst sich leicht verteilen. Stellen Sie sich vor, einer der Worker w\u00e4hlt eine IP-Adresse aus und sperrt sie, berechnet die Wahrscheinlichkeit, speichert sie und geht dann zur n\u00e4chsten \u00fcber. Dadurch k\u00f6nnen wir das Volumen von Tausenden von IP-Adressen gleichzeitig steuern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem wir das gekl\u00e4rt haben, k\u00f6nnen wir einen Warm-up-Plan erstellen. Er besteht aus Stufen, wobei jeder Stufe eine maximale Anzahl an Nachrichten zugewiesen ist. W\u00e4hrend wir die Stufen durchlaufen, erh\u00f6ht sich dieses maximale Volumen und Sie k\u00f6nnen immer mehr Nachrichten versenden. So k\u00f6nnen Sie genauso schnell versenden, wie Sie es von einer geteilten IP-Adresse gewohnt sind, w\u00e4hrend wir nach und nach eine neue, dedizierte aufw\u00e4rmen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sehen wir uns an, wie es in der Produktionsumgebung funktioniert. Hier haben wir das Volumen f\u00fcr jede Stufe grafisch dargestellt. Die Zielwerte stammen aus dem Warm-up-Plan, und die tats\u00e4chlichen Werte entsprechen dem, was versendet wurde.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4920\" width=\"836\" height=\"391\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results_graph.png\" alt=\"results_graph\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results_graph.png 836w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results_graph-300x140.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/results_graph-768x359.png 768w\" sizes=\"(max-width: 836px) 100vw, 836px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sieht gut aus. Vor der Einf\u00fchrung haben wir eine Simulationsumgebung erstellt, mit der wir verschiedene Szenarien testen konnten. So ist es uns gelungen, die Werte f\u00fcr die Koeffizienten aufeinander abzustimmen. Zu unserer gro\u00dfen \u00dcberraschung hat es beim ersten Deployment in der Produktionsumgebung direkt funktioniert&#8230; Wenn das doch nur bei jedem Deployment so w\u00e4re.\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vor einigen Monaten haben wir das automatische IP-Warm-up ver\u00f6ffentlicht, aber wir sind nie dazu gekommen, \u00fcber dessen Implementierung zu sprechen. Heute werfen wir einen Blick unter die Haube und versuchen zu verstehen, wie unser IP-Warm-up funktioniert. Wir beginnen mit etwas Kontext und tauchen sp\u00e4ter im Beitrag in die interessanten technischen Details ein.<\/p>\n","protected":false},"author":10,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[23],"class_list":["post-24964","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>Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...\" \/>\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\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-16T19:10:06+00:00\" \/>\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=\"13\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\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/\",\"name\":\"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - 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\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2019-07-16T00:00:00+00:00\",\"dateModified\":\"2026-09-16T19:10:06+00:00\",\"description\":\"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/#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\\\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\\\/#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\":\"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten\"}]},{\"@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":"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - Transactional Email API Service For Developers | Mailgun","description":"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...","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\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/","og_locale":"de_DE","og_type":"article","og_title":"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - Transactional Email API Service For Developers | Mailgun","og_description":"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...","og_url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-16T19:10:06+00:00","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":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/","url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/","name":"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten - 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\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2019-07-16T00:00:00+00:00","dateModified":"2026-09-16T19:10:06+00:00","description":"Wenn wir ein Programm auf Hunderten von Servern ausf\u00fchren m\u00f6chten, das Hunderttausende Anfragen pro Sekunde verarbeitet, k\u00f6nnen wir nicht erwarten, dass alles immer in Echtzeit aktualisiert wird. An diesem Punkt kommen verteilte Systeme ins Spiel. Weiterlesen...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/#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\/was-toaster-und-verteilte-systeme-gemeinsam-haben-koennten\/#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":"Was Toaster und verteilte Systeme gemeinsam haben k\u00f6nnten"}]},{"@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\/24964","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\/10"}],"version-history":[{"count":2,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24964\/revisions"}],"predecessor-version":[{"id":25062,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24964\/revisions\/25062"}],"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=24964"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=24964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}