سیاست های مجدد و عقب نشینی
تکرارها به زنده ماندن موقت کمک می کنند، اما اگر نادرست پیکربندی شوند، باعث ایجاد بهمن ترافیک، تکرار عملیات و سقوط آبشار می شوند. یک سیاست قابل اعتماد retray همیشه با مهلت/زمان بندی شروع می شود، به حساب idempotency طول می کشد و با استفاده از عقب نشینی + jitter.
1) اصول اساسی
1. اولین وقفه/مهلت، پس از آن عقب نشینی. تکرار بدون محدودیت زمانی فقط شکست را طولانیتر میکند.
2. Retray - فقط برای عملیات ایمن/idempotent. برای موارد ناامن - از طریق کلید های idemotency و تضمین های معامله.
3. عقب نشینی اجباری است. نمایی یا GCRA مانند با لرزش به desynchronize امواج.
4. تعداد تلاش ها و زمان کل بودجه را محدود کنید. SLO کاربران را ترک نکنید.
5. به سیگنال های زیرساختی احترام بگذارید. '429/503' + 'Retry-After'، وضعیت قطع کننده مدار، محدودیت صف.
2) مدت زمان و مهلت (انتشار مهلت)
Request timeout <SLO service, deadline در پایین زنجیره منتشر می شود (HTTP headers/gRPC context).
ترکیب اتمام وقت: مجموع (اولین تلاش + برگشت + بعدی) ≤ مهلت کاربر.
وقفه های مختلف برای خواندن/ضبط: پرونده ها کوتاه تر و سخت تر هستند ؛ خواندن اجازه می دهد هجینگ.
3) Idempotency و تکرار ایمن
خواندن (GET/idempotent RPC): با خیال راحت با «5xx»، «UNAVAILABLE»، زمان بندی شبکه تکرار می شود.
سوابق:- استفاده از «Idempotency-Key» (HTTP) یا درخواست-ID در مرز ؛ سرور باید deduplicate کند.
- نوشتن کنترل idempotent: «upsert», «حداقل یک بار» + جبران (حماسه).
- پرداخت های خارجی/تسویه حساب - فقط با کلید های idemotent و ورود به سیستم معامله.
4) الگوریتم های پشتیبان گیری
نمایی: 'پایه 2 ^ تلاش'، محدود شده توسط 'max _ backoff'.
تزئین Jitter (کامل/لرزش برابر) - تصادفی در محدوده به desynchronize مشتریان.
GCRA/Token-Bucket مانند تاخیر: مطابق با محدودیت نرخ.
Borders: 'initial _ backoff' (50-200 ms خوانده می شود ؛ سوابق 200-500 میلی ثانیه)، 'max _ backoff' (1-5 ثانیه)، 'max _ elapsed' (به عنوان مثال، 3-10 ثانیه).
الگوی توصیه شده بازگشتی نمایی + jitter کامل است.
5) تکرار/عدم تکرار سیاست های تصمیم گیری
تکرار می کنیم در:- خطاهای شبکه/زمان بندی، «429» (با احترام «Retry-After»)، «نرم» «5xx» («502/503/504»)، gRPC «UNAVAILABLE/DEADLINE _ EXCESSED».
- '4xx' (به جز '409/429/408' در برخی از حالات), خطاهای کسب و کار, '401/403', خطاهای اعتبار سنجی, صریح 'DoNotRetry' flag.
- '409 Conflict' - گاهی اوقات با تاخیر پس از اجماع/قفل تکرار می شود.
- '404' برای خواندن دائمی سازگار - یک یا دو بار retray با عقب نشینی کوچک.
6) کلاه همزمانی و «طوفان retray»
محدود کردن بازپرداخت همزمان در هر مشتری/در هر مستاجر/در هر نقطه پایانی.
محدودیت کل تلاش در هر درخواست (به عنوان مثال،. 2-3).
از طریق کنترل پذیرش، نقاط پایانی داغ را کاهش دهید تا صف ها را افزایش ندهید.
7) تعامل با قطع کننده مدار و محدودیت ها
اگر CB باز باشد، به طور مستقیم انجام نمی شود - به عقب برگردید یا منتظر نمونه های نیمه باز باشید.
در '429' - احترام 'Retry-After' ؛ اگر نه، از «نرم» استفاده کنید.
Retrays می تواند فشار را افزایش دهد ؛ آستانه های تطبیقی را اعمال کنید («max _ attempts» پایین تر برای یک حادثه).
8) پروتکل ها و قراردادها
وب سایت ها
کد ها: «408/429/5xx».
عنوان ها: «Retry-After»، خانواده «RateLimit-»، «Idempotency-Key»، «Request-Id».
مشتری باید «X-Request-Timeout »/« Deadline-At» را ارسال کند (اگر چنین است).
gRPC
استفاده از زمینه با یک مهلت ؛ احترام 'UNAVAILABLE', 'DEADLINE _ EXCEEDED', retray policies per method.
برای RPC های idempotent، شامل retrays ؛ برای جهش - تنها با حمایت idemotency.
9) صف، وظایف پس زمینه و ادغام
گردانندههای حداقل یک بار → کنشهای idempotent، تقسیم کلید.
صف تأخیر برای برگشت بین تلاش ها (به عنوان مثال، 5s/30s/2m).
صف نامه مرده (DLQ) با محدودیت تلاش و پردازش دستی.
Outbox/CDC - به طوری که تکرار یکپارچگی معامله را به خطر نمی اندازد.
10) مصون سازی در مقابل تلاش
هجینگ برای خواندن بسیار مهم در تأخیر دم مفید است.
محدودیت: بیش از X٪ از درخواست ها، تاخیر شروع گریس (به عنوان مثال، تاخیر p95)، لغو بازنده.
از hedging برای نوشتن عملیات بدون idempotency قوی استفاده نکنید.
11) تله متری و مشاهده پذیری
Теги: 'tenant _ id', 'endpoint', 'attempt', 'decision' (retry/skip), 'reason', 'backoff _ ms', 'deadline _ ms', 'idempotency _ key'.
معیارها: سهم عقب نشینی، موفقیت پس از عقب نشینی، p95/p99 «پایان به پایان»، تعداد مهلت های بیش از حد، تحریک CB.
سیاهههای مربوط به حسابرسی: بالا N «پر سر و صدا» کلید/endpoints، همبستگی با 429/503.
12) آزمایش و هرج و مرج
پروفایل ها: «اره» (پشت سر هم)، «طوفان» (زمان های جرم)، خطاهای «چسبنده» (هر Nth)، دم های تأخیر.
Torus limiter/cache/queue failures, clock-skew.
بررسی می کند که کل مدت زمان (تلاش + تلاش) متناسب با SLO است.
13) شبه کد سیاست
pseudo handle(req, deadline):
attempt = 0 backoff = initial()
while attempt < MAX_ATTEMPTS and now() < deadline:
attempt += 1 with timeout(per_attempt_timeout(deadline, attempt)):
try:
resp = call(req)
if isRetryableStatus(resp): raise Retryable(resp. status)
return resp except Retryable as e:
if circuit. isOpen(dep) or! isIdempotent(req): break sleep(jitter(backoff))
backoff = min(exp(backoff), MAX_BACKOFF)
except NonRetryable:
break return fail_or_fallback(req)
14) قالب پیکربندی (مثال)
yaml retries:
default:
max_attempts: 3 initial_backoff_ms: 150 max_backoff_ms: 2000 strategy: exponential_full_jitter respect_retry_after: true per_attempt_timeout_fraction: 0. 4 # 40% of remaining deadline hedging:
enabled: false read_heavy:
max_attempts: 4 initial_backoff_ms: 80 max_backoff_ms: 1200 hedging:
enabled: true start_after_p95_ms: 300 max_extra_requests_ratio: 0. 05 write_strict:
max_attempts: 2 initial_backoff_ms: 250 max_backoff_ms: 1000 idempotency_required: true
limits:
concurrent_retries_per_tenant: 100 concurrent_retries_per_endpoint: 20
15) چک لیست پیش فروش
- مهلت انتشار از طریق تماس ؛ مدت زمان ≤ SLO
- الگوریتم برگشت با لرزش ؛ پارامترهای تایید شده توسط آزمون بار.
- IDempotence: کلید/سیاهههای مربوط/جبران خسارت برای سوابق.
- سیاست های بازپرداخت برای خواندن و سوابق متفاوت است ؛ احترام به «تلاش دوباره پس از».
- رقابت مجدد و تعداد کل تلاش ها محدود است.
- ادغام با قطع کننده مدار و محدودیت سرعت پیکربندی شده است.
- تله متری: برچسب ها، معیارها، سیاهههای مربوط به دلیل ؛ داشبورد p95/p99، سهم موفقیت پس از بازپرداخت.
- تست «طوفان» و دم تاخیر، DLQ برای وظایف.
- مستندات مشتری: کدها/عناوین، نمونه های بازپرداخت و لغو.
16) خطاهای معمول
تکرار بدون وقفه/مهلت «انتظارات ابدی» است.
مکث ثابت بدون لرزش - امواج همزمان و خود خرابکاری DDoS.
Retrays سوابق ناامن بدون idempotency - تکراری و desynchronization.
نادیده گرفتن سیگنال های «Retry-After» و CB - افزایش حادثه.
تنگناها در صف به دلیل عدم وجود کلاه و کنترل پذیرش.
عدم تله متری از دلایل/راه حل های retrays - «پرواز کور».
17) دستور العمل های سریع
API عمومی می خواند: 3 تلاش، «اولیه = 100ms»، «حداکثر = 1S»، لرزش کامل، مصون سازی تا 5٪ از ترافیک.
سوابق بحرانی (پرداخت): 1-2 حداکثر تلاش, اتمام وقت دقیق, اجباری 'Idempotency-کلید', بدون مصون سازی.
یکپارچگی خارجی: احترام '429/Retry-After'، 'max _ attempts = 3'، 'max _ backoff = 2-5s'، محدودیت جریان خروجی.
وظایف پس زمینه: عقب ماندگی تاخیر (5s → 30s → 2m)، DLQ، کنترل کننده های بی نظیر.
نتیجه گیری
یک سیاست تکرار خوب، تعادل بین بهبود سریع و شکست کنترل شده است. مهلت ها، idempotence، عقب نشینی نمایشی با jitter، محدود کردن رقابت و احترام به سیگنال های زیرساخت، retrays را از «طوفان» به ابزاری برای بهبود قابلیت اطمینان و نگهداری SLO تبدیل می کند.