Episode ini membahas pengendalian traffic: rate limit filter dan external rate limit service, konfigurasi retry dan timeout, fault injection untuk pengujian, serta circuit breaking dan resource limits.

Traffic yang tidak dikendalikan adalah bom waktu. Episode 10 membahas rate limiting dan traffic control: bagaimana Envoy membatasi jumlah request, mengulang request yang gagal, membatasi waktu tunggu, menyuntikkan kegagalan buatan untuk pengujian, dan melindungi backend dengan circuit breaking.
Setiap fitur di episode ini menjawab satu pertanyaan operasional: bagaimana sistem tetap stabil saat traffic membludak, saat backend melambat, atau saat kita ingin menguji ketahanan sistem sengaja. Kalian akan melihat bahwa ketahanan bukan hanya soal hardware — tapi soal konfigurasi.
Envoy memiliki filter rate limit yang bekerja bersama layanan rate limit eksternal:
http_filters:
- name: envoy.filters.http.ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
domain: api-gateway
rate_limit_service:
grpc_service:
envoy_grpc:
cluster_name: ratelimit_service
failure_mode_deny: false
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.RouterFilter envoy.filters.http.ratelimit mengirim request ke layanan rate limit untuk dinilai. Envoy sendiri tidak menyimpan counter; layanan eksternal yang memutuskan apakah request diizinkan atau ditolak. Setiap request diberi label domain api-gateway agar kebijakan bisa dibedakan per area.
Rule rate limit ditetapkan per route atau virtual host, sebagai deskripsi yang dikirim ke layanan eksternal:
virtual_hosts:
- name: api_vh
domains:
- api.example.com
routes:
- match:
prefix: "/orders"
route:
cluster: orders_service
typed_per_filter_config:
envoy.filters.http.ratelimit:
"@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimitPerRoute
vh_rate_limits:
- actions:
- request_headers:
header_name: X-Api-Key
descriptor_key: api_key
- generic_key:
descriptor_value: ordersBagian typed_per_filter_config mendeskripsikan atribut request yang dipakai layanan rate limit untuk menghitung counter. Dalam contoh ini, kombinasi nilai header X-Api-Key dan nilai orders menjadi kunci limit.
Layanan reference dari Envoy bisa dijalankan sebagai container:
docker run -d --name ratelimit -p 8081:8081 \
-v ~/envoy-lab/configs/ratelimit-config.yaml:/data/ratelimit/config/config.yaml \
envoyproxy/ratelimit:latestPerintah docker run di atas menjalankan layanan rate limit reference dengan config YAML yang mendefinisikan limit per descriptor. Konfigurasi layanan inilah yang menentukan batas seperti "100 request per menit per api_key".
Retry membuat Envoy mengulang request yang gagal ke endpoint lain:
routes:
- match:
prefix: "/api/"
route:
cluster: api_backend
timeout: 5s
retry_policy:
retry_on: connect-failure, retriable-status-codes
num_retries: 3
retry_host_predicate:
- name: envoy.retry_host_predicates.previous_hosts
retriable_status_codes:
- 503Dengan retry_policy, Envoy mengulang hingga 3 kali untuk koneksi gagal atau status 503, dan menghindari endpoint yang sudah pernah dicoba. timeout: 5s membatasi durasi total request termasuk semua percobaan retry. Ingat: hindari retry untuk request yang tidak idempoten, karena duplikasi bisa terjadi di sisi backend.
Fault injection memungkinkan kalian mensimulasikan kegagalan untuk menguji ketahanan sistem:
routes:
- match:
prefix: "/api/"
route:
cluster: api_backend
typed_per_filter_config:
envoy.filters.http.fault:
"@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.Fault
abort:
http_status: 503
percentage:
numerator: 10
denominator: HUNDRED
delay:
fixed_delay: 2s
percentage:
numerator: 20
denominator: HUNDREDKonfigurasi fault membuat 10 persen request gagal dengan status 503, dan 20 persen request ditunda 2 detik. Kombinasi abort dan delay ini adalah alat chaos engineering yang ideal untuk menguji retry dan timeout yang baru kita konfigurasi. Fault injection hanya untuk pengujian — aktifkan di staging atau lewat config dinamis yang bisa dimatikan cepat.
Circuit breaker membatasi berapa banyak koneksi dan request yang bisa menuju satu cluster:
clusters:
- name: api_backend
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: LEAST_REQUEST
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 1024
max_requests: 2000
max_retries: 5
- priority: HIGH
max_connections: 200
max_pending_requests: 256
max_requests: 500
max_retries: 3Blok circuit_breakers menetapkan batas terpisah untuk prioritas DEFAULT dan HIGH. Saat max_requests tercapai, request baru langsung ditolak tanpa menunggu — inilah yang melindungi backend dari banjir traffic. max_retries membatasi jumlah retry aktif, mencegah efek amplifikasi. Pantau metric upstream_rq_pending_overflow di admin interface: jika naik terus, circuit breaker sedang bekerja melindungi backend.
Episode 10 memberi kalian kontrol penuh atas traffic: rate limiting dengan layanan eksternal, retry dan timeout yang disesuaikan, fault injection untuk pengujian, serta circuit breaking yang melindungi backend dari overload.
Inti yang harus dibawa pulang:
typed_per_filter_config.timeout membatasi total durasi request termasuk retry.Di episode 11 selanjutnya kita akan membahas observability dan telemetry integration — metrics Envoy ke Prometheus, distributed tracing dengan Zipkin, Jaeger, dan OpenTelemetry, serta access log enrichment untuk observability yang lebih dalam.