<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jairo Junior</title>
    <description>The latest articles on DEV Community by Jairo Junior (@jairo-dev-jr).</description>
    <link>https://dev.to/jairo-dev-jr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg</url>
      <title>DEV Community: Jairo Junior</title>
      <link>https://dev.to/jairo-dev-jr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jairo-dev-jr"/>
    <language>en</language>
    <item>
      <title>Hy guys, I've updated my portfolio, if you want to see it, its here:
https://jairo.dev.br/</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Fri, 27 Mar 2026 18:02:48 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/hy-guys-ive-updated-my-portfolio-if-you-want-to-see-it-its-herehttpsjairodevbr-51jd</link>
      <guid>https://dev.to/jairo-dev-jr/hy-guys-ive-updated-my-portfolio-if-you-want-to-see-it-its-herehttpsjairodevbr-51jd</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://jairo.dev.br/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;jairo.dev.br&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Did you know that your app just need an umbrella, let's talk about it and the impportance of the rate-limiting in your app.</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Fri, 13 Mar 2026 11:29:41 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/did-you-know-that-your-app-just-need-an-umbrella-lets-talk-about-it-and-the-impportance-of-the-4jmd</link>
      <guid>https://dev.to/jairo-dev-jr/did-you-know-that-your-app-just-need-an-umbrella-lets-talk-about-it-and-the-impportance-of-the-4jmd</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm" class="crayons-story__hidden-navigation-link"&gt;Rate Limiting: How to Stop Your API From Drowning in Requests&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3325994" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 10&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm" id="article-link-3325994"&gt;
          Rate Limiting: How to Stop Your API From Drowning in Requests
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/backend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;backend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sre"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sre&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>backend</category>
      <category>learning</category>
      <category>cloud</category>
      <category>sre</category>
    </item>
    <item>
      <title>Rate Limiting: How to Stop Your API From Drowning in Requests</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Tue, 10 Mar 2026 18:34:04 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm</link>
      <guid>https://dev.to/jairo-dev-jr/rate-limiting-how-to-stop-your-api-from-drowning-in-requests-31mm</guid>
      <description>&lt;p&gt;Hello! I'm Jairo.&lt;/p&gt;

&lt;p&gt;Your favorite dev.to writer.&lt;/p&gt;

&lt;p&gt;Just kidding — I know I'm not. Just breaking the ice 😄&lt;/p&gt;

&lt;p&gt;Last week I was reading an excellent book called &lt;strong&gt;System Design Interview by Alex Xu&lt;/strong&gt;. If you work with backend systems and haven't read it yet, you probably should.&lt;/p&gt;

&lt;p&gt;One concept from the book reminded me of something interesting about software engineers: we all &lt;strong&gt;know rate limiting exists&lt;/strong&gt;, but very few engineers really understand &lt;strong&gt;when to use it, how it works internally, and which strategy to choose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So today let's talk about one of the &lt;strong&gt;most important protections your API can have&lt;/strong&gt;: rate limiting.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is Rate Limiting?
&lt;/h1&gt;

&lt;p&gt;Let’s imagine something simple.&lt;/p&gt;

&lt;p&gt;Your application is a person walking in the rain, and every &lt;strong&gt;raindrop represents an HTTP request&lt;/strong&gt; hitting your server.&lt;/p&gt;

&lt;p&gt;At first, everything is fine. Then the rain gets heavier. More drops. More requests. Eventually your application becomes completely soaked — CPU usage increases, your database starts struggling, and suddenly your server turns into soup.&lt;/p&gt;

&lt;p&gt;Not ideal.&lt;/p&gt;

&lt;p&gt;What do we do when it's raining?&lt;/p&gt;

