GH GambleHub

Circuit Breaker we retralar

Circuit Breaker we retralar

1) Bu näme üçin zerur?

Torlar ygtybarly däl: gizlinlik titreýär, düwünler düşýär, çäkler gazanylýar. Retralar gysga möhletli şowsuzlyklardan halas edýär we Circuit Breaker ulgamy kaskadly şowsuzlyklardan we "öz-DDoS" -den goraýar. Dogry wagtlar we çäkler bilen utgaşmak SLO-ny saklaýar, guýruk gijikdirmelerini we "dokuzlaryň" bahasyny durnuklaşdyrýar.

2) Esasy ýörelgeler

Ilki wagt, soň retralar, soňra Circuit Breaker.
Diňe idempotent amallary retraim (GET, idempotent açary bolan howpsuz POST/PUT).
Retraýlaryň býudjetini bölüň: marşrut üçin başlangyç RPS-den 10-15% ≤.
Şowsuzlygy lokallaşdyryň: bulkhead (aýratyn howuzlar/kwotalar) + rate-limit.
Pese gaçanda - çalt şowsuzlyk (fil-fast), graceful-degradation/bug.

3) Retraýlaryň semantikasy

Haçan yza süýşürmeli

Geçiş ýalňyşlyklary: timeouts, 5xx, tor elýeterliligi, 429 ('Retry-After' -den soň).
Retro edip bolmaz: aç-açan iş ýalňyşlyklary (4xx ≠ 429), idempotentlik bolmazdan side-effects (açarsyz töleg).

Strategiýalar

Exponential backoff + jitter (doly ýa-da birmeňzeş): retraý sürülerini tekizleýär.
Max attempts: 1-2 (seýrek 3) - köplenç has zyýanly.
Budget: hyzmat we per-request "retry tokens" üçin global retraew/sek hasaplaýjy.
Hedging (seýrek): t-kwantilinden (p95) soň soragyň parallel dubly - diňe berk idempotent okamak üçin.

Psevdokod backoff + jitter:
python base = 100 # ms for attempt in range(1, max_attempts+1):
try:
return call()
except Transient as e:
if attempt == max_attempts: raise sleep_ms = min(cap_ms, base 2(attempt-1))
sleep(random(0, sleep_ms)) # full jitter

4) Wagtlar we "çalt şowsuzlyk"

Client timeout <upstream timeout: "zombi" soraglaryny toplamazlyk üçin.
Делите: connect timeout, read timeout, overall deadline.
Tail-aware wagtlary: p95/p99 + -y nyşana alýarys.
Umumy möhleti ulanyň (mysal üçin, gRPC 'deadline') we zynjyryň aşagyna zyňyň.

5) Circuit Breaker: nähili işleýär

Ýagdaýlary:
  • Closed: traffigi sypdyrýar, ýalňyşlyklary/gizlinligi sanaýar.
  • Açyk: Derrew şowsuzlyk (ýa-da ätiýaçlyk jogap) berýär.
  • Half-Open: barlag soraglary; üstünlikli bolsa - ýapylýar.
Açyş bosagasy:
  • Hatalar/wagtlar N haýyş/sekunt penjiresi üçin X% -den ýokary ýa-da p99 bosagadan ýokary.
  • Degişli süýşýän statistika we iň az göwrümi (mysal üçin, 50 soraga ≥).

6) Bulkhead, kwotalar we "bölüň we höküm sürüň"

Per-upstream we per-fiç birleşmeleriniň aýratyn pullary.
In-flight soraglaryna kwotalar; artykmaç - çalt ret etmek.
Ýetmezçilik edilende - pes ileri tutulýan fiç (feature flags).

7) Perimetr bilen integrasiýa (Envoy/Istio/Nginx)

