RATE LIMIT & KOTA · ÖĞRETİCİ SUNUM
Vaka Çalışması · Araştırma · Mimari Tasarım · Çalışan Uygulama

Yüksek Trafikli
Rate Limit & Kota
Yönetim Platformu

Bir API/SaaS altyapısına gelen her isteğin; kullanıcı, kurum, uygulama, servis, endpoint ve API anahtarı boyutlarında tek merkezden denetlendiği — limit veya kota aşıldığında isteğin downstream servise hiç ulaşmadan kesildiği uçtan uca bir platform.

Sorun

Paylaşılan altyapıda istek trafiği sınırsız, dağınık ve ölçülemez. Her servis kendi limitini ayrı uygular; tek müşteri kapasitenin tamamını tüketebilir, satılan kullanım hakkı teknik tarafta sayılamaz, suistimal kapıdan geçer.

Çözüm

İstek yolundaki tek karar noktası: altı boyutta eşleşen kural tek atomik adımda değerlendirilir; istek ya geçer ya da kapıda 429 ile kesilir — sıcak yolda p99 7,1 ms.

Spring Cloud Gatewaykararın uygulandığı kapı Redis + Luaatomik sayaç ve karar PostgreSQLkural ve bakiyede kaynak doğruluk Kafka + Debeziumkayıpsız kural yayılımı (CDC) Elasticsearchistek izleri ve analitik Prometheus / Grafanametrik, panel ve uyarı Reactkural ve kota yönetim arayüzü
Vaka Çalışması · Problem ve Çözüm

Sorun ne, çözüm ne?

Sorun — Paylaşılan bir API altyapısında istek trafiği tek elden yönetilmiyor: her servis kendi limitini ayrı uygular, kurum ve kullanıcı bazında merkezî bir denetim ve ölçüm yoktur. Çözüm — İsteği downstream servise ulaşmadan tek noktada ve altı boyutta değerlendiren merkezî bir Rate Limit & Kota Yönetimi Middleware'i araştırdık, tasarladık ve çalışan bir uygulamayla ölçerek doğruladık.

İstek
gelen çağrı
Merkezî Middleware
Kullanıcı Kurum Uygulama Servis Endpoint API anahtarı
değerlendiriliyor…
İzin ver
Limit/Kota → kes
Sıcak yol · her istekte İstek Gateway filtresi Redis + Lua 200 · geç ya da 429 · kes Arka plan · isteği bloklamaz PostgreSQL Debezium + Kafka Elasticsearch Prometheus
1
Araştırmaİhtiyaç ve kullanım senaryoları; beş rate-limit algoritmasının karşılaştırılması; hız limiti ile kotanın ayrı iki eksen olduğunun tespiti.
2
Mimari tasarımKararın Redis'te tek atomik Lua ile verilmesi; kuralın PostgreSQL'de tutulup CDC ile kayıpsız yayılması; overdraft'lı kota cüzdanı; arıza duruşu ve gözlemlenebilirlik.
3
Örnek uygulama & doğrulamaUçtan uca çalışan sistem; gerçek testler, canlı ölçüm (p99 7,1 ms) ve bu sunumda elle denenebilir demolarla kanıt.
Tek cümlede: Dağınık, ölçülemeyen ve kötüye kullanıma açık istek trafiğini kullanıcı · kurum · uygulama · servis · endpoint · API anahtarı boyutlarında tek merkezden yöneten; araştırıp tasarladığımız ve çalışan bir uygulamayla ölçerek doğruladığımız bir middleware.
Başlangıç · İş Gerekçesi

Bu platform neye çözüm oluyor?

Binlerce müşterinin aynı altyapıyı paylaştığı bir API/SaaS sağlayıcısında istek trafiği sınırlanmadığında dört şey aynı anda bozulur: kapasite adaleti, gelir ölçümü, güvenlik ve servis kararlılığı. Soldaki iki şerit korumasız ile korumalı durumun farkını canlı gösterir; sağdaki eşleme her sorunun hangi mekanizmayla çözüldüğünü verir.

Korumasızakıyor…
Servis
0%
Sınır yok: her istek servise ulaşıyor; tek müşteri kapasiteyi tüketiyor → yük %100çöküş
Korumalıstabil
Servis
0%
Kural aşılınca fazlası kapıda 429 ile kesiliyor → yük dengede → servis ayakta
Kapasite adaleti yok — gürültülü komşuTek müşterinin toplu işi paylaşılan kapasiteyi tüketiyor; diğer tüm müşteriler yavaşlıyor.
Hız limitisubject bazlı adil pay · GCRA
Gelir ölçülemiyorSözleşmede "aylık 1M çağrı" var; teknik tarafta tüketimi sayan, biten hakkı kesen ve faturalayan mekanizma yok.
Kota / cüzdanbirim tüketim · faturalanır
Suistimal engellenemiyorBrute-force ve kötüye kullanım saniyede binlerce istekle geçiyor; ayrı adımlı sayaç yarış koşulunda yanılıyor.
Atomik kararRedis + Lua · p99 7,1 ms
Servis kararlılığı bozuluyorSınırsız trafik alt servisleri boğuyor; tek bir aşırı yük zincirleme arızaya dönüşüyor.
Kapıda kesmegateway'de dur · hiç ulaşmaz
Tek cümlede: Platform, "kim · nerede · ne kadar sürede · ne kadar" isteyebilir sorusunu her isteğin geçtiği tek noktada, hızlı ve atomik biçimde cevaplar; böylece paylaşılan altyapı adil kalır, ticari kullanım ölçülüp faturalanır, suistimal kapıda durur ve aşırı yük downstream servise hiç ulaşmaz.
Yol haritası

Altı durakta ilerleyeceğiz. Her durak, bir öncekinin üzerine inşa edilir.

1
Problem — neden böyle bir sisteme ihtiyaç var?
Gerçek dünyadaki 6 somut sıkıntı ve iki farklı ihtiyaç ekseni.
2
Kavramlar — ortak dili öğrenelim
Subject, scope, pencere, maliyet, counterKey. Sonrası kolay.
3
Motor nasıl çalışır? — animasyonlu
Algoritmalar, atomiklik, yarış koşulu, Redis anahtar yapısı.
4
Teknolojiler — hangisi nerede, neden?
Redis, Kafka, PostgreSQL, Elasticsearch, Prometheus.
5
Ürün — kota, dönemler, dayanıklılık, güvenlik
Canlı senaryolar ve gerçek ölçümler.
6
Uygulamalı & kanıt — elinizle deneyin
İnteraktif hız-limiti ve kota demoları; çalıştırdığımız gerçek testler.
1 · Problem

