GH GambleHub

قطع کننده مدار و عقب نشینی

قطع کننده مدار و Retrai

1) چرا شما به آن نیاز دارید

شبکه ها غیر قابل اعتماد هستند: تاخیر به وجود می آید، گره ها سقوط می کنند، محدودیت ها به دست می آیند. Retrays از خرابی های کوتاه مدت نجات می یابد و Circuit Breaker سیستم را از خرابی های آبشار و خود DDoS محافظت می کند. ترکیب با زمانبندی و محدودیت های صحیح، SLO را حفظ می کند، تاخیر دم و قیمت «nines» را تثبیت می کند.

2) اصول اساسی

اول وقفه، بعد عقب نشینی، بعد قطع کننده مدار.
تنها عملیات idempotent Retraim (GET، POST امن/PUT با کلید idempotent).
اختصاص بودجه بازپرداخت: ≤ 10-15٪ از RPS اصلی در هر مسیر.
محلی سازی شکست: bulkhead (استخر جداگانه/سهمیه) + نرخ محدود.
در طول تخریب - شکست سریع (شکست سریع)، برازنده-تخریب/خرد.

3) معناشناسی Retray

هنگامی که به عقب نشینی

خطاهای گذرا: وقفه، 5xx، در دسترس نبودن شبکه، 429 (پس از 'Retry-After').
شما نمی توانید رد کنید: خطاهای کسب و کار واضح (4xx ≠ 429)، عوارض جانبی بدون idempotence (پرداخت بدون کلید).

استراتژی ها

backoff نمایی + jitter (کامل و یا حتی): صاف کردن swarms از retraces.
حداکثر تلاش: 1-2 (به ندرت 3) - بیشتر معمولا مضر است.
بودجه: شمارنده جهانی retray/ثانیه در هر سرویس و هر درخواست «نشانه های مجدد».
هجینگ (نادر): دو برابر موازی درخواست پس از t-quantle (p95) - فقط برای خواندن دقیق idempotent.

بازپرداخت شبه کد + لرزش:
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) وقفه و «شکست سریع»

Client timeout <upstream timeout: برای اینکه درخواستهای «زامبی» انباشته نشوند.
Делите: اتصال زمان، خواندن زمان، مهلت کلی.
Tail-aware timeout: هدف برای p95/p99 + حاشیه کوچک است.
از یک فیلد مهلت مشترک استفاده کنید (به عنوان مثال، مهلت gRPC) و آن را در زنجیره قرار دهید.

5) قطع کننده مدار: چگونه کار می کند

کشورها:
  • بسته: ترافیک را عبور می دهد، خطاها/تاخیر را شمارش می کند.
  • باز: بلافاصله امتناع سریع (یا پاسخ اضافی) می دهد.
  • نیمه باز: نمایش داده شد تست ؛ اگر موفق شود، بسته می شود.
آستانه باز کردن:
  • خطاها/زمانهای بیش از X٪ در هر پنجره N درخواست/ثانیه یا p99 بالاتر از آستانه.
  • آمار نورد و حداقل حجم مربوطه (به عنوان مثال، ≥ 50 نمایش داده شد).

6) Bulkhead، سهمیه و تقسیم و تسخیر

استخرهای جداگانه اتصالات هر بالادست و هر ویژگی.
سهمیه برای درخواست در پرواز ؛ زائد - امتناع سریع.
در صورت کمبود - تخریب پرچم های ویژگی.

7) ادغام محیط (نماینده/Istio/Nginx)

نماینده (تلاش مجدد + outlier + CB، ایده):
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/تلاش مجدد، مثال فشرده):
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 ورود (حاشیه نویسی):
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) کتابخانه ها و کد (قطعه پشته)

جاوا (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 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() }
گره ها 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) بودجه Retray و SLO

نشانه های مجدد را تایپ کنید: هر retray یک نشانه را صرف می کند ؛ استخر محدود است.
با بودجه خطا همراه شوید: اگر نرخ سوختن بالاتر از آستانه باشد، retrays را خاموش کنید، CB را بیشتر باز کنید، تخریب را روشن کنید.
انتشار قناری: در قناری ها، تلاش ها و نشانه ها را کاهش دهید.