Envoý (retry + outlier + CB, ideýa):
yaml routes:
- match: { prefix: "/api" }
route:
cluster: upstream_api timeout: 2s retry_policy:
retry_on: "connect-failure,reset,retriable-4xx,5xx"
num_retries: 2 per_try_timeout: 600ms retry_back_off: { base_interval: 100ms, max_interval: 800ms }
hedge_policy:
hedge_on_per_try_timeout: true initial_requests: 1 additional_request_chance: { numerator: 5, denominator: HUNDRED } # 5%
clusters:
- name: upstream_api circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 500 max_requests: 1000 max_retries: 200 outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s max_ejection_percent: 50
Istio (VirtualService fault/retry, gysgaça mysal):
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService spec:
hosts: ["payments"]
http:
- route: [{ destination: { host: payments } }]
timeout: 2s retries:
attempts: 2 perTryTimeout: 600ms retryOn: "5xx,connect-failure,refused-stream,reset"
Nginx Ingress:
yaml nginx. ingress. kubernetes. io/proxy-connect-timeout: "2"
nginx. ingress. kubernetes. io/proxy-read-timeout: "2"
nginx. ingress. kubernetes. io/proxy-next-upstream: "error timeout http_502 http_503 http_504"
nginx. ingress. kubernetes. io/proxy-next-upstream-tries: "2"

8) Kitaphanalar we kod (stek-snippetler)

Java (Resilience4j):
java var cb = CircuitBreaker. ofDefaults("psp");
var retry = Retry. of("psp-retry",
RetryConfig. custom()
.maxAttempts(2)
.waitDuration(Duration. ofMillis(200))
.intervalFunction(IntervalFunction. ofExponentialRandomBackoff(100, 2. 0, 0. 5) )//jitter
.retryExceptions(SocketTimeoutException. class, IOException. class)
.build());

Supplier<Response> decorated =
CircuitBreaker. decorateSupplier(cb,
Retry. decorateSupplier(retry, () -> client. call()));

return Try. ofSupplier(decorated)
.recover(BusinessException. class, fallback())
.get();
Go (context deadline + backoff):
go ctx, cancel:= context. WithTimeout(context. Background(), 2time. Second)
defer cancel()
var lastErr error for i:= 0; i < 2; i++ {
reqCtx, stop:= context. WithTimeout(ctx, 600time. Millisecond)
lastErr = call(reqCtx)
stop()
if lastErr == nil { break }
sleep:= time. Duration(rand. Intn(1<<uint(7+i))) time. Millisecond // full jitter time. Sleep(min(sleep, 800time. Millisecond))
}
if lastErr!= nil { return fastFail() }
Node. js (got + p-retry):
js import pRetry from 'p-retry';
await pRetry(() => got(url, { timeout: { connect: 500, request: 2000 } }), {
retries: 2,
factor: 2,
randomize: true,
minTimeout: 100,
maxTimeout: 800,
onFailedAttempt: e => { if (isBusiness(e)) throw e; }
});

9) Retraýlaryň we SLO-laryň býujeti

Retry tokens giriň: her retrai tokeni sarp edýär; howuz çäklidir.
Error-budget bilen baglanyşdyryň: bosagadan ýokary burn-rate - retraýalary öçürýäris, CB ýygy-ýygydan açýarys, zaýalanmagy açýarys.
Kanar relizleri: kanareýalarda synanyşyklary we bellikleri azaldyň.

10) Hedging (seresap)

P95 möhletinden soň, ýeňilenden soň goşmaça soragy başla.
Diňe okamak we "howpsuz" idempotent amallary üçin; paýyňyzy çäklendiriň (1-5% ≤).
Akymdaky ýüküň ýokarlanmagyna gözegçilik ediň.

11) Gözegçilik etmek

Rate, Error, Duration (p50/p95/p99).
CB-metrikler: ýagdaýy (açyk/half-açyk), açyş ýygylygy, sypdyrylan/ret edilen soraglar.
Retrailer: attempts/request, retry-rate, ýakylan tokenler.
Perimetri: outlier-ejection, ejection-rate.
Trainler: 'retry _ attempt', 'cb _ state', 'hedged = true', 'trace _ id' -ni atyň.