Neden ihtiyaç var?

Vakayı somutlaştıralım. Her servis kendi limitini ayrı ayrı, birbirinden habersiz uyguluyordu. Bu dağınıklık, üretimde altı somut problem doğuruyordu — her biri ayrı bir olayın kök nedeni.

P1

Tutarsız uygulama

Her ekip kendi çözümünü yazıyor; hata gövdeleri ve header'lar standart değil.

İstemci her serviste farklı 429 görüyor
P2

Ölçekte anlamsızlaşma

In-memory limit pod sayısıyla çarpılıyor: "dakikada 100" fiilen "1000" oluyor.

10 pod → limit 10 katına çıkıyor
P3

Gürültülü komşu

Tek kurumun toplu işi paylaşılan kaynağı tüketip herkesi etkiliyor.

1 müşteri → tüm kapasite, herkes yavaş
P4

Kotanın karşılığı yok

Satış "aylık 1M çağrı" satıyor; teknik tarafta ölçüp kesen mekanizma yok.

Tüketim sayılmıyor → faturalanamıyor
P5

Görünürlük eksik

"X kurumu bu ay ne tüketti?" sorusunun cevabı yok; kapasite varsayımla.

Kapasite planı tahmine dayanıyor
P6

Değişiklik yavaş

Bir limiti değiştirmek kod + PR + deploy: ortalama 2 gün. Olay anında imkânsız.

Değişiklik süresi ~2 gün, olayda geç
Ortak payda: altı problemin dördü (P1–P3, P6) sistemi korumak, ikisi (P4–P5) ticari ölçüm ihtiyacıdır. Çözüm, dağınık limitleri tek, merkezi ve atomik bir karar noktasında toplamaktır — sonraki slaytlar bunu adım adım kurar.
2 · Kavramlar

Önce ortak dili öğrenelim

Bir kural tek bir soruya cevap verir: kime · nerede · ne kadar sürede · ne kadar? Bu beş kavramı somut örnekleriyle oturtun — sunumun geri kalanı bunların üstüne kurulu.

Subject kime?

Limitin bağlandığı kimlik. Aynı istek birden çok subject'e aynı anda uyabilir — hem kurum, hem o kurumdaki kullanıcı ayrı ayrı sayılır.

tenant:acme
user:8823714
key:sk_live_…

Scope nerede?

Kuralın vurduğu hedefin genişliği: tüm sistem, tek servis ya da tek endpoint. Çakışırsa en özgül eşleşen kural kazanır.

global · tümü
svc:payment
POST /v1/transfers

Pencere ne kadar sürede?

Sayacın sıfırlanma ritmi. Hız limitinde saniye/dakika; kotada gün/ay ya da cüzdanda süresiz birikir.

1s · 1m · 1h
1d · 1mo
∞ · cüzdan

Maliyet ne kadar?

Bir isteğin kaç birim yediği. Hafif okuma 1, ağır dışa-aktarım 20 sayar — pahalı işler hakkı/kotayı çok daha hızlı eritir.

feed = 1
search = 3
export = 20

counterKey sayaç kimliği

Sayacın neyi ölçtüğünün kimliği — kuralın değil. Plan/fiyat değişse, hatta kural silinip yeniden yazılsa bile birikmiş tüketim aynı anahtarda korunur.

q.wallet:acme
p.user:8823714:1m
Hepsi tek cümlede: "tenant:acme'nin (kime) POST /v1/transfers üzerinde (nerede) 1 dakikada (ne kadar sürede) en fazla 60 istek (ne kadar) hakkı var; her ağır istek 10 sayar (maliyet)." Bir kural işte bu beş parçanın birleşimidir — sunumun geri kalanı, bu cümlenin milyonlarca istekte nasıl hızlı ve doğru uygulandığıdır.
2 · Kavramlar

İki farklı eksen, tek motor

En kritik kavram: hız limiti ve kota birbirine benzer ama tamamen farklıdır. Aşağıdaki iki canlı sayaç aynı anda ilerliyor — farkı kendi gözünüzle izleyin.

Hız Limiti

Rate Limit · GCRA · burst 10, 30/dk
  • Kova zamanla kendiliğinden dolar (jeton üretilir)
  • Biterse birkaç saniye bekleyince yeniden açılır
  • Faturalanmaz · hiçbir koşulda aşılamaz
  • Amaç: altyapıyı ve komşuları korumak
canlı sayaç10 / 10 jeton
200 · RateLimit-Remaining: 10
vs

Kota (Cüzdan)

Quota · OVERDRAFT_QUOTA · toplam tüketim
  • Yalnız kota yüklenince dolar — zaman doldurmaz
  • Bitince erişim durur · yükleme/satın alma gerekir
  • Faturalanır · bir kez eksiye düşebilir (kod 5)
  • Amaç: ticari tüketim ve gelir
canlı sayaç100.000 birim
200 · Quota-Remaining: 100.000
Günlük hayattan: Hız limiti = otoyol hız sınırı. Aşamazsın; yavaşlarsan yola devam edersin. Kimse sana "ekstra hız hakkı" satmaz — amaç herkesi ve altyapıyı korumaktır.
Günlük hayattan: Kota = ön ödemeli kontör. Bitince yükleyene kadar çekmez; harcadığın kadar ödersin; acil bir konuşma için bir kez küçük bir borca (aşım) izin verilebilir.
429 aldığınızda kim kesti? Yanıt başlığı söyler. X-Quota-Remaining: 0 geldiyse kota bitti — kullanıcıya "kota satın al" dersiniz; beklemek işe yaramaz. RateLimit-Remaining: 0 + Retry-After: 3 geldiyse hız limiti — "3 saniye sonra otomatik tekrar dene". İstemci bu iki başlığa bakıp doğru tepkiyi seçer; bu ayrım tüm sistemin anahtarıdır.
3 · Motor

Üç düzlem, tek istek yolu

Karar veren yol (data plane) hızlı ve DB'siz; kural yöneten yol (control plane) ayrı; analitik yol asenkron. Hiçbiri diğerini yavaşlatmaz — bu ayrım tasarımın temelidir.

