[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-en-1-1-all-golang-the-series-ep-126-ddos-protection-rate-limiting-all--*":3,"academy-blog-translations-q6yad7oebg2pjg0":79},{"data":4,"page":67,"perPage":67,"totalItems":67,"totalPages":67},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":73,"keywords":74,"locale":49,"published_at":75,"scheduled_at":13,"school_blog":71,"short_description":76,"slug":77,"status":69,"title":6,"updated":78,"updated_by":13,"views":72},"Golang The Series EP 126: Implementing DDoS Protection and Rate Limiting for High Availability","sclblg987654321","school_blog_translations","\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Welcome back, fellow Gophers, to the most intensive series on Go development!\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">In&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>EP 125\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">, we laid the foundation of secure communication using TLS and WSS. It was like building a \"Great Wall\" around your city—strong, sturdy, and excellent at keeping secrets.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">However... even the strongest wall can crumble if millions of people try to rush through the city gates simultaneously. This is what we call a&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>DDoS (Distributed Denial of Service)\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> attack. In the world of Backend development, it doesn't matter how optimized your code is; if you lack a proper traffic management system, your service will go down the moment a botnet starts flooding it with requests.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Today, we are going to build a \"Smart Immigration Gate\" by implementing&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Rate Limiting\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> and&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>DDoS Protection\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> at the Application Layer (Layer 7) using Go.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:0pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>1. Why Does Your System Need Rate Limiting? (The Why)\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">If you allow every request to access your resources (Database, CPU, Memory) freely, you are exposed to three major risks:\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cul style=\"margin-bottom:0;margin-top:0;padding-inline-start:48px;\">\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Resource Exhaustion:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> A single malicious user (or a buggy client) could write a loop that fires requests until your Database connections are maxed out.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Cost Management:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> If you use serverless or cloud services (like AWS Lambda or APIs billed per request), a bot attack can literally drain your bank account overnight.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Security Risks:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> Allowing unlimited login attempts is a massive vulnerability for Brute-force attacks.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:1.38;margin-bottom:0pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>2. Deep Dive into Rate Limiting Algorithms: Which One to Choose?\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Before we jump into the code, we need to understand the logic behind \"throttling.\" There are several popular methods in the Go ecosystem:\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cul style=\"margin-bottom:0;margin-top:0;padding-inline-start:48px;\">\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Token Bucket (Most Popular in Go):\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> Imagine a bucket filled with tokens (coins) that are added at a constant rate. Every time a request comes in, it must take one token. If the bucket is empty, the request must wait or be rejected. This is great because it allows for&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>\"Bursts\"\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> (temporary spikes in usage).\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Leaky Bucket:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> Imagine a bucket with a hole at the bottom. Water (requests) enters at any speed but leaks out at a constant rate. If the bucket overflows, the extra water is discarded. This is ideal for systems that require a very smooth, constant traffic flow.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Fixed Window Counter:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> This counts requests within a specific timeframe (e.g., 100 requests per minute). However, it suffers from the \"Edge Case\" problem where a user could send 100 requests at 11:59:59 and another 100 at 12:00:01, effectively doubling the limit in a two-second window.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:1.38;margin-bottom:0pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>3. Implementation: Using&nbsp;\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>golang.org\u002Fx\u002Ftime\u002Frate\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">The Go team provides a powerful implementation of the&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Token Bucket\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> algorithm in the&nbsp;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">rate\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> package (part of the sub-repositories).\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch3 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>The Core:&nbsp;\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>NewLimiter(r, b)\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cul style=\"margin-bottom:0;margin-top:0;padding-inline-start:48px;\">\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>r (Limit):\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> The rate at which tokens are added to the bucket (tokens per second).\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:disc;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>b (Burst):\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> The maximum number of tokens the bucket can hold (the maximum capacity for simultaneous requests).\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Advanced Code Example: IP-Based Middleware\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Instead of hardcoding limits inside our handlers, we will create a&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Middleware\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> to make our protection reusable across any endpoint.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">Go\npackage main\n\nimport (\n\t\"net\u002Fhttp\"\n\t\"sync\"\n\t\"time\"\n\n\t\"golang.org\u002Fx\u002Ftime\u002Frate\"\n)\n\n\u002F\u002F IPlimiter stores the Limiter state for each unique IP\ntype IPlimiter&nbsp;struct {\n\tips&nbsp;map[string]*rate.Limiter\n\tmu&nbsp; sync.RWMutex\n}\n\nfunc&nbsp;NewIPlimiter() *IPlimiter {\n\treturn &amp;IPlimiter{\n\t\tips:&nbsp;make(map[string]*rate.Limiter),\n\t}\n}\n\n\u002F\u002F GetLimiter finds or creates a new Limiter for a specific IP\nfunc (i *IPlimiter)&nbsp;GetLimiter(ip&nbsp;string) *rate.Limiter {\n\ti.mu.Lock()\n\tdefer i.mu.Unlock()\n\n\tlimiter, exists := i.ips[ip]\n\tif !exists {\n\t\t\u002F\u002F Allow 2 requests per second with a Burst capacity of 5\n\t\tlimiter = rate.NewLimiter(rate.Every(500*time.Millisecond),&nbsp;5)\n\t\ti.ips[ip] = limiter\n\t}\n\n\treturn limiter\n}\n\nfunc&nbsp;limitMiddleware(next http.Handler, iplimiter *IPlimiter)&nbsp;http.Handler {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\u002F\u002F Get the user's IP (Note: check X-Forwarded-For if behind a Proxy\u002FLoad Balancer)\n\t\tip := r.RemoteAddr\n\n\t\tlimiter := iplimiter.GetLimiter(ip)\n\t\tif !limiter.Allow() {\n\t\t\tw.Header().Set(\"X-RateLimit-Limit\",&nbsp;\"2\")\n\t\t\tw.Header().Set(\"X-RateLimit-Remaining\",&nbsp;\"0\")\n\t\t\thttp.Error(w,&nbsp;\"Too Many Requests: Please slow down, our servers are breathing.\", http.StatusTooManyRequests)\n\t\t\treturn\n\t\t}\n\n\t\tnext.ServeHTTP(w, r)\n\t})\n}\n\nfunc&nbsp;main() {\n\tiplimiter := NewIPlimiter()\n\tmux := http.NewServeMux()\n\n\thandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tw.Write([]byte(\"Welcome to Superdev Academy API!\"))\n\t})\n\n\t\u002F\u002F Wrap the handler with our Middleware\n\thttp.ListenAndServe(\":8080\", limitMiddleware(handler, iplimiter))\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Why do we need sync.RWMutex? In Go, the http.Server handles requests using Goroutines. If multiple requests from different IPs arrive simultaneously and we try to write to the map at the same time without a lock, we will trigger a Race Condition and the program will panic.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:0pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>4. Elevating DDoS Protection at the Application Level (L7)\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Rate limiting by count alone might not be enough to stop sophisticated DDoS attacks designed to exhaust resources. We should add these strategies:\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch3 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>A. Strict Server Timeouts\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Some DDoS attacks, like&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Slowloris\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">, try to keep connections open as long as possible until the server can't accept new clients. We must configure&nbsp;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">http.Server\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> strictly:\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">Go\nserver := &amp;http.Server{\n&nbsp;&nbsp;&nbsp;&nbsp;Addr: &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;\":8080\",\n&nbsp;&nbsp;&nbsp;&nbsp;ReadTimeout:&nbsp;&nbsp;2 * time.Second,&nbsp;&nbsp;\u002F\u002F Headers must be read within 2 seconds\n&nbsp;&nbsp;&nbsp;&nbsp;WriteTimeout:&nbsp;5 * time.Second,&nbsp;&nbsp;\u002F\u002F Response must be sent within 5 seconds\n&nbsp;&nbsp;&nbsp;&nbsp;IdleTimeout:&nbsp;&nbsp;30 * time.Second,&nbsp;\u002F\u002F Close inactive connections\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>B. Distributed Rate Limiting (The Redis Approach)\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">The code above has one weakness: it stores state in memory. If you run 3 server instances (Scaling), each will count requests independently. A user could theoretically send 3x more requests than intended.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">The Solution: Use Redis as a centralized counter. Use libraries like go-redis or the redis-cell module to maintain a global state across all your instances.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:0pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>5. Best Practices &amp; Caveats\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Col style=\"margin-bottom:0;margin-top:0;padding-inline-start:48px;\">\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:decimal;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Don't Block Legitimate Users:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> Setting limits too strictly can break the experience for real users (e.g., a page loading many images at once). Always tune your&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Burst\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> settings.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:decimal;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Graceful Response:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> When blocking a request, always send HTTP Status&nbsp;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">429 Too Many Requests\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> and include a&nbsp;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:#e9eef6;color:#444746;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Retry-After\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> header to tell the client when they can try again.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003Cli style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;font-size:11pt;font-style:normal;font-variant:normal;font-weight:400;list-style-type:decimal;text-decoration:none;vertical-align:baseline;white-space:pre;\" dir=\"ltr\" aria-level=\"1\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Whitelisting:\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> Don't forget to whitelist internal services or trusted partners so they don't get caught in your \"immigration gate.\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2 style=\"line-height:1.38;margin-bottom:6pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Conclusion\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">In&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>EP 126\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">, we've built a defense system that lets our server \"breathe\" during traffic spikes. Understanding the&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Token Bucket\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> algorithm and managing&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>IP-level state\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\"> are the skills that separate \"coders\" from \"system architects.\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">But... blocking traffic is just the beginning. What happens when your internal services (like other Microservices) start slowing down or failing? How do we prevent the whole architecture from collapsing like a house of cards?\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Get ready, because in&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>EP 127\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">, we will dive into&nbsp;\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">\u003Cstrong>Connection Management &amp; Circuit Breakers\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">—the automatic \"kill switches\" that will save your system from a domino effect failure. Stay tuned!\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">&nbsp;\u003C\u002Fp>\u003Cp style=\"line-height:1.38;margin-bottom:12pt;margin-top:0pt;\" dir=\"ltr\">\u003Cspan style=\"background-color:transparent;color:#1f1f1f;font-family:Arial,sans-serif;\">\u003Cspan style=\"font-style:normal;font-variant:normal;font-weight:400;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">Article by: Superdev Academy \"Empowering you to master code through real-world challenges.\" If you found this article helpful, don't forget to share it with your fellow devs and follow us on all platforms!\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cdiv class=\"raw-html-embed\">\u003Cdiv style=\"margin:0 0 6px 0; font-weight:700;\">Read more:\u003C\u002Fdiv>\n\u003Cul style=\"list-style:none; padding:0; margin:0; line-height:1.4;\">\n  \u003Cli style=\"margin:0;\">\u003Ca href=\"\u002Fen\u002Fblogs\u002Fcategories\u002FGolang\" title=\"Golang The Series\">Golang The Series\u003C\u002Fa>\u003C\u002Fli>\n  \u003Cli style=\"margin:0;\">\u003Ca href=\"\u002Fen\u002Fblogs\u002Fcategories\u002FJS2GO\" title=\"JS2GO\">JS2GO\u003C\u002Fa>\u003C\u002Fli>\n  \u003Cli style=\"margin:0;\">\u003Ca href=\"\u002Fen\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\" title=\"Tailwind CSS\">Tailwind CSS\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\u003C\u002Fdiv>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cdiv class=\"raw-html-embed\">\n  \u003Cp style=\"margin:0 0 6px 0;\">\u003Cstrong>Follow Us:\u003C\u002Fstrong>\u003C\u002Fp>\n  \u003Cul style=\"list-style:none; padding:0; margin:0; line-height: 0.4;\">\n    \u003Cli style=\"display:flex; align-items:center; gap:6px; margin:0;\">\n      \n      \u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#1877F2\" aria-hidden=\"true\">\n        \u003Cpath d=\"M22 12.07C22 6.48 17.52 2 11.93 2S2 6.48 2 12.07c0 5 3.66 9.14 8.44 9.93v-7.02H7.9v-2.91h2.54V9.41c0-2.5 1.49-3.88 3.77-3.88 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.87h2.78l-.44 2.91h-2.34V22c4.78-.79 8.44-4.93 8.44-9.93Z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Ca href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\" target=\"_blank\" rel=\"nofollow noopener\" title=\"Follow Superdev Academy on Facebook\">Facebook: Superdev Academy\u003C\u002Fa>\n    \u003C\u002Fli>\n\n    \u003Cli style=\"display:flex; align-items:center; gap:6px; margin:0;\">\n      \n      \u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#FF0000\" aria-hidden=\"true\">\n        \u003Cpath d=\"M23.5 6.2a3 3 0 0 0-2.1-2.1C19.5 3.5 12 3.5 12 3.5s-7.5 0-9.4.6A3 3 0 0 0 .5 6.2 31.5 31.5 0 0 0 0 12a31.5 31.5 0 0 0 .5 5.8 3 3 0 0 0 2.1 2.1c1.9.6 9.4.6 9.4.6s7.5 0 9.4-.6a3 3 0 0 0 2.1-2.1A31.5 31.5 0 0 0 24 12a31.5 31.5 0 0 0-.5-5.8ZM9.75 15.02V8.98L15.5 12l-5.75 3.02Z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\" target=\"_blank\" rel=\"nofollow noopener\" title=\"Watch on YouTube\">YouTube: Superdev Academy\u003C\u002Fa>\n    \u003C\u002Fli>\n\n    \u003Cli style=\"display:flex; align-items:center; gap:6px; margin:0;\">\n      \n      \u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#E4405F\" aria-hidden=\"true\">\n        \u003Cpath d=\"M7 2h10a5 5 0 0 1 5 5v10a5 5 0 0 1-5 5H7a5 5 0 0 1-5-5V7a5 5 0 0 1 5-5Zm10 2H7a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3Zm-5 3.5A5.5 5.5 0 1 1 6.5 13 5.5 5.5 0 0 1 12 7.5Zm0 2A3.5 3.5 0 1 0 15.5 13 3.5 3.5 0 0 0 12 9.5Zm5.75-2.75a1.25 1.25 0 1 1-1.25 1.25 1.25 1.25 0 0 1 1.25-1.25Z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Ca href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F?hl=en target=\" _blank\"=\"\" rel=\"nofollow noopener\" title=\"See behind-the-scenes on Instagram\">Instagram: Superdev Academy\u003C\u002Fa>\n    \u003C\u002Fli>\n\n    \u003Cli style=\"display:flex; align-items:center; gap:6px; margin:0;\">\n      \n      \u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#000000\" aria-hidden=\"true\">\n        \u003Cpath d=\"M21 8.12a6.86 6.86 0 0 1-4.8-2V16a6 6 0 1 1-6-6 5.9 5.9 0 0 1 1.63.23V8.05a9.08 9.08 0 0 1-1.63-.15V4.5a6.86 6.86 0 0 0 4.8 2.05V6.5a6.86 6.86 0 0 0 4.8 1.62ZM9.2 12.5A3.5 3.5 0 1 0 12.7 16V9.94a6 6 0 0 1-1.63-.27v3.95a3.5 3.5 0 0 1-1.87 3.17 3.5 3.5 0 0 1-4.78-3.23 3.5 3.5 0 0 1 4.78-3.06Z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Ca href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy\" target=\"_blank\" rel=\"nofollow noopener\" title=\"Watch short tips on TikTok\">TikTok: @superdevacademy\u003C\u002Fa>\n    \u003C\u002Fli>\n\n    \u003Cli style=\"display:flex; align-items:center; gap:6px; margin:0;\">\n      \n      \u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#111827\" aria-hidden=\"true\">\n        \u003Cpath d=\"M12 2a10 10 0 1 0 10 10A10.01 10.01 0 0 0 12 2Zm6.93 6h-3.26a15.6 15.6 0 0 0-1.39-3.62A8.03 8.03 0 0 1 18.93 8ZM12 4c.73.93 1.7 2.74 2.2 4H9.8C10.3 6.74 11.27 4.93 12 4ZM8.72 4.38A15.6 15.6 0 0 0 7.32 8H4.07a8.03 8.03 0 0 1 4.65-3.62ZM4.07 16h3.25a15.6 15.6 0 0 0 1.4 3.62A8.03 8.03 0 0 1 4.07 16ZM12 20c-.73-.93-1.7-2.74-2.2-4h4.4C13.7 17.26 12.73 19.07 12 20Zm3.28-.38A15.6 15.6 0 0 0 16.68 16h3.25a8.03 8.03 0 0 1-4.65 3.62ZM20 14h-3.54a13.8 13.8 0 0 1-.26-4H20a7.98 7.98 0 0 1 0 4Zm-12.2 0H4a7.98 7.98 0 0 1 0-4h3.54a13.8 13.8 0 0 1-.26 4Zm2 .5h4.4a17.8 17.8 0 0 1-.72-4.5c0-1.58.25-3.1.72-4.5H9.8a17.8 17.8 0 0 1 .72 4.5c0 1.58-.25 3.1-.72 4.5Z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Ca href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\" target=\"_blank\" rel=\"noopener\" title=\"Visit the official website of Superdev Academy\">Official Website: Superdev Academy.com\u003C\u002Fa>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Fdiv>","cover_image_for_golang_the_series_ep_hsbdtof5sd.ighAvailability.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Ffu83funt0rtxukh\u002Fcover_image_for_golang_the_series_ep_hsbdtof5sd.ighAvailability.webp","2026-03-04 08:44:38.917Z","",{"keywords":15,"locale":43,"school_blog":53},[16,23,28,33,38],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:44:38.026Z","m3dqo2zalnfaoof","Token Bucket","2026-04-10 16:12:47.845Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:44:38.426Z","cwmp6ppr4svplqr","DDoS Protection","2026-04-10 16:12:47.992Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:34:07.915Z","921nl48h9in67sw","Rate Limiting","2026-04-10 16:08:07.808Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"code":44,"collectionId":45,"collectionName":46,"created":47,"flag":48,"id":49,"is_default":50,"label":51,"updated":52},"en","pbc_1989393366","locales","2026-01-22 11:00:02.726Z","twemoji:flag-united-states","qv9c1llfov2d88z",false,"English","2026-04-10 15:42:46.825Z",{"category":54,"collectionId":55,"collectionName":56,"expand":57,"id":71,"views":72},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":58},{"blogIds":59,"collectionId":60,"collectionName":61,"created":62,"created_by":13,"id":54,"image":63,"image_alt":13,"image_path":64,"label":65,"name":66,"priority":67,"publish_at":68,"scheduled_at":13,"status":69,"updated":70,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":66,"th":66},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","q6yad7oebg2pjg0",206,"fu83funt0rtxukh",[20,25,30,35,40],"2026-01-19 03:55:06.978Z","Deep dive into protecting your Go applications from traffic spikes and DDoS attacks. Learn how to implement Rate Limiting using the Token Bucket algorithm, build IP-based middleware.","golang-the-series-ep-126-ddos-protection-rate-limiting","2026-04-25 02:47:44.064Z",{"en":77}]