12) Binagärlik bilen integrasiýa

Her bir möhüm akym üçin Bulkhead + CB.
Nobatlar/asinxron: däli wagtlaryň ýerine uzak amallar üçin.
Kache/bug: fil-open-da kritiki däl aýratynlyklar üçin.
Awtoskeýl: erbet retraýalaryň öwezini dolmaýar - ilki bilen "tupany" duruzyň.

13) Anti-patternler

Taýmautsyz retraýlar → "asylan" konnektler we howuzlaryň tükenmegi.
Indempotent däl amallaryň gaýtalanmagy (goşa hasapdan çykarmak).
Kapsyz we jittersiz tükeniksiz eksponensial ösüş.
Ähli akymlarda bir CB → näsazlygy tutuş önüme sürüklemek.
Üns bermezlik 429/' Retry-After '.
Müşderiniň wagtlary akymyňkydan has uzyn (ýa-da asla).
Iş ýalňyşlyklaryny retraýalar bilen bejermek.

14) Giriş çek-sanawy (0-30 gün)

0-7 gün

Marşrutlary we olaryň gidişligini kesgitläň.
Wagtlary belläň (connect/read/overall), iň az retraýlary açyň (× 1) we CB.
Esasy akymlar üçin howuzlary/kwotalary bölüň.

8-20 gün

Jitterleri we retrairleriň global býudjetini, retry-rate boýunça aladalary goşuň.
Perimetrde outlier-ejection sazlaň, low-prio fich üçin çalt şowsuzlyk.
Daşbordlar RED + CB/Retry, bellikli söwdalar.

21-30 gün

Retraýlaryň kanar profilleri (az synanyşyk), game-day "apstrim haýal/flaps".
Syýasaty resminamalaşdyryň: kim/näme retrait, çäkler, kadadan çykmalar.
p95/p99 we wagtlary göz bilen däl-de, maglumatlar boýunça gözden geçiriň.

15) Kämillik ölçegleri

Marşrutlaryň 100% -iniň taýmautlary we dokumentleşdirilen retraý/SW syýasaty bar.
Retry-rate býudjetine laýyk gelýär (10-15% ≤), hadysalarda bökdençlikler ýok.
CB tutuş howuz ýykylmanka işleýär; kaskad şowsuzlyklary ýok.
Söwdalar/hedging synanyşyklaryny görkezýär; p99 iň ýokary derejelerde durnukly.
Kanar relizleri retraýlaryň "seresaply" profilini ulanýarlar.

16) Konfigurasiýalaryň gysga mysallary

Resilience4j YAML (Spring Boot, идея):
yaml resilience4j:
circuitbreaker:
instances:
psp:
slidingWindowType: COUNT_BASED slidingWindowSize: 100 minimumNumberOfCalls: 50 failureRateThreshold: 50 waitDurationInOpenState: 30s permittedNumberOfCallsInHalfOpenState: 5 retry:
instances:
psp:
maxAttempts: 2 waitDuration: 200ms enableExponentialBackoff: true exponentialBackoffMultiplier: 2. 0 retryExceptions:
- java. net. SocketTimeoutException
- java. io. IOException
Envoy rate-limit (pikir bölegi):
yaml rate_limits:
- actions:
- generic_key: { descriptor_value: "api. payments" }

17) Netijenama

Durnuklylyk - bu tertip: wagt → retrailer (jitter we býudjet bilen) → Circuit Breaker + bulkhead/kwotalar we çalt şowsuzlyk. Perimetri düzüň (outlier-ejection), RED/CB/Retry dashbordlaryny asyň, idempotentlik syýasatyny düzüň we iş SLI-ni ýatdan çykarmaň. Şonda gysga şowsuzlyklar göze ilmez we hakyky hadysalar kaskad ýykylmagyna öwrülmez.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Telegram
@Gamble_GC
Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.