10) هجینگ (احتیاط)

اجرای یک درخواست اضافی پس از مهلت p95، لغو بازنده.
فقط برای خواندن و عملیات «ایمن» idemotent ؛ محدود کردن سهم (≤ 1-5٪).
مراقب افزایش بار در بالادست باشید.

11) قابلیت مشاهده

معیارهای RED در طول مسیر: نرخ، خطا، مدت زمان (p50/p95/p99).
معیارهای CB: وضعیت (باز/نیمه باز)، نرخ باز شدن، درخواست های از دست رفته/رد شده.
Retrays: تلاش/درخواست، نرخ مجدد، نشانه های سوخته.
محیط: خروجی خارجی، نرخ تخلیه.
Traces: annotate 'retry _ attempt', 'cb _ state', 'hedged = true', cast 'trace _ id'.

12) ادغام معماری

Bulkhead + CB برای هر بالادست بحرانی.
صف/asynchron: برای عملیات طولانی به جای زمان دیوانه.
Cache/stubs: برای ویژگی های غیر بحرانی زمانی که شکست باز است.
Autoscale: عقب نشینی های بد را جبران نمی کند - ابتدا طوفان را متوقف کنید.

13) ضد الگوهای

Retrays بدون timeouts → اتصالات یخ زده و تخلیه استخر.
تکرار معاملات غیر idemotent (دو نوشتن).
رشد نمایی بی نهایت بدون کلاه و jitter.
یک CB تنها به تمام بالادست → کشیدن و رها کردن شکست به کل محصول.
نادیده گرفتن 429/« تلاش مجدد پس از ».
اتمام وقت مشتری طولانیتر از بالادست است (یا اصلاً نیست).
«درمان» خطاهای کسب و کار با retras.

14) چک لیست پیاده سازی (0-30 روز)

0-7 روز

شناسایی مسیرها و idemotency خود را.
تنظیم زمان (اتصال/خواندن/به طور کلی)، فعال کردن حداقل retrays (× 1) و پیش فرض CB.
استخرها/سهمیه ها (bulkhead) را برای بالادست اصلی جدا کنید.

8-20 روز

شامل لرزش و بودجه جهانی retray، هشدار مجدد نرخ.
پیکربندی outlier-ejection در محیط، شکست سریع برای ویژگی های کم prio.
داشبورد RED + CB/Retry، مسیرهای برچسب گذاری شده.

21-30 روز

Canary retray profiles (تلاش کمتر), game-day «upstream slow/flaps».
سیاست سند: چه کسی/چه چیزی retraces، محدودیت ها، استثنائات.
بررسی p95/p99 و وقفه با توجه به داده ها، نه با چشم.

15) معیارهای بلوغ

100٪ از مسیرها دارای زمانبندی هستند و سیاست بازپرداخت/NE را مستند کرده اند.
نرخ تلاش مجدد متناسب با بودجه (≤ 10-15٪)، هیچ سنبله در حوادث وجود دارد.
CBs آتش قبل از کل استخر سقوط ؛ هیچ شکست آبشار.
مسیرهای پیاده روی نشان می دهد تلاش/مصون سازی; P99 در قله ها پایدار است.
انتشارات قناری از نمایه retray «دقیق» استفاده می کند.

16) نمونه پیکربندی کوتاه

Resilience4j YAML (بهار بوت، идея):
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
حد مجاز نماینده (قطعه ایده):
yaml rate_limits:
- actions:
- generic_key: { descriptor_value: "api. payments" }

17) نتیجه گیری

پایداری یک رشته است: timeouts → عقب نشینی (با لرزش و بودجه) → قطع کننده مدار + دیوار/سهمیه و رد سریع. راه اندازی یک محیط (outlier-ejection)، قطع داشبورد RED/CB/Retry، رفع سیاست idempointency و در مورد SLI کسب و کار را فراموش نکنید. سپس شکست های کوتاه مدت نامرئی باقی خواهند ماند و حوادث واقعی به سقوط آبشار تبدیل نخواهند شد.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

Telegram
@Gamble_GC
شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.