Data Plane · istek yolu (hızlı, DB'siz)
İstemci
Gateway (karar)
Redis · atomik sayaç
Downstream servis
Control Plane · kural yönetimi
Admin UI
Config API
PostgreSQL + outbox
Debezium
Kafka → Gateway
Analitik Plane · asenkron
Gateway
Kafka usage
Elasticsearch → Kibana
Eşik bildirimleri
3 · Motor

Bir istek nasıl değerlendirilir?

Reaktif filtre, kimlik doğrulamadan sonra ama yönlendirmeden önce çalışır. Amaç: istek downstream servise ulaşmadan kararı vermek.

1 · Bağlam çıkar

tenant · user · endpoint · maliyet

2 · Kural eşleştir

bellek içi indeks · kilitsiz

3 · Redis kararı

tek atomik Lua çağrısı

4 · İzin / Kes

200 · veya 429/503/403

İstek yolunda retry yoktur. Redis timeout verirse doğrudan yedek plana (fallback) düşülür. Retry, zaten yüklü Redis'e ek yük bindirip kısmi bir yavaşlamayı tam kesintiye çevirirdi.
3 · Motor

Beş algoritma — neden tek değil?

Kota takvim sıfırlaması ister; hız limiti pürüzsüz burst kontrolü ister — tek algoritma ikisini birden iyi yapamaz. Beşini canlı mini-görsellerle kıyaslayalım, sonra altta gerçekte hangisini, neden seçtiğimizi görelim.

Fixed Window

takvim

Sabit pencere sayacı; süre dolunca sıfırdan başlar.

Basit, ucuz, takvimle uyumlu Sınırda 2× patlama tuzağı
Uygun: uzun kotalar (günlük / aylık)

Sliding Window

kullandık

Ağırlıklı kayan pencere; son 1 dakikayı sürekli değerlendirir (önceki dilim × kalan oran + mevcut).

Sınır patlaması yok, pürüzsüz Daha çok bellek / hesap
Uygun: API anahtarı hız limiti · sıkı SLA

Token Bucket

Kova sabit hızda dolar; her istek 1 jeton harcar.

Burst'e izin verir, sezgisel İki durum tutar (jeton + zaman)
Uygun: adil kullanım, yedek

GCRA

kullandık

Token Bucket'ın tek-değerli hali: teorik varış zamanı (TAT).

En ucuz, pürüzsüz akış Sezgisel değil, kavraması zor
Uygun: yüksek hacimli hız limiti

Overdraft Quota

kullandık
−100 · kilit

Özel kota cüzdanı; bakiye pozitifken geçer, bir kez eksiye düşebilir.

Yarım iş yok — atomik biter Uygulamaya özel, standart değil
Uygun: ticari kota / cüzdan (kod 5)
Peki gerçekte biz ne seçtik — neden?
Hız limiti GCRAToken Bucket GCRA — pürüzsüz akış, burst 10 · 30/dk. Ani yığılmayı düzeltir; Fixed Window'un pencere-sınırı tuzağı yok. Gerektiğinde Token Bucket devreye girer.
Kota cüzdanı OVERDRAFT_QUOTA · kod 5 Bakiye bir kez eksiye düşmeye izin verir → yarım iş üretmez: işlem bütün biter, sonra keser. Kesin ticari doğruluk.
API anahtarı limiti SLIDING_WINDOW Ağırlıklı kayan pencere — API anahtarı başına 20/dk. Pencere-sınırı yığılması olmadan pürüzsüz sınır. Önce gölgede ölçüldü, sonra ENFORCE'a alındı. Canlı doğrulandı: 25 istek → tam 20 geçti · 5 kesildi (429).
Takvim kotaları Fixed Window Günlük / haftalık / aylık yenilenir. Dönem-dilimli anahtar doğal sıfırlar; uzun pencerede sınır etkisi ihmal edilebilir.
3 · Motor · Algoritma

Token Bucket — canlı

Kova sabit hızda jetonla dolar; kapasitesi burst ile sınırlıdır. Her istek bir jeton harcar. Jeton varsa geçer, yoksa reddedilir. Bu, kısa patlamalara izin verirken sürekli aşırı yükü keser.

kapasite: 5
Kova dolu (5 jeton) — istekler geçer
5 istek arka arkaya → hepsi geçer, kova boşalır
6. istek → jeton yok, reddedilir (429)
Zaman geçti → kova yeniden doldu → tekrar geçer
Neden "burst" iyi bir şey? Gerçek istemciler düzgün aralıklarla değil, kümeler halinde istek atar. Token Bucket kısa yığılmaya izin verir ama ortalama hızı korur — kullanıcı deneyimi ile koruma arasında denge.
3 · Motor · Algoritma

Fixed Window ve gizli tuzağı

"Dakikada 100" için her dakikayı sıfırlayan bir sayaç basit görünür. Ama pencere sınırında tehlikeli bir durum vardır. Aşağıdan kendiniz istek gönderin — tuzağın canlı oluştuğunu görün.

sınır penceresi · 1 sn
Pencere 1 · limit 100
Pencere 2 · limit 100
sıfırlama
Pencere 1 sayacı0 / 100
Sınır penceresinde geçen
0
1 saniyelik aralıkta kabul edilen toplam istek
Pencere 2 sayacı0 / 100
Her pencere kendi limitini (100) doğru uygular — ama sıfırlama anına yığılan istekler iki ayrı pencereye bölünür. 1 saniyelik aralıkta 200 istek geçer: fiili tepe yük, limitin 2 katı.
Çözüm: Kısa pencerelerde Token Bucket / GCRA (kayan, sınır problemi yok) kullanılır. Fixed Window ise yalnızca uzun kotalarda (günlük/aylık) tercih edilir — orada takvim sıfırlaması gerekli, sınır etkisi ihmal edilebilir.
3 · Motor · Atomiklik

En sinsi hata: yarış koşulu

İki ayrı istek — aynı isteğin tekrarı değil, iki farklı istemciden (ör. aynı hesabı kullanan iki cihaz) gelen iki bağımsız istek — tam olarak aynı milisaniyede aynı sayaca vurursa ne olur? Yolu kendiniz seçin, A ve B'yi aynı anda tetikleyin, farkı canlı görün.

İstek A — 1. istemci aynı anda · aynı sayaç İstek B — 2. istemci (farklı, bağımsız istek)

Naif: GET → kontrol → SET (3 ayrı adım)

AGET sayaç → 99 okur
BGET sayaç → 99 okur (A daha yazmadan)
A99 < 100 → geçir, SET 100
B99 < 100 → geçir, SET 100
Sonuç: 101 — ikisi de geçti, limit aşıldı!
99
yolu seç ve gönder

Atomik: tek Lua çağrısı (bölünmez)

ALua: oku+kontrol+yaz tek parça
A99 → 100, geçer
BB ancak A bitince başlar (sıraya girer)
B100 → limit dolu, reddedilir
Sonuç: 100 — biri geçti, biri kesildi
Neden Lua? A ve B iki bağımsız istektir; naif yolda ikisi de "99 gördüm, yer var" der çünkü A henüz yazmamışken B okur. Redis Lua script'ini tek atomik birim çalıştırır — B, A bitene kadar bekler. Testte doğrulandı: 500 eş zamanlı istek → tam olarak 250 geçti, ne bir eksik ne bir fazla.
3 · Motor · Redis

Bir Redis anahtarının anatomisi

Sayaçlar Redis'te yaşar. Anahtarın her parçasının bir görevi var. Bir örnek seçin, sonra parçaların üstüne gelin — her parçanın ne işe yaradığını okuyun.

Bir parçanın üstüne gelin
Fare ile (veya klavyeyle sekerek) yukarıdaki parçaları gezin — her birinin görevi ve neden orada olduğu burada belirir.

{...} hash-tag

Cluster'da aynı öznenin tüm anahtarlarını aynı slot'a düşürür → tek atomik script hepsine erişebilir.

counterKey, ruleId değil

Sayaç "ne ölçtüğünü" söyler. Müşteri plan değiştirse bile tüketim korunur — sayaç sıfırlanmaz.

Pencere dilimi

Takvim pencerelerinde (aylık) anahtara gömülür: 202607. Cüzdanda ve GCRA'da yoktur — süresizdir.

4 · Teknoloji · Redis

Redis — kararın verildiği yer

Her istek Redis'te tek atomik Lua çağrısıyla, milisaniyenin altında karara dönüşür. Neden PostgreSQL değil? Aynı özneye eş zamanlı UPDATE'ler serileşir (~10k tps tavan). Redis'te ölçtük: EVALSHA ~19µs. Aşağıda bir isteğin karara dönüşünü izleyin.

gelen istekEVALSHA a3f9 rl:{t:acme}:q.api:202607 →
Lua · bölünmez blok
toplam süre0 µs
-- sayacı oku local u = redis.call('GET', KEYS[1])
-- limiti kontrol et if u >= limit then return DENY end
-- tüketimi işle redis.call('INCR', KEYS[1])
-- pencereyi taze tut redis.call('PEXPIRE', KEYS[1], win)
-- kararı döndür return ALLOW, limit - u
ALLOW · kalan 7 · yarış koşulu imkânsız

Atomik & mikro-saniye

Lua script tek komut gibi çalışır; ortada başka istek araya giremez → yarış koşulu yok. İstek yolu bloklanmaz.

AOF — para kalıcı kalır

Cüzdan bakiyesi para karşılığıdır. appendonly yes ile restart'ta bakiye korunur (test: 850 → restart → 850).

Hash-tag → slot sabitleme

{t:acme} öznenin tüm anahtarlarını aynı slot'a düşürür; tek Lua script cluster'da hepsine dokunabilir.

İki hızlı yol daha: acil kural değişikliği ratelimit:invalidate Pub/Sub kanalıyla <100ms tüm node'lara ulaşır; tekrar koruması ise SET NX ile 24 saatlik idempotency deposunda tutulur — DB'ye sıfır yük.
4 · Teknoloji · Kafka + Debezium

Kayıpsız kural yayılımı (CDC)

Admin bir kota yüklediğinde bu değişiklik gateway'e nasıl kaybetmeden ulaşır? Zincir boyunca paketi ve biriken gecikmeyi izleyin — uçtan uca ~35ms.

uçtan uca gecikme0 ms

Admin

kota yükle

+8ms

PostgreSQL

UPDATE + outbox
(tek transaction)

+12ms

Debezium

WAL okur

+9ms

Kafka

rules.v1
(compacted)

+6ms

Gateway

bellek indeksi
~35ms

NE — Outbox + CDC

Kural yazılırken aynı transaction'da bir outbox satırı düşer. Debezium PostgreSQL WAL'ini okuyup bu satırı Kafka'ya taşır.

NEDEN — ikili yazım yok

"DB'ye yaz + Kafka'ya yaz" iki ayrı işlem atomik olamaz — biri düşer, tutarsızlık doğar. Outbox tek transaction ile bunu imkânsız kılar → kayıpsız.

NASIL — kendi consumer group'u

rules.v1 compacted topic; her gateway kendi group'uyla tüm kuralları alır → yerel bellek indeksi, karar anında ağ turu yok.

Neden compacted topic? Kafka her ruleId için yalnız en son değeri saklar. Yeni açılan (veya çöküp dönen) bir gateway topic'i baştan okuyarak tüm kuralların güncel halini yeniden inşa eder — geçmiş olay yığınını değil. Durum kaybı yok, yeniden yayın gerekmez.
4 · Teknoloji · Kafka

Kafka — olay omurgası

Bu platformda Kafka üç işi aynı anda yapar: kuralları tüm gateway'lere yayar, her isteğin izini analitiğe akıtır ve kota eşikleri aşılınca canlı olay üretir. Üretici olayı yazar, tüketiciler kendi hızında okur — kimse kimseyi beklemez.

Producer — yazar
Gateway Ausage üretir
Gateway Busage üretir
Adminkural + eşik olayı
ratelimit.rules.v1compact · CDC ~35 ms
son değer / ruleIdrule#42 · 30/dk
ratelimit.overrides.v1compact · istisna / override
son değer / keytenant:acme → +2×
ratelimit.usage.v16 partition · 7 gün · her istek
P0off 0
P1off 0
P2off 0
P3off 0
P4off 0
P5off 0
anahtar tenant=acme → hash → her zaman P2 · sıra korunur
ratelimit.quota-events.v1YENİ · CANLI %80/%100 eşiği
eşik olayı— bekliyor —
Consumer group — okur
Tüm Gateway'lerkendi random group → tam kopya
ES indexerkendi group
Eşik izleyicisabit paylaşımlı group
Downstreambildirim / otomasyon
Topic & Partition

usage.v1 6 partition'a bölünür. Bölme = paralellik: aynı anahtar tek partition'a düşer, farklı anahtarlar farklı partition'lara → 6 tüketici eşzamanlı çalışır.

Consumer group

Her gateway kendi rastgele UUID group'u → herkes TÜM kuralları alır. Eşik izleyici sabit group → iş partition'lara paylaştırılır, olay bir kez işlenir.

Offset & sıra

Her group kaldığı offset'i saklar; çöküp dönünce kaldığı yerden okur — olay kaybolmaz. Aynı anahtar hep aynı partition → sıralama garanti.

Compact vs delete

rules/overrides compact: her anahtarın son değeri kalıcı → yeni gateway state'i baştan kurar. usage delete: 7 gün sonra silinir.

NE

Servisler arası dayanıklı olay omurgası — üretici olayı diske yazar, tüketiciler kendi hızında okur.

NEDEN

Dayanıklı & tekrar-oynatılabilir · çok-tüketicili (tek olay → ES + izleyici + downstream) · gevşek bağlı (üretici tüketiciyi bilmez) · asenkron → istek yolu yavaşlamaz.

NASIL

Çözer: ikili-yazım tutarsızlığı, senkron bağımlılık, kayıp olay. Kota %80/%100quota-events.v1 → otomasyon dinler.

dayanıklı tekrar-oynatılabilir çok-tüketicili
4 · Teknoloji · Depolar

Üç depo, üç farklı iş

Aynı olay gibi görünür ama tek bir karar üç ayrı soruya cevap verir. İzleyin — bir DENY olayı üç depoya farklı amaçlarla dağılıyor.

karar olayı429 DENY · tenant=globex · endpoint=/v1/pay · rule=OVERDRAFT · 12ms

PostgreSQL — Kaynak Doğruluk

Ne: Kural, müşteri, fatura, denetim satırı.
Neden: ACID + kalıcı — faturalamanın tek doğru kaynağı.

INSERT INTO audit(tenant, rule, ...)
yüksek doğruluk · düşük hacim

Elasticsearch — Analitik

Ne: Her isteğin tam kararı; kim / ne kadar / hangi endpoint.
Neden: Yüksek kardinalite — tenant × endpoint kırılımı burada aranır.

tenantId:"globex" AND decision:"DENY"
tüm etiketler serbest · milyonlarca doküman

Prometheus — Operasyon

Ne: Sistem sağlıklı mı, ne kadar hızlı, ne kadar kesiyor.
Neden: Düşük kardinalite — sadece sabit etiketler.

decisions_total{decision="DENY", rule="OVERDRAFT", tenant="globex"}
ADR-011 · tenantId etiket DEĞİL
Neden tenantId Prometheus'ta etiket değil? (ADR-011) Etiket olsaydı 5.000 tenant × 1.200 endpoint = milyonlarca ayrı zaman serisi doğar ve Prometheus çöker. O kırılım Elasticsearch'e aittir; genel p99 ise gerçek-zamanlı olmadığı için Elasticsearch'e değil Prometheus'a sorulur. Her soru doğru depoya.
4 · Teknoloji · Elasticsearch + Kibana

Her isteğin izi — Elasticsearch analitiği

ratelimit.usage.v1 topic'inden gelen her istek bir kullanım olayına dönüşür ve toplu (_bulk) indekslenir. Prometheus'un taşıyamadığı yüksek kardinaliteli soru burada cevaplanır: kim, ne zaman, hangi endpoint'te, neden kesildi?

ratelimit.usage.v1 her istek → bir olay
_bulk tamponu 0 / 500
toplu indeksleme → Elasticsearch
1.284.096
indekslenen belge · 0 belge/sn
POST ratelimit-usage-2026.07.23/_doc
{
  "ts": "2026-07-23T14:32:07.412Z",
  "tenantId": "globex",
  "endpoint": "/v1/pay",  "method": "POST",
  "decision": "DENY",   "statusCode": 429,
  "ruleId": "overdraft-pay-01",
  "algo": "OVERDRAFT_QUOTA",
  "latencyMs": 12,
  "apiKeyHash": "sha256:9f2a…c1"
}
Kibana · :5601 canlı pano
KQLtenantId:"globex" and statusCode:429 and ts >= now-1h
429'lar / zaman (5 dk kova)
En çok reddedilen endpoint (top-5 · terms agg)
/v1/pay0
/v1/export0
/v1/search0
/v1/upload0
/v1/users0
globex · 429 · son 1s → 0 eşleşen belge

NE — olay ambarı

Her kararın tam bağlamı tek belgede: tenant, endpoint, karar (ALLOW/DENY/SHADOW), kural, gecikme, zaman. Günlük index (ratelimit-usage-*), milyonlarca doküman.

NEDEN — yüksek kardinalite

Tenant × endpoint = milyonlarca kırılım. Prometheus'ta etiket olsa çöker (ADR-011). ES ters-indeksle tam-metin + terms/date agregasyonuyu saniyede döndürür — serbest sorgu.

NASIL — bulk + Kibana

Consumer olayları tamponlar, _bulk ile toplu yazar (tek tek değil → yüksek verim). Kibana (:5601) bu index üzerinde pano, filtre ve alarm kurar.

Prometheus "ne kadar?", Elasticsearch "kim ve neden?" Bir müşteri "dün 14:00–15:00 arası neden kesildim?" diye sorduğunda Prometheus'un genel decisions_total sayacı yetmez — o sadece toplam sayar. ES'te tenantId:"globex" AND decision:"DENY" sorgusu tam o pencereyi, tam o kuralı, tam o endpoint'i geri getirir. Denetim, kök-neden ve iş analitiği bu depoya ait.
4 · Teknoloji · Gözlemlenebilirlik

Prometheus + Grafana — sistemin nabzı

Rolü net: düşük kardinaliteli operasyon metriği. Gateway /actuator/prometheus'u açar, Prometheus scrape eder (:9090), Grafana panolarda gösterir (:3001). Ucuz, sürekli, alarmlı. Ama tek bir kural var: tenantId etiket DEĞİL (ADR-011).

Gateway/actuator/prometheus scrape · 15s Prometheus:9090 · TSDB PromQL Grafana:3001 · pano + alarm
Rate-Limit · Operasyon CANLI :3001
ALARM · red oranı > %10 (zirve %14)
izin/red oranı sum(rate(ratelimit_decisions_total{outcome="deny"}[1m])) / sum(rate(ratelimit_decisions_total[1m])) şimdi 4,0%
0karar p99 (Grafana'da ölçüldü)
0yük testi debisi
23114msGC darboğazı · panoda görüldü
Kardinalite patlaması — ADR-011
tenantId ETİKET olsaydı 5.000 tenant × 1.200 endpoint
0 aktif seri TSDB şişer → Prometheus çöker
tenantId etiketsiz — yalnız sabit etiketler {outcome, rule}
~120 seri ucuz · sürekli · alarmlanabilir
p99 gecikmehistogram_quantile(0.99, rate(ratelimit_decision_latency_seconds_bucket[5m]))
Redis fallbackrate(ratelimit_redis_fallback_total[5m])
5xx sum(rate(gateway_requests_total{status=~"5.."}[1m])) ruleset ratelimit_ruleset_version
Her soru doğru depoya. Prometheus zaman × metric × sabit-etiket tutar; tenant gibi milyon değerli bir kırılım eklersen seri sayısı patlar (yukarıda ~6 milyon). Bu yüzden "hangi tenant ne zaman kesildi?" sorusu Elasticsearch'e; "sistem şu an sağlıklı mı, p99 kaç, red oranı eşiği aştı mı?" sorusu Prometheus'a gider. GC darboğazını (231→14 ms) ve 1081 rps'i işte bu ucuz panoda gördük.
5 · Ürün · Canlı senaryo

Kota cüzdanı — eksiye düşme

1000 birim yüklü, 900 tüketilmiş → bakiye 100. Butonlarla cüzdanı siz oynatın: 200 birimlik istek bakiye pozitifken geçer, sizi -100'e düşürür; sonrası 429. Yükleyince erişim geri açılır.

Kota cüzdanı · 1000 birim yüklü bakiye 100
AŞIM
tüketilen: 900 bakiye = yüklü − tüketilen
① Bakiye 100
200 birimlik istek geliyor.
bakiye > 0 → değerlendir
② İstek GEÇER (200 OK)
Bakiye pozitifti; iş tamamlanır.
X-Quota-Remaining: -100
③ Bakiye -100 · EKSİDE
Sonraki her istek kesilir.
429 · 429 · 429
④ Kota yükle
Erişim açılır, geçmiş tüketim silinmez.
+1000 → bakiye 900
Neden geçiriyoruz? İsteği ortasında kesmek yarım iş (yarım transfer, yarım rapor) üretir. Aşım faturalandırılabilir; yarım iş faturalandırılamaz. Bu yüzden bakiye pozitifken istek tamamlanır (bir kez eksiye düşülebilir), sonrası kesilir. Bu davranış OVERDRAFT_QUOTA (kod 5) algoritmasıdır.
5 · Ürün · Kota modeli

Ön ödemeli mi, her dönem yenilenen mi?

Tek düğme (kota modu) iki iş modelini de verir. Modu seçin, “Dönemi ilerlet” ile dönemleri atlayın: Ön Ödemeli cüzdan birikir, hiç sıfırlanmaz; Yenilenen kota her dönem başında el değmeden 0'a döner.

Yenilenen sayaç anahtarı rl:{t:acme}:q.wallet:20260724 1. dönem
Ön Ödemeliyenilenmez · birikir
tüketim birikir — dönem değişse de sıfırlanmaz
Yenilenen · Günlükher dönem 0'a döner
dönem sınırında sayaç 0'a döner — el değmeden yeni hak
önceki dönem
bu dönem20260724
sonraki dönem20260725
Nasıl çalışır? Yenilenen kotada sayaç anahtarına dönem dilimi gömülür: …:q.wallet:20260724. Dönem değişince …:20260725 yeni bir anahtar doğar; eskisi TTL ile silinir → tüketim ekstra kod olmadan sıfırlanır. Haftalıkta ISO hafta (2026W30), aylıkta ay (202607) dilimi kullanılır. Ön ödemelide dilim yoktur; anahtar sabittir, hiç sıfırlanmaz.
5 · Ürün · Dayanıklılık

Redis çökerse ne olur?

Fail-open ve fail-closed ikili bir seçim değildir. Her kural kendi politikasını taşır. Redis'i "düşürüp" üç farklı sonucu izleyelim.

Redis çalışıyor — kararlar normal veriliyor
OPEN · izin ver

Adil kullanım, genel koruma. Kesinti gürültülü komşudan kötüdür.

200
CLOSED · reddet

Güvenlik (login) ve ücretli kota. Brute-force penceresi açılmamalı.

200
LOCAL_DEGRADED

Global limiti pod sayısına böl, yerel kova uygula. Kritik downstream'i korur.

200
Üçüncü yol neden önemli? "Hiç limitleme" ile "her şeyi kes" arasında bir orta yol. Devre kesici, Redis'in "yaşayan ölü" halini (yavaş ama cevap veren) bile erken yakalar — p99 bütçesini korur.
5 · Ürün · Dayanıklılık

Kota sistemi çökerse hesaplar ne olur?

Redis para değil hız tutar. Tüketim her 30 sn PostgreSQL'e checkpoint'lenir. Redis tüm veriyi kaybetse bile müşteri bedava kota kazanamaz — sayaç checkpoint'ten geri kurulur. Senaryoyu aşağıda siz yürütün.

durum · normal
Redis · canlı sayaç
30
hızlı karar
her 30 sn · checkpoint
PostgreSQL · checkpoint
30
dayanıklı gerçek · dönem 20260724
Normal: Redis karar veriyor, checkpoint her 30 sn tazeleniyor.

İki tehlike, iki doğru cevap

Redis'e ulaşılamıyor → ekranda son checkpoint "bayat" damgasıyla gösterilir. Uydurma değer yok; kullanıcı verinin gecikmeli olduğunu bilir.
Redis veriyi kaybetti → "Uzlaşmayı çalıştır" kaybı fark eder ve checkpoint'ten geri yükler. 30 tüketim 30 kalır, 0 olmaz.

Geri yükleme neden idempotent?

Geri yükleme birden çok yoldan (gösterim + zamanlı iş) ve eş zamanlı tetiklenebilir. INCRBY olsaydı her çağrı değeri şişirirdi: 6 çağrı → 180. Bunun yerine atomik taban (floor) yazılır: max(mevcut, checkpoint). Kaç kez çalışırsa çalışsın sonuç 30. Çökme sonrası gelen yeni trafik değeri büyütmüşse o korunur — hiçbir tüketim kaybolmaz.

5 · Ürün · Sağlamlaştırma

Güvenlik & İdempotency

Dört açık kapatıldı; hepsi Redis öncelikli — sıcak yol veritabanına yük bindirmez. İlk ikisini elinizle deneyin: para tam bir kez yazılır, IDOR saldırısı imzada reddedilir.

İdempotency — para tam bir kez

Kota yükleme / fatura · SET NX Redis kilidi · DB'ye sıfır yük

Sahiplenen · SET NX = OK0
Yinelenen · yok sayıldı0
Cüzdana yazılan+0 TL

Portal IDOR → HMAC token

Parametre yok sayılır · imzalı token · doğrulama sıfır DB/Redis

token · payload{ "customer": "acme", "exp": 1790000000 }
HMAC-SHA256 imzagönderilen a91f…7c2e  =  hesaplanan a91f…7c2e
200 OK · imza doğru — token içindeki kimlik kullanılır

Config API — Bearer + sabit zaman

Kural yönetimi Bearer token ile korunur (admin / readonly rolleri). Karşılaştırma MessageDigest.isEqual ile sabit zamanlı — token'ı harf harf tahmin ettiren zamanlama sızıntısı yok. Denetim aktörü artık istemciden gelmez, token'dan türetilir: dev modda bile sahtecilik imkânsız.

DB'ye minimum gidiş — N+1 çözümü

Müşteri listesi eskiden her müşteri için ayrı kural sorgusu yapıyordu: 1 + N. Deterministik dönem-dilimli anahtar sayesinde kural DB'den yüklenmeden Redis'ten okunur. Artık 1 SQL + 1 Redis MGET: 1.000 müşteri için 1.001 sorgu → 2 gidiş. Sıcak yol veritabanını hiç görmez.

6 · Uygulamalı · Test rehberinden

Elinizle deneyin — hız limiti

Test rehberinin ilk kanıtı: aynı istek iki farklı porta. Butona basın — kova (burst 10) boşalınca 429 başlar. Gerçek kuralın simülasyonu: GCRA 30/dk, burst 10. Aşağıdaki her tıklama gerçek sistemdeki bir curl isteğine denktir.

10 / 10 token
0 × 2000 × 429port :8080 · gateway
Son yanıt
İstek göndermek için soldaki butona basın.
Ne kanıtlıyor? Gateway (:8080) ilk 10 isteği geçirir, sonra 429 ile kenarda keser — downstream servise hiç yük binmez. "Gateway'i atla"yı işaretleyip aynı isteği doğrudan servise (:8082) gönderdiğinizde hepsi 200 döner: servisin kendi limitlemesi yoktur. Fark, limitlemenin nerede yapıldığını gösterir.
6 · Uygulamalı · Kota rehberinden

Elinizle deneyin — kota senaryoları

Gerçek uygulama davranışını adım adım yürütün. Üstten bir senaryo seçin; "Sonraki adım" ile cüzdan bakiyesini canlı izleyin. Her adım ne olduğunu ve neden olduğunu anlatır — overdraft, haftalık yenilenme, çoklu servis maliyeti, idempotent yükleme ve başarısız çağrı iadesi.

Bakiye pozitifken bir kez aşıma izin verilir; sonra 429. Eşik bildirimi, askıya alma ve iade de aynı akışta.
0 / 9
Başlamak için "Sonraki adım"a basın
yüklenen 0tüketilen 0
hazır
Her adımda burada neden öyle davrandığını göreceksiniz.
Adım adım detay
İlerledikçe adımlar burada birikecek.
Olay & bildirim akışı
5 · Ürün · Ölçüm

Sadece tasarım değil — çalışıyor

Hepsi çalışan sistem üzerinde, tek dizüstünde (Docker 8 CPU / 11 GB) ölçüldü.

0
500 eş zamanlı istek
tam olarak 250 geçti · limit korundu
0
Ek gecikme p99
p50: 0,21 ms
0
Sürdürülen rps
5xx: 0
0
Otomatik test
hepsi geçiyor

Ölçülen bir darboğaz ve çözümü

İlk yük testinde isteklerin %19'u 503 aldı. Redis sağlıklıydı (23µs) ama gateway JVM'inin GC duraklaması 231ms'ye çıkıyordu → timeout → devre kesici → fail-closed 503. Hata JVM ayarındaydı, sistemde değil.

GC duraklama
231ms14ms
5xx
125.1000
Reddedilen istek kotayı tüketmez — 20 başarısız denemeden sonra sayaç sabit.
Redis kapalı + fail-closed → 503 (429 değil — hata istemcide değil).
Redis restart → cüzdan bakiyesi korundu (AOF ile 850 → 850).
6 · Kanıt · Gerçek testler

Aşağıdaki her satır bu sistemde gerçekten koşturuldu; slaytlar ekran görüntüsü değil, ölçüm. Testleri çalıştır'a basın — satırlar sırayla yeşile dönsün, her biri kendi ölçüm rozetini göstersin.

0 / 12 geçti hazır
500 eş zamanlı istek → tam 250 geçti (limit 250)250 / 250atomik
Kayan pencere (SLIDING_WINDOW) API anahtarına 20/dk uyguladı → 25 istek: 20 geçti · 5 kesildi20 / 25sliding
Reddedilen istek kotayı tüketmedi (20 denemeden sonra sayaç sabit)0 sızmaiki-faz
Bakiye 100 · 200'lük istek geçti → -100, sonrası 429-100overdraft
Kota %80'e ulaşınca tek eşik bildirimi gitti · %100'de erişim kesildi1 bildirimeşik
%80 eşiği aşılınca Kafka olayı yayınlandı → ratelimit.quota-events.v1 (eşik ekrandan dinamik)quota-events.v1kafka
Admin'de kural değişti → gateway'e ~35 ms'de yayıldı (CDC zinciri)~35 msyayılım
Günlük yenilenen kota → anahtar …q.wallet:20260724, dönemle sıfırlanır20260724dönem
Redis'ten sayaç silindi → checkpoint'ten 30 geri yüklendi (0 değil)30 ↺uzlaşma
6 eş zamanlı geri yükleme → yine 30 (INCRBY olsa 180 olurdu)30 ≠ 180idempotent
GC darboğazı bulundu: 231ms → 14ms, 5xx 125.100 → 0 · 1081 rps231→14 msyük
Redis restart → AOF ile bakiye korundu (850 → 850)850 → 850kalıcılık
77 otomatik test · 7 uçtan uca senaryo · p99 7,1 ms · hepsi yeşil, 0 hata
6 · Kanıt · Ne yaptık, neden, neyi çözdü

Her testin arkasındaki mantık

Testler rastgele değil: her biri gerçek bir başarısızlık modunu hedefler. Bir başlığa tıklayın — ne yaptık · neden bu mekanizma · neyi çözdü, ölçülen kanıt ve mekanizmanın canlı mini şeması açılsın.

Ne500 istemci tam aynı anda aynı sayaca vurdu.
NedenRedis + Lua: "oku-karşılaştır-yaz" tek atomik adımda çalışır. İki istek çekirdek içinde sıraya girer; uygulama katmanında kilit olsaydı ağ gidiş-gelişi yarışı açardı.
ÇözdüFazladan geçiş (251+) imkânsız → gelir ve koruma sızmaz.
Kanıt: 500 eş zamanlı → tam 250 geçti, ne bir eksik ne fazla
İki istek → tek Lua → sıralı karar
A B
Lua · atomik
sayaç99/100
A ✓ 200 · 100 B ✗ 429
NeBakiye 100 iken 200'lük tek istek geldi.
Nedenİki-fazlı değerlendir-uygula: isteği ortada kesmek yarım iş (yarım transfer) üretir; bakiye pozitifken iş tamamlanır, aşım faturalanır.
Çözdüİş biter, aşım faturalanır, sonraki istekler kesilir — "yarım transfer" sorunu yok.
Kanıt: 200 OK + X-Quota-Remaining: -100, ardından 429
Cüzdan 100 → 200'lük istek → -100 → kilit
bakiye100gelen: 200
AŞIM −100sonraki → 429
Ne50 eş zamanlı kota yükleme, aynı Idempotency-Key.
NedenRedis SET NX: anahtarı yalnız ilk gelen kurar, DB'ye hiç gitmeden tam bir kez sahiplenme; diğer 49 "zaten var" alır.
ÇözdüÇift tıklama / retry kotayı iki kez doldurmaz — müşteri iki kez faturalanmaz.
Kanıt: 50 eş zamanlı istekte tam 1 yükleme sahiplendi
50 aday → SET NX → tam 1 sahip
Idempotency-Key · SET NX
1 sahiplendi ✓49 → "zaten var"
NeRedis sayacı silindi; 6 eş zamanlı geri yükleme tetiklendi.
NedenPostgreSQL checkpoint dayanıklı gerçektir; geri yükleme idempotent taban = max(mevcut, checkpoint), INCRBY değil.
ÇözdüVeri kaybında müşteri bedava kota kazanmaz; çift-geri-yükleme değeri şişirmez.
Kanıt: 6 çağrı → yine 30 (INCRBY olsa 180 olurdu)
Redis çöker → PG checkpoint tabanı geri yükler
Redis30
checkpoint
PostgreSQL30
geri yükleme = max(mevcut, 30) · ×6 → yine 30
NeGünlük yenilenen kota tanımlandı; gün değişince sayaç sıfırlanmalı.
NedenDönem-dilimli anahtar: sıfırlamayı zamanlanmış iş değil, anahtar tasarımı yapar. Gün dönümünde anahtar değişir, yeni anahtar 0'dan başlar.
ÇözdüGün/hafta/ay başında tüketim ekstra kod ve yarış olmadan sıfırlanır; eski anahtar TTL ile silinir.
Kanıt: yeni gün → yeni anahtar doğdu, tüketim 0'landı
Gün dönümü → anahtar döner → sayaç 0
q.daily:acme:20260724
tüketim 0/2000:00 · yeni dönem
Nek6 ile 1081 rps sürdürüldü; isteklerin %19'u 503 aldı.
Neden"Çalışıyor" demek yetmez, ölçtük: suçlu Redis değildi (~23µs), gateway JVM'inin GC duraklamasıydı. G1GC ayarıyla düzeldi.
ÇözdüGC 231ms → 14ms; 5xx 125.100 → 0. Hata JVM'deydi, tasarımda değil.
Kanıt: p99 7,1 ms · 5xx 0 · 1081 rps sürdürüldü
GC duraklaması 231→14 ms · 5xx → 0
231msönce
14msG1GC
5xx125.1000
6 · Kanıt · Teknoloji seçimi

Neyi neden kullandık?

Her parça tek bir işi en iyi yaptığı için burada. Bir teknolojiye tıklayın — ne olduğunu, neden seçtiğimizi, neyi çözdüğünü ve bu uygulamada tam olarak nerede çalıştığını canlı bir mini animasyonla açalım.

Redis
Karar
Tek cümlede: Redis karar verir, PostgreSQL hatırlar, Kafka duyurur, Elasticsearch açıklar, Prometheus nabız tutar, Gateway uygular. Altı parça, altı ayrı iş — hiçbiri diğerinin işini yapmaz.
Özet · Öğrenme Yolculuğu

Bu sunumda kavramsal olarak nerelerden geçtik?

Ürünü bir yana bırakıp yolculuğa kavram düzeyinde bakalım: bir problemden yola çıkıp, algoritmadan atomikliğe, dağıtık mimariden ürün davranışına altı durakta hangi teorik konuları işledik.

01

Problem & Kavramlar

Neden hız sınırlama ve kotaya ihtiyaç var; birbirine benzeyip aslında ayrışan iki eksen ve bir kuralın anatomisi.

hız limiti ↔ kotasubjectscopepenceremaliyetcounterKey
02

Algoritmalar

Sayaç ailesi ve her birinin doğru kullanım anı — klasik sınır tuzağından pürüzsüz kadansa.

Fixed WindowSliding WindowToken BucketGCRAOverdraft Quota
03

Atomiklik & Anahtar

Yarış koşulunu tek atomik adımda çözmek ve sayacın kimliğini —kuralın değil— tasarlamak.

race conditiontek atomik Luaanahtar anatomisidönem-dilimli anahtar
04

Dağıtık Mimari

Her bileşene tek bir sorumluluk: karar, kaynak doğruluk, kayıpsız yayılım, analitik ve metrik.

Redis · kararPostgreSQL · doğrulukKafka/Debezium · CDCElasticsearchPrometheus/Grafana
05

Ürün Davranışı

Kotanın ticari yüzü ve arıza anındaki duruşu — güven, tutarlılık ve doğru anda haber verme.

overdraft cüzdanön ödemeli ↔ yenilenenfail-open/closed/degradedcheckpoint uzlaşmasıidempotencyeşik olayları
06

Kanıt & Yöntem

Kavramların lafta kalmadığı yer: gerçek testler, canlı ölçümler ve elle denenebilir demolarla doğrulama.

gerçek testlercanlı ölçümdenenebilir demolar
Tek cümlede ne öğrendik: Bir kuralı beş kavrama indirgeyip (kime · nerede · ne kadar sürede · ne kadar), doğru algoritmayla ve tek atomik adımda uygulayıp; her dağıtık bileşene tek bir iş vererek — sistemi koruyan hız limitini ve geliri taşıyan kotayı aynı motorda hızlı, doğru ve dayanıklı biçimde yönetmeyi.
1 / 32
gezin · O tüm slaytlar · Home başa dön · F tam ekran · R tekrar