{"id":24567,"date":"2019-07-16T00:00:00","date_gmt":"2019-07-16T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/"},"modified":"2026-09-16T19:08:45","modified_gmt":"2026-09-16T19:08:45","slug":"podrian-tener-comun-tostadoras-sistemas-distribuidos","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/","title":{"rendered":"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A few months ago\u00a0<a href=\"https:\/\/www.mailgun.com\/es\/blog\/ip-warm-up\" target=\"_tabs\" rel=\"noopener noreferrer\">we released automatic IP Warm Up<\/a>, but we never got to talk about how it\u2019s implemented. Today, we\u2019re going to peek under the hood and try to understand what makes our IP warm up tick. We\u2019re going to start with some context, and then we\u2019ll dive into the interesting technical details later in the post.<\/p>\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-8646\"><p class=\"h5 m-0\" id=\"toc-title-8646\">\u00cdndice<\/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=\"#why-is-ip-warm-up-so-important\">Why is IP Warm Up so important?<\/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=\"#how-to-maintain-a-certain-volume\">How to maintain a certain volume<\/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=\"#is-it-really-that-simple\">Is it really that simple?<\/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=\"#physical-systems\">Physical systems<\/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=\"#a-little-bit-of-control-theory\">A little bit of Control Theory<\/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=\"#applying-the-theory-to-our-problem\">Applying the theory to our problem<\/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=\"#results\">Results<\/a><\/div><\/div><\/nav>\n<h2 class=\"wp-block-heading\">Why is IP Warm Up so important?<\/h2>\n\n<p class=\"wp-block-paragraph\">Let\u2019s face it \u2014 no one likes receiving tons of information all at once. The same can be said for mailbox providers receiving your emails. Spammers usually blast out their campaigns over a short period of time, so the providers don\u2019t like that behavior. To protect themselves from abuse, they\u2019ll block messages that come from an IP that has never sent an email before. Some providers might still accept the messages, but those messages will go right to spam. That\u2019s not good for anybody.<\/p>\n\n<p class=\"wp-block-paragraph\">To get those messages into the inbox we better start delivering fewer of them and ramp up the volume over time to build up a reputation; that\u2019s why it is called \u201cwarm up.\u201d Think about warming up a car engine before flooring it or doing light exercises before lifting weights at a gym, it\u2019s a bit like that.<\/p>\n\n<p class=\"wp-block-paragraph\">When you\u00a0<a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">sign up<\/a>\u00a0for a Mailgun account, you get a shared IP. A shared IP means it\u2019s used by multiple customers, so it\u2019s already warmed up and has a good reputation. You don\u2019t have to worry about it unless another sender causes its reputation to go down. Now you want to add a\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\">dedicated IP<\/a>, and we\u2019ve talked about\u00a0<a href=\"https:\/\/www.mailgun.com\/es\/blog\/cheat-sheet-what-you-should-know-about-dedicated-ips\" target=\"_tabs\" rel=\"noopener noreferrer\">why you might want that<\/a>\u00a0as your sending volume grows. The dedicated IP that you get is fresh and has no reputation, hence mailbox providers know nothing about it. We don\u2019t pre-warm them because we want your IP to be tied to what you\u2019re sending and so you can build your own reputation over time. That will lead to better results. Does it mean you still have to send only a few messages from the start? Yes, we know that it\u2019s not ideal.<\/p>\n\n<p class=\"wp-block-paragraph\">That\u2019s where automatic IP warm up comes in. When a dedicated IP gets added, the shared IP still remains on your account, so we can divert the traffic to it during the warm-up. Over time, we can increase the volume a little bit at a time to send more and more messages until the dedicated IP is fully warmed up and you\u2019re ready to go.<\/p>\n\n<p class=\"wp-block-paragraph\">A very\u00a0<b>important<\/b>\u00a0thing to remember, however, is that the warm-up process will not buy you great deliverability! The practices you incorporate as a sender is what drives deliverability so make sure you are taking responsibility for the messages you send out and the recipients that receive them. Otherwise, you\u2019re just slowly deteriorating the IP reputation instead of instantly burning it!<\/p>\n\n<h2 class=\"wp-block-heading\">Warm Up Plan<\/h2>\n\n<p class=\"wp-block-paragraph\">We\u2019ve found that mailbox providers typically care about both hourly and daily volumes. Each day the volume could be increased by a few percent. This is very handy because this compound effect leads to\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Exponential_growth\" target=\"_tabs\" rel=\"noopener noreferrer\">exponential growth<\/a>\u00a0and the ability to ramp up in a relatively small amount of steps. We call these steps \u201cstages\u201d. Stages make up a \u201cwarm-up plan\u201d, that looks like this:<\/p>\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<p class=\"wp-block-paragraph\">If we plot the daily amounts, we\u2019ll get the following picture:<\/p>\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<p class=\"wp-block-paragraph\">It consists of 14 stages and at each stage, we send a certain amount of messages from a dedicated IP. That volume was carefully determined by our deliverability team through research and is periodically updated when we collect new evidence. It turned out that sending a proper amount of messages is an interesting engineering problem and we\u2019d like to share some details on the way we solved it.<\/p>\n\n<h2 class=\"wp-block-heading\">How to maintain a certain volume<\/h2>\n\n<p class=\"wp-block-paragraph\">Let\u2019s dive in and take a closer look at the implementation of an algorithm that allows us to send a given amount of messages. Now that we have a shared and a dedicated IP together, we should think about how to balance the traffic between the two of them. The easiest way to do that is to implement a\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Load_balancing_(computing)#Client-side_random_load_balancing\" target=\"_tabs\" rel=\"noopener noreferrer\">random load-balancing algorithm<\/a>. Imagine that we flip a coin to determine which IP a message is sent from, with the shared IP being \u201cheads\u201d and the dedicated IP being \u201ctails.\u201d If we wanted to decrease the number of messages coming from the dedicated IP, we would change the probability of getting \u201ctails\u201d as our outcome. This would make our coin unfair, but it works to our advantage. Here is how that might look in golang:<\/p>\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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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<p class=\"wp-block-paragraph\">The <code>probabilityOfDedicated<\/code> can take any float value from 0 to 1.0. When it\u2019s 1.0 all messages go through the dedicated IP and when it\u2019s 0 everything goes through the shared one. Setting it to 0.5 will give us equal odds of sending it via the dedicated IP or shared IP. It\u2019s essentially a knob that controls the sending flow.\u00a0Let\u2019s see how we can maintain a rate of 350 messages an hour from the dedicated IP by updating that value. The simplest thing that comes to mind is setting the <code>probabilityOfDedicated<\/code> to 1 and once the 350 message mark is reached, reset it to 0. It\u2019s a little abrupt, but should do the trick.<\/p>\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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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<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<h2 class=\"wp-block-heading\">Is it really that simple?<\/h2>\n\n<p class=\"wp-block-paragraph\">When we want to run a program on hundreds of servers processing hundreds of thousands of requests per second we can\u2019t expect everything to be always updated in real-time. Optimization techniques such as batch processing and caching become our best friends. They\u2019re great at what they were designed for, but they inevitably add a lag between a value being calculated, updated, and shared across all the nodes in a cluster. Let\u2019s call that lag inertia from here on out.<\/p>\n\n<p class=\"wp-block-paragraph\">Speaking of our example, there are many things that contribute to inertia. First, the statistics updates might not be truly\u00a0real-time due to optimizations in the message counting service. Second, there is a lag between when our value of\u00a0<i>probability of picking dedicated IP<\/i>\u00a0gets calculated and distributed due to caching. By the time we see that a 350th message has been sent and it\u2019s time to stop, more might slip through before the update takes an effect.<\/p>\n\n<p class=\"wp-block-paragraph\">This is a working example, so feel free to paste it to\u00a0<a href=\"https:\/\/play.golang.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\">go playground<\/a>\u00a0and play with it:<\/p>\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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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<p class=\"wp-block-paragraph\">Here is the output we get:<\/p>\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<p class=\"wp-block-paragraph\">Oops, looks like we sent many more messages than we wanted; almost 25% more as a matter of fact. What can we do about it? Well, we can come up with a threshold to stop it in advance, but that would have to be different for every customer as they all submit messages at different rates.<\/p>\n\n<p class=\"wp-block-paragraph\">What if we can embrace inertia? What if we could gradually slow down?<\/p>\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<h2 class=\"wp-block-heading\">Physical systems<\/h2>\n\n<p class=\"wp-block-paragraph\">Inertia is so common in the physical world. In order to control mechanical systems, engineers have to always take inertia into account. Can we learn anything from them?<\/p>\n\n<p class=\"wp-block-paragraph\">The first attempts of creating an automatic controller for physical systems date back to 17th century with the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Centrifugal_governor\" target=\"_tabs\" rel=\"noopener noreferrer\">centrifugal governor<\/a>. It was an essential part of any steam engine at the time. Fast forward to the early 20th century where the theory behind\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/PID_controller\" target=\"_tabs\" rel=\"noopener noreferrer\">Proportional Integral Derivative (PID) controller<\/a>\u00a0was developed after observing how helmsmen control ships by taking into account different environmental and system factors. These days PID controllers are used everywhere from quadcopters to toasters, and it\u2019s because they are very simple and effective. Of course, there are many other control algorithms, but most of them are not as nearly as elegant.<\/p>\n\n<h2 class=\"wp-block-heading\">A little bit of Control Theory<\/h2>\n\n<p class=\"wp-block-paragraph\">Let\u2019s talk about the theory behind PID controllers. For starters, they only work when there is a feedback loop. Feedback loops are pretty straightforward in that the result of the control action gets piped back to the controller input. It\u2019s like an\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Ouroboros\" target=\"_tabs\" rel=\"noopener noreferrer\">ouroboros<\/a>\u00a0if the mythology symbolism helps, and if not, there\u2019s this diagram.<\/p>\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>Diagram 1<\/p>\n\n<p class=\"wp-block-paragraph\">Let\u2019s take a closer look at the\u00a0<b>controller<\/b>\u00a0block and open it up.<\/p>\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<p class=\"wp-block-paragraph\">Whoa, that\u2019s a lot. It\u2019s a little overwhelming so let\u2019s break it down a bit.\u00a0First, we need to agree on terminology. Here are a few terms to be familiar with going in:<\/p>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Process_variable\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Process variable<\/b><\/a>\u00a0\u2013\u00a0<i>y(t)<\/i>, the current value of the thing we want to control. In our case, it would be the number of messages sent from an IP and will serve as the feedback.<\/p>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Setpoint_(control_system)\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Setpoint<\/b><\/a>\u00a0\u2013\u00a0<i>r(t)<\/i>, the value we want to land at. In our example, it\u2019s the cap of 350 messages.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Error<\/b>\u00a0\u2013\u00a0<i>e(t)<\/i>, the current difference between a setpoint and a process variable.\u00a0<i>e(t) = r(t) \u2013 y(t)<\/i>.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Control variable<\/b>\u00a0\u2013\u00a0<i>u(t)<\/i>, the output of the controller, this will drive our\u00a0<i>probability of picking a dedicated IP<\/i>.<\/p>\n\n<p class=\"wp-block-paragraph\">All variables are written as a function\u00a0<i>f(t)<\/i>, which means its value changes in relation to time\u00a0<i>t<\/i>, so it\u2019s a value\u00a0<i>at that very moment of time<\/i>.\u00a0The diagram can be described by the classic formula from any textbook on the control theory:<\/p>\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<p class=\"wp-block-paragraph\">There are 4 terms in this equation \u2014 proportional + integral + derivative + bias. Each of them contribute to the control signal and the weight of their contributions can be set by respective coefficients:\u00a0<i>Kp<\/i>,\u00a0<i>Ki<\/i>,\u00a0<i>Kd<\/i>\u00a0and\u00a0<i>Kb<\/i>.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Proportional term<\/b>\u00a0(block P of diagram 2) is the most important term of the equation. As the name states, it\u2019s proportional to the error. The bigger the error, the bigger control force will be applied to the system.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Integral term<\/b>\u00a0(block I of diagram 2) is useful for getting to the setpoint faster. It accumulates the errors over time and tries to help the proportional term to correct for them. It has a very important drawback for our use case though \u2014 potential overshoot. The nature of the integral term is that it\u2019s slow to kick in at the beginning, but when enough error is accumulated over time it can put the system in overdrive getting past the setpoint. In the most extreme case, it can lead to what is called\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Integral_windup\" target=\"_tabs\" rel=\"noopener noreferrer\">integral windup<\/a>.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Derivative term<\/b>\u00a0(block D of diagram 2) is proportional to the rate of change. As we reduce the error, the derivative term actually becomes negative. We can think of it as if we approach the setpoint too fast it, it will slow us down. Usually, it results to a more gradual change of the process variable.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Bias term<\/b>\u00a0(block B of diagram 2) is just a constant; it\u2019s not used often but might be useful to still drive the value when it\u2019s close to the setpoint. At that point, the error is small and the proportional term is not that pronounced.<\/p>\n\n<p class=\"wp-block-paragraph\">Think about these terms as if they were all in a panel of judges voting on the decision of what the next step should be. The controller acts based on the scores they give. Since they have different personalities they all score a bit differently. The proportional is the most reasonable judge and always gives a higher score the further we are from the setpoint. The integral gets impatient if we\u2019re not reducing the error for too long so it scores higher as time goes on. The derivative is always nervous and scores negatively if the error is reduced too fast. The bias always scores the same no matter what.<\/p>\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<h2 class=\"wp-block-heading\">Applying the theory to our problem<\/h2>\n\n<p class=\"wp-block-paragraph\">Now that we\u2019re familiar with the theory, let\u2019s apply it. We can use the existing control loop from the previous example. One of the hardest thing implementing this is to pick proper control coefficients. Tuning the PID process is not straightforward, and there are\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/PID_controller#Overview_of_tuning_methods\" target=\"_tabs\" rel=\"noopener noreferrer\">few techniques<\/a>\u00a0out there that can help us with that. However, we\u2019ve found that the fastest way is to create a simulation script and play with the parameters. They might not be perfect, but they will be good enough to solve the problem.<\/p>\n\n<p class=\"wp-block-paragraph\">Here is how we might think of the coefficients in regards to our problem.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Proportional<\/b>\u00a0will decrease the\u00a0<i>probability of picking a dedicated IP<\/i>\u00a0the closer we are to the desired cap. So, when we start, the term value is big and it goes down to 0 as we send more and more messages.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Integral<\/b>\u00a0is tricky and we might not even need it, as we can\u2019t correct the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Overshoot_(signal)\" target=\"_tabs\" rel=\"noopener noreferrer\">overshoot<\/a>. The messages can\u2019t be deleted once they are sent out.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Derivative<\/b>\u00a0is a very important one. It will help us to correct for the situation when the messages are submitted too fast. When that happens the term becomes big enough and starts counteracting other terms. Since it is negative when that happens it will reduce the probability and, in turn, reduce the amount of messages that get sent out from a dedicated IP.<\/p>\n\n<p class=\"wp-block-paragraph\"><b>Bias<\/b>\u00a0might be very useful if we\u2019re not planning to rely on the integral term. When we get really close to the desired cap the proportional term will be small and it won\u2019t be able to drive the value toward it as hard. This is when bias could give it a little kick.<\/p>\n\n<p class=\"wp-block-paragraph\">Now that we know all of that we can replace <code>calcProbabilityOfDedicated<\/code> with the following code:<\/p>\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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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<p class=\"wp-block-paragraph\">So we get this:<\/p>\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<p class=\"wp-block-paragraph\">As you can see it works like a charm. We quickly ramped up to 300, slowed down and eventually got to 350, then the probability went down close to 0 naturally. How cool is that?!<\/p>\n\n<h2 class=\"wp-block-heading\">Results<\/h2>\n\n<p class=\"wp-block-paragraph\">In reality, the algorithm might not set the value precisely, but it has one major advantage \u2014 it can easily be distributed. Imagine if one of the workers picks up and locks an IP, calculates the probability, saves it, and then off to the next one. This allows us to control the volume of thousands of IPs simultaneously.<\/p>\n\n<p class=\"wp-block-paragraph\">Now that we have that figured out, we can create a warm up plan. It would consist of stages, where each stage has a maximum amount of messages assigned to it. As we progress through the stages this maximum volume increases and you are free to send out more and more messages. This gives you the ability to send as fast as you\u2019re used to from a shared IP, while we gradually warm up a fresh dedicated one.<\/p>\n\n<p class=\"wp-block-paragraph\">Let\u2019s see how it works in production. Here we plotted the volume at each stage. The desired values come from the plan and actual are what was sent out.<\/p>\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<p class=\"wp-block-paragraph\">Looks good! Before rolling it out we created a simulation environment that allowed us to test different scenarios. This is how we managed to get the values for the coefficients lined up. To our big surprise, it worked out when we deployed it to production the first time\u2026 oh, if only it happened for every deployment!\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace unos meses lanzamos el calentamiento autom\u00e1tico de IP, pero nunca llegamos a hablar de c\u00f3mo se implementa. Hoy, vamos a echar un vistazo bajo el cap\u00f3 y tratar de entender qu\u00e9 hace funcionar a nuestro calentamiento de IP. Vamos a empezar con un poco de contexto, y luego nos sumergiremos en los detalles t\u00e9cnicos interesantes m\u00e1s adelante en la publicaci\u00f3n.<\/p>\n","protected":false},"author":10,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[23],"class_list":["post-24567","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>Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...\" \/>\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\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-16T19:08:45+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 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/\",\"name\":\"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/#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:08:45+00:00\",\"description\":\"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/#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\\\/es\\\/blog\\\/it-and-engineering\\\/podrian-tener-comun-tostadoras-sistemas-distribuidos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/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\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun","description":"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...","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\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/","og_locale":"es_ES","og_type":"article","og_title":"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun","og_description":"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...","og_url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-16T19:08:45+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 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/","url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/","name":"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/#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:08:45+00:00","description":"Cuando queremos ejecutar un programa en cientos de servidores procesando cientos de miles de solicitudes por segundo, no podemos esperar que todo se actualice siempre en tiempo real. Ah\u00ed es cuando entran en juego los sistemas distribuidos. M\u00e1s informaci\u00f3n...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/#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\/es\/blog\/it-and-engineering\/podrian-tener-comun-tostadoras-sistemas-distribuidos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Qu\u00e9 podr\u00edan tener en com\u00fan las tostadoras y los sistemas distribuidos"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/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\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/10"}],"version-history":[{"count":3,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24567\/revisions"}],"predecessor-version":[{"id":24677,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24567\/revisions\/24677"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=24567"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=24567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}