Episode ini membahas middleware yang melindungi backend dari lonjakan trafik: RateLimit dengan average, burst, dan source criterion, InFlightReq untuk membatasi request konkuren, CircuitBreaker berbasis ekspresi seperti error ratio dan status code, serta Retry untuk percobaan ulang otomatis.

Saat aplikasi kalian mulai ramai, masalah bukan lagi "bagaimana merutekan trafik" tapi "bagaimana bertahan dari lonjakan". Episode 12 membahas empat middleware yang menjaga kestabilan di bawah tekanan: RateLimit, InFlightReq, CircuitBreaker, dan Retry.
Empat middleware ini adalah fondasi resilience. RateLimit mencegah satu klien membanjiri backend, InFlightReq membatasi request yang sedang berjalan, CircuitBreaker memutus aliran ketika backend mulai gagal beruntun, dan Retry menutupi kegagalan sementara secara transparan. Mari kita pelajari kapan memakai yang mana.
RateLimit membatasi jumlah request berdasarkan sumber. Dua angka yang wajib dipahami: average (rata-rata request per detik) dan burst (lonjakan yang diizinkan sebelum penegakan). Konfigurasi middleware rateLimit dalam YAML:
http:
middlewares:
api-ratelimit:
rateLimit:
average: 20
burst: 40
period: "1s"
sourceCriterion:
ipStrategy:
depth: 1average: 20 berarti rata-rata 20 request per detik per sumber.burst: 40 mengizinkan ledakan 40 request dalam waktu singkat sebelum diblokir.period: jendela waktu perhitungan (default 1 detik).sourceCriterion.ipStrategy: menentukan apa yang dianggap "sumber". Default-nya IP klien; depth: 1 berguna jika Traefik di belakang proxy lain.RateLimit menolak request yang melampaui batas dengan status 429 Too Many Requests. Ini adalah pertahanan utama terhadap penyalahgunaan endpoint publik.
InFlightReq membatasi jumlah request yang sedang diproses secara bersamaan. Berbeda dengan RateLimit yang berbasis waktu, InFlightReq mencegah overload simultan:
http:
middlewares:
limit-concurrent:
inFlightReq:
amount: 100
sourceCriterion:
requestHeaderName: "X-API-Key"amount: 100: hanya 100 request boleh diproses secara paralel dari sumber yang sama.sourceCriterion.requestHeaderName: memakai header tertentu sebagai identitas sumber — berguna untuk API dengan API key.Ketika jumlah request konkuren melebihi amount, request ditolak dengan 429. Gunakan InFlightReq untuk melindungi resource yang mahal, seperti worker queue atau koneksi database yang terbatas.
CircuitBreaker mengikuti pola circuit breaker klasik: jika backend mulai gagal melewati ambang tertentu, aliran trafik dihentikan agar backend bisa pulih:
http:
middlewares:
api-breaker:
circuitBreaker:
expression: "NetworkErrorRatio() > 0.5 || ResponseCodeRatio(500, 600, 0, 600) > 0.3"Ekspresi dibangun dari fungsi-fungsi berikut:
NetworkErrorRatio(): rasio error jaringan terhadap total request.ResponseCodeRatio(code1, code2, min, max): rasio response dalam rentang status code tertentu.LatencyAtQuantileMS(50): latensi pada quantile tertentu.Ketika ekspresi bernilai true, circuit terbuka: Traefik mengembalikan 503 untuk semua request selama checkPeriod. Setelah jendela waktu berlalu, circuit memasuki mode half-open dan menguji kembali. Ekspresi di atas terbuka jika lebih dari setengah request gagal jaringan atau lebih dari 30 persen response berstatus 5xx — dua sinyal paling jelas backend sedang sekarat.
Retry mencoba ulang request ketika server backend pertama gagal merespons:
http:
middlewares:
retry-lb:
retry:
attempts: 3
initialInterval: "500ms"attempts: 3: total percobaan termasuk request pertama.initialInterval: 500ms: jeda awal sebelum percobaan berikutnya, bertambah eksponensial tiap kali.Retry menutupi kegagalan sementara — restart container, koneksi terputus sekejap — sehingga pengguna tidak merasakan apa-apa. Namun berhati-hatilah dengan request non-idempotent seperti POST: mencoba ulang bisa menggandakan efek samping. Jangan pasang Retry otomatis pada endpoint pembayaran tanpa idempotency key.
Warning
Kombinasi Retry dengan circuit breaker bisa membuat request mengantre lebih lama dari harapan. Saat circuit terbuka, Traefik langsung menolak request tanpa mencoba backend — pasang Retry di depan service yang lebih resilient, bukan di depan circuit yang sedang terbuka.
Inti yang harus dibawa pulang:
NetworkErrorRatio dan ResponseCodeRatio.Di episode 13 selanjutnya kita akan membahas compression & buffering — middleware Compress untuk gzip dan brotli, Buffering untuk membatasi ukuran request dan response, serta ContentType untuk auto-deteksi content type. Middleware ini menyentuh kinerja dan efisiensi bandwidth di sisi wire.