&lt;p&gt;We grab an &lt;strong&gt;umbrella&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(No, not the evil corporation from Resident Evil — a real umbrella.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That umbrella represents a &lt;strong&gt;rate limiter&lt;/strong&gt;. It doesn't stop the rain entirely; it simply &lt;strong&gt;controls how much rain reaches you&lt;/strong&gt;. In the same way, a rate limiter allows some requests to pass while blocking the excess ones, protecting your system from overload.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Happens Without Rate Limiting?
&lt;/h1&gt;

&lt;p&gt;Without rate limiting, a client could send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 requests per second
100 requests per second
1000 requests per second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application will try to process every request it receives. Eventually this leads to CPU overload, database contention, cascading failures, and sometimes a full system crash.&lt;/p&gt;

&lt;p&gt;With rate limiting in place, the server can simply respond with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP 429 - Too Many Requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which is basically your server saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Slow down, my friend."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Common Rate Limiting Algorithms
&lt;/h1&gt;

&lt;p&gt;There are several strategies used to implement rate limiting. Each one has different trade-offs depending on the system requirements.&lt;/p&gt;

&lt;p&gt;Let's go through the most common ones.&lt;/p&gt;




&lt;h1&gt;
  
  
  Token Bucket
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Token Bucket&lt;/strong&gt; algorithm is one of the most widely used rate limiting strategies.&lt;/p&gt;

&lt;p&gt;Imagine a bucket filled with tokens. Every incoming request must take &lt;strong&gt;one token&lt;/strong&gt; to be processed. If the bucket still has tokens, the request is allowed. If the bucket is empty, the request is rejected.&lt;/p&gt;

&lt;p&gt;Tokens are added back into the bucket at a fixed rate.&lt;/p&gt;

&lt;p&gt;Example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket capacity: 10 tokens
Refill rate: 1 token per second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows the system to support short bursts of traffic, but once all tokens are consumed, incoming requests must wait until new tokens are added.&lt;/p&gt;

&lt;p&gt;This algorithm is popular because it supports bursts while still controlling overall traffic.&lt;/p&gt;




&lt;h1&gt;
  
  
  Leaky Bucket
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Leaky Bucket&lt;/strong&gt; algorithm works a bit differently.&lt;/p&gt;

&lt;p&gt;Imagine a bucket with a small hole at the bottom. Requests enter the bucket like water, but water leaks out at a constant rate.&lt;/p&gt;

&lt;p&gt;If too many requests arrive too quickly, the bucket fills up and eventually overflows, causing new requests to be rejected.&lt;/p&gt;

&lt;p&gt;This approach forces requests to be processed at a &lt;strong&gt;constant and predictable rate&lt;/strong&gt;, which helps smooth traffic spikes.&lt;/p&gt;

&lt;p&gt;The downside is that it doesn't handle bursts as well as the token bucket strategy.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sliding Window Log
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Sliding Window Log&lt;/strong&gt; strategy tracks the timestamp of every request.&lt;/p&gt;

&lt;p&gt;For example, if your limit is &lt;strong&gt;5 requests per minute&lt;/strong&gt;, the system checks all requests that happened within the last 60 seconds.&lt;/p&gt;

&lt;p&gt;If five requests already exist in that window, the new request is rejected. If not, it is allowed.&lt;/p&gt;

&lt;p&gt;This method is very accurate because it always considers the real time window instead of fixed intervals.&lt;/p&gt;

&lt;p&gt;However, it requires storing many timestamps, which can become expensive at large scale.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sliding Window Counter
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Sliding Window Counter&lt;/strong&gt; is an optimization of the sliding window idea.&lt;/p&gt;

&lt;p&gt;Instead of storing every timestamp, it keeps track of only two counters: requests in the &lt;strong&gt;current time window&lt;/strong&gt; and requests in the &lt;strong&gt;previous window&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The algorithm then calculates a weighted average between those two counters to estimate the real request rate.&lt;/p&gt;

&lt;p&gt;This method dramatically reduces memory usage while still providing good accuracy, which is why it is commonly used in large distributed systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  Implementing Rate Limiting in Java
&lt;/h1&gt;

&lt;p&gt;Now let's look at a few simple ways to implement rate limiting in Java.&lt;/p&gt;

&lt;p&gt;These examples are simplified but illustrate the idea.&lt;/p&gt;




&lt;h2&gt;
  
  
  Simple In-Memory Rate Limit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleRateLimiter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lastRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;allowRequest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;clientId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lastRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;lastRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example allows &lt;strong&gt;one request per second per client&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Token Bucket Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.atomic.AtomicInteger&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TokenBucket&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AtomicInteger&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AtomicInteger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;allowRequest&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decrementAndGet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;refill&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementAndGet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A scheduled task can periodically refill tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using Resilience4j (Production Approach)
&lt;/h2&gt;

&lt;p&gt;In production systems, engineers often use libraries instead of building rate limiters from scratch.&lt;/p&gt;

&lt;p&gt;One popular option is &lt;strong&gt;Resilience4j&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;RateLimiterConfig&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RateLimiterConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limitForPeriod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limitRefreshPeriod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeoutDuration&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofMillis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;RateLimiter&lt;/span&gt; &lt;span class="n"&gt;rateLimiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RateLimiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apiLimiter"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Supplier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;decoratedSupplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nc"&gt;RateLimiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decorateSupplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rateLimiter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Hello API"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Try&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSupplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoratedSupplier&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onFailure&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rate limit exceeded"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach integrates well with Spring Boot and production APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where Rate Limiting Is Usually Applied
&lt;/h1&gt;

&lt;p&gt;Rate limiting can be implemented in several layers of your architecture.&lt;/p&gt;

&lt;p&gt;At the &lt;strong&gt;API Gateway&lt;/strong&gt;, tools like NGINX, Kong, Cloudflare, or AWS API Gateway commonly enforce limits before traffic even reaches your application.&lt;/p&gt;

&lt;p&gt;Inside the &lt;strong&gt;application layer&lt;/strong&gt;, libraries like Resilience4j or Bucket4j allow developers to control request flow directly within the service.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;distributed systems&lt;/strong&gt;, Redis is often used to share rate limit counters across multiple instances.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Rate limiting looks simple on the surface. But once your system begins handling real traffic, it quickly becomes clear how important it is.&lt;/p&gt;

&lt;p&gt;A well-designed rate limiter protects your:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API&lt;/li&gt;
&lt;li&gt;infrastructure&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And sometimes, the difference between a stable system and an outage is surprisingly simple.&lt;/p&gt;

&lt;p&gt;Sometimes your API just needs…&lt;/p&gt;

&lt;p&gt;a good umbrella ☔&lt;/p&gt;

</description>
      <category>backend</category>
      <category>learning</category>
      <category>cloud</category>
      <category>sre</category>
    </item>
    <item>
      <title>Stop building a new microservice for every problem.
I almost built another backend just to handle personalization logic in my workout app.
Instead, I used AI as a controlled decision layer.
AI doesn’t replace architecture.
It becomes part of it.</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Tue, 03 Mar 2026 12:14:01 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/stop-building-a-new-microservice-for-every-problem-i-almost-built-another-backend-just-to-handle-1j2i</link>
      <guid>https://dev.to/jairo-dev-jr/stop-building-a-new-microservice-for-every-problem-i-almost-built-another-backend-just-to-handle-1j2i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf" class="crayons-story__hidden-navigation-link"&gt;Replacing a Rule Engine with AI: A Solo Developer Decision&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3305180" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf" id="article-link-3305180"&gt;
          Replacing a Rule Engine with AI: A Solo Developer Decision
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/backend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;backend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>backend</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Replacing a Rule Engine with AI: A Solo Developer Decision</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Tue, 03 Mar 2026 12:05:40 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf</link>
      <guid>https://dev.to/jairo-dev-jr/replacing-a-rule-engine-with-ai-a-solo-developer-decision-37jf</guid>
      <description>&lt;p&gt;Hello! I’m Jairo Jr. 👋&lt;br&gt;
I hope you’re doing great.&lt;/p&gt;

&lt;p&gt;I’m a backend software engineer and I’m currently building an app to generate gym workouts for beginners.&lt;br&gt;
And at some point, I hit a &lt;strong&gt;very real problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I needed the app to create something &lt;strong&gt;personalized&lt;/strong&gt; for each user.&lt;/p&gt;

&lt;p&gt;And that’s where things got complicated.&lt;/p&gt;


&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I started asking myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should I create another backend just for personalization?&lt;/li&gt;
&lt;li&gt;Should I build a microservice to handle user profiles and workout rules?&lt;/li&gt;
&lt;li&gt;Should I design a full recommendation engine with categories, difficulty levels, and decision trees?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technically, all of that is possible.&lt;/p&gt;

&lt;p&gt;But then reality kicked in.&lt;/p&gt;

&lt;p&gt;This is a solo project.&lt;br&gt;
I already have one backend running.&lt;br&gt;
Creating another service just to manage complex workout logic would mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more infrastructure cost&lt;/li&gt;
&lt;li&gt;more maintenance&lt;/li&gt;
&lt;li&gt;more mental overhead&lt;/li&gt;
&lt;li&gt;slower development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I stopped and asked a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do I really need to build all this logic manually?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The “backend-first” mindset (and why it didn’t make sense)
&lt;/h2&gt;

&lt;p&gt;My first idea was very classic backend thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;collect user data (goal, level, duration)&lt;/li&gt;
&lt;li&gt;map everything into a workout category tree&lt;/li&gt;
&lt;li&gt;choose exercises based on rules&lt;/li&gt;
&lt;li&gt;define sets and repetitions programmatically&lt;/li&gt;
&lt;li&gt;store and version all of this logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, build a recommendation engine from scratch.&lt;/p&gt;

&lt;p&gt;For a big team? Maybe.&lt;br&gt;
For a solo app? Overkill.&lt;/p&gt;

&lt;p&gt;So instead of asking &lt;em&gt;how to build it&lt;/em&gt;, I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can AI help me make this decision — without losing control?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The savior: LangChain + OpenAI
&lt;/h2&gt;

&lt;p&gt;After evaluating complexity and cost, I chose a simpler approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a lightweight service that calls OpenAI’s API&lt;/li&gt;
&lt;li&gt;structured prompts&lt;/li&gt;
&lt;li&gt;strict schema validation&lt;/li&gt;
&lt;li&gt;controlled domain data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of building a heavy rule engine, I built an &lt;strong&gt;AI-powered decision layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And yes… I used &lt;strong&gt;TypeScript&lt;/strong&gt; 😅&lt;br&gt;
(I’m a Java fan, but LangChain is much more mature with TS right now.)&lt;/p&gt;


&lt;h2&gt;
  
  
  How the AI flow works
&lt;/h2&gt;

&lt;p&gt;The architecture is simple and intentional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PromptTemplate → ChatOpenAI → StructuredOutputParser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this means in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The prompt defines the role, business rules, and output format&lt;/li&gt;
&lt;li&gt;OpenAI generates the response&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StructuredOutputParser&lt;/code&gt; forces the output to match a strict Zod schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No random text.&lt;br&gt;
No broken JSON.&lt;br&gt;
No guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the model actually sees
&lt;/h2&gt;

&lt;p&gt;The AI receives &lt;strong&gt;real context&lt;/strong&gt;, not just a generic prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user profile (goal, level, duration, etc.)&lt;/li&gt;
&lt;li&gt;an explicit catalog of allowed exercises&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;strict rules like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;valid exercise IDs&lt;/li&gt;
&lt;li&gt;required YouTube links&lt;/li&gt;
&lt;li&gt;ISO date format&lt;/li&gt;
&lt;li&gt;difficulty and category mapping&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The model doesn’t invent workouts.&lt;br&gt;
It chooses from a &lt;strong&gt;controlled domain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was a key decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this was cheaper than another backend
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building complex domain logic&lt;/li&gt;
&lt;li&gt;maintaining rule trees&lt;/li&gt;
&lt;li&gt;evolving workout selection algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I delegated the &lt;em&gt;decision-making&lt;/em&gt; to AI.&lt;/p&gt;

&lt;p&gt;And here’s the interesting part:&lt;/p&gt;

&lt;p&gt;As more workouts are generated, I reuse previous context to reduce unnecessary calls to OpenAI.&lt;/p&gt;

&lt;p&gt;So the system improves over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more workouts → better context&lt;/li&gt;
&lt;li&gt;better context → fewer calls&lt;/li&gt;
&lt;li&gt;fewer calls → lower cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, this solution was &lt;strong&gt;much cheaper&lt;/strong&gt; than building and maintaining a full recommendation backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned about prompt structure (the hard way)
&lt;/h2&gt;

&lt;p&gt;This only worked because the prompt was treated like &lt;strong&gt;code&lt;/strong&gt;, not text.&lt;/p&gt;

&lt;h3&gt;
  
  
  What worked well
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low ambiguity output&lt;/strong&gt;&lt;br&gt;
StructuredOutputParser + format instructions keep responses clean.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain control&lt;/strong&gt;&lt;br&gt;
Allowed exercise catalogs prevent hallucinated IDs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functional safety&lt;/strong&gt;&lt;br&gt;
Constraints and realistic rules are explicit in natural language.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Higher determinism&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;temperature: 0&lt;/code&gt; makes responses more predictable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t “ask AI and hope”.&lt;br&gt;
It’s “ask AI with constraints”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problems I found along the way
&lt;/h2&gt;

&lt;p&gt;Not everything was perfect.&lt;/p&gt;

&lt;p&gt;Some issues I identified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;some fields were requested in the prompt but overwritten in the backend&lt;/li&gt;
&lt;li&gt;difficulty and category were guided, but not strictly validated as enums&lt;/li&gt;
&lt;li&gt;the prompt was too large and mixed responsibilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI works best with structure — and so does code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Improvements that made a big difference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;split system and user messages using &lt;code&gt;ChatPromptTemplate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;validate business rules in code, not only in prompts&lt;/li&gt;
&lt;li&gt;remove redundant fields from the prompt&lt;/li&gt;
&lt;li&gt;strengthen exercise ID validation&lt;/li&gt;
&lt;li&gt;version the prompt (&lt;code&gt;PROMPT_VERSION=v1&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI doesn’t replace architecture.&lt;br&gt;
It becomes part of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;This article isn’t about saying &lt;em&gt;“AI is magic”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It’s about realizing something important:&lt;/p&gt;

&lt;p&gt;Sometimes you don’t need to build a massive system to solve a complex problem.&lt;/p&gt;

&lt;p&gt;Sometimes it’s better to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delegate the decision layer&lt;/li&gt;
&lt;li&gt;control the input&lt;/li&gt;
&lt;li&gt;validate the output&lt;/li&gt;
&lt;li&gt;optimize for cost and simplicity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is powerful, but only when &lt;strong&gt;you define the boundaries&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You design the contract.&lt;br&gt;
You validate the result.&lt;br&gt;
AI generates the answer.&lt;/p&gt;

&lt;p&gt;And that’s the difference between building a product and just writing prompts.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>backend</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>let's talk about the most silent hero of all our apps</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Mon, 16 Feb 2026 16:55:11 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/lets-talk-about-the-most-silent-hero-of-all-our-apps-dlf</link>
      <guid>https://dev.to/jairo-dev-jr/lets-talk-about-the-most-silent-hero-of-all-our-apps-dlf</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-story__hidden-navigation-link"&gt;Cache-Control: the silent hero in communication between applications&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3254949" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" id="article-link-3254949"&gt;
          Cache-Control: the silent hero in communication between applications
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cache"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cache&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/http"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;http&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microservices"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microservices&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>cache</category>
      <category>http</category>
      <category>api</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Hello, it's time to know a little about the one of the most powerful cache strategies the super hyper duper, power, blast, beautiful, sorry I'm lost.
LADIES AND GENTLEMEN, THE CACHE CONTROL!!!! 
#caching #programming #coding</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Fri, 13 Feb 2026 23:10:54 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/hello-its-time-to-know-a-little-about-the-one-of-the-most-powerful-cache-strategies-the-super-1nhg</link>
      <guid>https://dev.to/jairo-dev-jr/hello-its-time-to-know-a-little-about-the-one-of-the-most-powerful-cache-strategies-the-super-1nhg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-story__hidden-navigation-link"&gt;Cache-Control: the silent hero in communication between applications&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3254949" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" id="article-link-3254949"&gt;
          Cache-Control: the silent hero in communication between applications
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cache"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cache&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/http"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;http&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microservices"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microservices&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>cache</category>
      <category>http</category>
      <category>api</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Cache-Control: the silent hero in communication between applications</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Fri, 13 Feb 2026 23:09:03 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf</link>
      <guid>https://dev.to/jairo-dev-jr/cache-control-the-silent-hero-in-communication-between-services-7lf</guid>
      <description>&lt;p&gt;When people talk about performance, scalability, or even costs, they usually jump straight to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bigger machines&lt;/li&gt;
&lt;li&gt;more replicas&lt;/li&gt;
&lt;li&gt;faster databases&lt;/li&gt;
&lt;li&gt;more complex architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But there’s one HTTP detail that is almost always underestimated and, at the same time, insanely powerful:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;code&gt;Cache-Control&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you work with communication between different apps (frontend ↔ backend, backend ↔ backend, BFFs, APIs, gateways, etc.), understanding cache-control can save you &lt;strong&gt;latency, money, and a lot of pain&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem we usually ignore
&lt;/h2&gt;

&lt;p&gt;In many systems, requests look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App A calls App B&lt;/li&gt;
&lt;li&gt;App B calls App C&lt;/li&gt;
&lt;li&gt;App C hits a database or an external API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this happens &lt;strong&gt;all the time&lt;/strong&gt;, even when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the data barely changes&lt;/li&gt;
&lt;li&gt;the response is identical for minutes (or hours)&lt;/li&gt;
&lt;li&gt;thousands of users are requesting the same thing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we end up doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated network calls&lt;/li&gt;
&lt;li&gt;repeated serialization/deserialization&lt;/li&gt;
&lt;li&gt;repeated DB reads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All for the same response.&lt;/p&gt;

&lt;p&gt;That’s not just inefficient — it’s unnecessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where &lt;code&gt;Cache-Control&lt;/code&gt; fits in
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Cache-Control&lt;/code&gt; is an HTTP header that tells the consumer &lt;strong&gt;how long a response can be reused&lt;/strong&gt; and &lt;strong&gt;under which conditions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And the beauty of it is:&lt;/p&gt;

&lt;p&gt;✅ it’s standardized&lt;br&gt;
✅ it works across different apps and languages&lt;br&gt;
✅ it doesn’t require shared memory or tight coupling&lt;/p&gt;

&lt;p&gt;You’re basically saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey, this response is safe to reuse for X seconds.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And suddenly, a lot of things get faster without changing your core logic.&lt;/p&gt;


&lt;h2&gt;
  
  
  A simple example
&lt;/h2&gt;

&lt;p&gt;Imagine an API that returns configuration data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /configs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response rarely changes.&lt;/p&gt;

&lt;p&gt;Instead of forcing every client to hit the API every time, you return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: public, max-age=300
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browsers can cache it&lt;/li&gt;
&lt;li&gt;gateways can cache it&lt;/li&gt;
&lt;li&gt;reverse proxies can cache it&lt;/li&gt;
&lt;li&gt;other backend services can cache it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;strong&gt;5 minutes&lt;/strong&gt;, everyone can reuse the same response.&lt;/p&gt;

&lt;p&gt;No extra code.&lt;br&gt;
No extra infra.&lt;br&gt;
Just a header.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cache between backend services? Yes, please.
&lt;/h2&gt;

&lt;p&gt;A common myth is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cache-Control is just for browsers.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not true.&lt;/p&gt;

&lt;p&gt;When you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;microservices&lt;/li&gt;
&lt;li&gt;BFFs&lt;/li&gt;
&lt;li&gt;API gateways&lt;/li&gt;
&lt;li&gt;edge services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Cache-Control&lt;/code&gt; becomes a &lt;strong&gt;contract&lt;/strong&gt; between services.&lt;/p&gt;

&lt;p&gt;App B doesn’t need to guess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if it can cache&lt;/li&gt;
&lt;li&gt;for how long&lt;/li&gt;
&lt;li&gt;or if it should revalidate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The producer tells the truth, and the consumer follows it.&lt;/p&gt;

&lt;p&gt;That’s clean communication.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance is not the only win
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Lower latency
&lt;/h3&gt;

&lt;p&gt;Cached responses are usually served in &lt;strong&gt;microseconds&lt;/strong&gt;, not milliseconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Lower cost
&lt;/h3&gt;

&lt;p&gt;Fewer requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less CPU&lt;/li&gt;
&lt;li&gt;fewer DB hits&lt;/li&gt;
&lt;li&gt;fewer external API calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That shows up directly on the bill.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Better resilience
&lt;/h3&gt;

&lt;p&gt;When downstream services are slow or unstable, cached responses can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;absorb traffic spikes&lt;/li&gt;
&lt;li&gt;reduce pressure during incidents&lt;/li&gt;
&lt;li&gt;keep the system usable even under partial failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes cache is the difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“the system is degraded”&lt;br&gt;
and&lt;br&gt;
“everything is on fire 🔥”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Cache-Control is also about correctness
&lt;/h2&gt;

&lt;p&gt;Cache is not only about speed.&lt;/p&gt;

&lt;p&gt;Headers like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;no-cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no-store&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;must-revalidate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;allow you to be &lt;strong&gt;explicit&lt;/strong&gt; about what should &lt;em&gt;not&lt;/em&gt; be cached.&lt;/p&gt;

&lt;p&gt;That avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stale sensitive data&lt;/li&gt;
&lt;li&gt;user-specific leaks&lt;/li&gt;
&lt;li&gt;weird bugs caused by over-caching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good cache-control is about &lt;strong&gt;control&lt;/strong&gt;, not just caching everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  A practical rule of thumb
&lt;/h2&gt;

&lt;p&gt;If an endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;returns the same response for many users&lt;/li&gt;
&lt;li&gt;doesn’t change on every request&lt;/li&gt;
&lt;li&gt;is expensive to compute&lt;/li&gt;
&lt;li&gt;is called frequently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 it probably deserves a &lt;code&gt;Cache-Control&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;Even a small &lt;code&gt;max-age=30&lt;/code&gt; can make a noticeable difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters more in distributed systems
&lt;/h2&gt;

&lt;p&gt;As systems grow, communication cost becomes real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;network hops&lt;/li&gt;
&lt;li&gt;retries&lt;/li&gt;
&lt;li&gt;timeouts&lt;/li&gt;
&lt;li&gt;cascading failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cache-Control helps you &lt;strong&gt;reduce unnecessary conversations&lt;/strong&gt; between services.&lt;/p&gt;

&lt;p&gt;And in distributed systems, fewer conversations usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer problems&lt;/li&gt;
&lt;li&gt;simpler reasoning&lt;/li&gt;
&lt;li&gt;better sleep at night 😄&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Cache-Control is not fancy.&lt;br&gt;
It won’t show up in architecture diagrams.&lt;br&gt;
It won’t impress in a meetup slide.&lt;/p&gt;

&lt;p&gt;But it works.&lt;/p&gt;

&lt;p&gt;And when you start using it intentionally, you realize something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes the biggest performance gains come from saying&lt;br&gt;
“you don’t need to call me again… not yet.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’re building APIs and not thinking about Cache-Control, you’re leaving performance and reliability on the table.&lt;/p&gt;

&lt;p&gt;And that’s an easy win you don’t want to miss. 🚀&lt;/p&gt;

</description>
      <category>cache</category>
      <category>http</category>
      <category>api</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Hello Guys let's talk about how AI can increase your knowledge and not just making things for you ?</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Wed, 11 Feb 2026 22:44:47 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/hello-guys-lets-talk-about-how-ai-can-increase-your-knowledge-and-not-just-making-things-for-you--e5g</link>
      <guid>https://dev.to/jairo-dev-jr/hello-guys-lets-talk-about-how-ai-can-increase-your-knowledge-and-not-just-making-things-for-you--e5g</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91" class="crayons-story__hidden-navigation-link"&gt;Ai Helped Me to Configure a Load Balancer in Google&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3244711" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91" id="article-link-3244711"&gt;
          Ai Helped Me to Configure a Load Balancer in Google
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/googlecloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;googlecloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>googlecloud</category>
      <category>ai</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ai Helped Me to Configure a Load Balancer in Google</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Wed, 11 Feb 2026 22:43:02 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91</link>
      <guid>https://dev.to/jairo-dev-jr/ai-helped-me-to-configure-a-load-balancer-in-google-4l91</guid>
      <description>&lt;p&gt;Hi!&lt;/p&gt;

&lt;p&gt;I’m Jairo, a Software Engineer at Mercado Libre.&lt;/p&gt;

&lt;p&gt;Like every backend dev at some point, I started asking myself: &lt;strong&gt;“Ok… how do I actually host an app?”&lt;/strong&gt;&lt;br&gt;
Not because I wanted to become a DevOps wizard overnight (and yes, I know DevOps is &lt;em&gt;way more&lt;/em&gt; than deploying stuff — please, DevOps friends, don’t cancel me 😅).&lt;br&gt;
I just wanted to learn a bit, understand the moving parts, and stop treating infra like magic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem that blocked me
&lt;/h2&gt;

&lt;p&gt;I was trying to do something that sounds simple:&lt;/p&gt;

&lt;p&gt;I have a domain, and I want a route like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/api&lt;/code&gt; → Cloud Run app #1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/worker&lt;/code&gt; → Cloud Run app #2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a lot of people this is easy. You’ll say:&lt;br&gt;
“Bro, that’s just a Load Balancer.”&lt;/p&gt;

&lt;p&gt;And I agreed… for about 3 seconds.&lt;/p&gt;

&lt;p&gt;Then my brain went:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“OK COOL… &lt;strong&gt;HOW DO I DO THAT?&lt;/strong&gt;”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that question stayed stuck in my head while I clicked around GCP like a lost tourist.&lt;/p&gt;

&lt;p&gt;I opened the GCloud dashboard, started pressing buttons, scanning menus, searching for something that looked like “routes”, “paths”, “domains”, “magic”… anything.&lt;/p&gt;

&lt;p&gt;And then I saw it.&lt;/p&gt;

&lt;p&gt;The most beautiful AI logo of my life.&lt;/p&gt;

&lt;p&gt;Not even joking: that little icon saved my night.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI didn’t just solve it — it gave me a shortcut (and that’s dangerous)
&lt;/h2&gt;

&lt;p&gt;I explained what I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one domain&lt;/li&gt;
&lt;li&gt;two routes&lt;/li&gt;
&lt;li&gt;two different Cloud Run services&lt;/li&gt;
&lt;li&gt;path-based routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And in &lt;strong&gt;two minutes&lt;/strong&gt;, the AI gave me Terraform code that would set everything up automatically.&lt;/p&gt;

&lt;p&gt;That’s the moment where you can easily become a &lt;strong&gt;copy/paste developer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And I’m not saying copy/paste is always bad — I do it too… &lt;em&gt;but only when I understand what’s happening.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because if you don’t understand the infra you’re deploying, you’re basically running random commands in production with a smile 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  The real problem with “AI helping you code”
&lt;/h2&gt;

&lt;p&gt;These days everyone talks about “how to use AI to code faster”.&lt;/p&gt;

&lt;p&gt;But I think most of us are asking the wrong question.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How can AI do this for me?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“How can AI teach me how to do this?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because if AI makes a mistake (and it does), and you don’t know what the AI is doing… you’re not becoming a better engineer.&lt;/p&gt;

&lt;p&gt;You’re becoming a &lt;strong&gt;professional prompter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that’s a very fragile career path.&lt;/p&gt;




&lt;h2&gt;
  
  
  The move that changed everything
&lt;/h2&gt;

&lt;p&gt;So after reading the Terraform code, I told the AI something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I don’t want you to do it for me.&lt;br&gt;
Teach me how to do it inside Google’s platform.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And boom.&lt;/p&gt;

&lt;p&gt;It gave me a step-by-step explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what to configure first&lt;/li&gt;
&lt;li&gt;why each part exists&lt;/li&gt;
&lt;li&gt;where to click&lt;/li&gt;
&lt;li&gt;what each resource is doing&lt;/li&gt;
&lt;li&gt;how routing actually works behind the scenes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That night I didn’t just “deploy something”.&lt;/p&gt;

&lt;p&gt;I learned something.&lt;/p&gt;

&lt;p&gt;And that’s the difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final message
&lt;/h2&gt;

&lt;p&gt;AI is amazing. It can save you hours. It can unlock you when you’re blocked.&lt;/p&gt;

&lt;p&gt;But you need to remember:&lt;/p&gt;

&lt;p&gt;✅ You should control the AI.&lt;br&gt;
Not let the AI control you.&lt;/p&gt;

&lt;p&gt;Use it to build faster, yes…&lt;br&gt;
but also use it to &lt;strong&gt;learn&lt;/strong&gt;, otherwise you’ll always depend on it.&lt;/p&gt;

&lt;p&gt;Tell AI what you want — and make it explain the “why”.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>ai</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Let's learn something about reactive programming and a way to make your application flux more SECURE ?
READ BELOW AND KNOW HOW DO IT</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Tue, 10 Feb 2026 00:54:22 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/lets-learn-something-about-reactive-programming-and-a-way-to-make-your-application-flux-more-57hj</link>
      <guid>https://dev.to/jairo-dev-jr/lets-learn-something-about-reactive-programming-and-a-way-to-make-your-application-flux-more-57hj</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/defer-vs-immediate-reactive-flow-creation-and-why-your-circuit-breaker-can-decide-too-early-3bll" class="crayons-story__hidden-navigation-link"&gt;Is DEFER defending your reactive app flux ?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3232540" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/defer-vs-immediate-reactive-flow-creation-and-why-your-circuit-breaker-can-decide-too-early-3bll" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/defer-vs-immediate-reactive-flow-creation-and-why-your-circuit-breaker-can-decide-too-early-3bll" id="article-link-3232540"&gt;
          Is DEFER defending your reactive app flux ?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reactiveprogramming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reactiveprogramming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spring"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spring&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/circuitbreaker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;circuitbreaker&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/defer-vs-immediate-reactive-flow-creation-and-why-your-circuit-breaker-can-decide-too-early-3bll" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/defer-vs-immediate-reactive-flow-creation-and-why-your-circuit-breaker-can-decide-too-early-3bll#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>programming</category>
      <category>reactiveprogramming</category>
      <category>spring</category>
      <category>circuitbreaker</category>
    </item>
    <item>
      <title>which is the best ai tool for devs.
THAT'S MY OPINION BELOW</title>
      <dc:creator>Jairo Junior</dc:creator>
      <pubDate>Tue, 10 Feb 2026 00:53:06 +0000</pubDate>
      <link>https://dev.to/jairo-dev-jr/which-is-the-best-ai-tool-for-devsthats-my-opinion-below-3dhl</link>
      <guid>https://dev.to/jairo-dev-jr/which-is-the-best-ai-tool-for-devsthats-my-opinion-below-3dhl</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jairo-dev-jr/a-dev-coding-setup-in-2026-2apm" class="crayons-story__hidden-navigation-link"&gt;A dev coding setup in 2026&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jairo-dev-jr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" alt="jairo-dev-jr profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jairo-dev-jr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jairo Junior
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jairo Junior
                
              
              &lt;div id="story-author-preview-content-3244694" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jairo-dev-jr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1522014%2Fd0a0ab97-4819-442c-a1d3-a5a4bd9ab052.jpeg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jairo Junior&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jairo-dev-jr/a-dev-coding-setup-in-2026-2apm" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 10&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jairo-dev-jr/a-dev-coding-setup-in-2026-2apm" id="article-link-3244694"&gt;
          A dev coding setup in 2026
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/jairo-dev-jr/a-dev-coding-setup-in-2026-2apm#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              2&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
