اتمام وقت и کنترل مدار
1) چرا شما به آن نیاز دارید
سیستم ها از یک شکست «کشنده» سقوط نمی کنند، بلکه از تجمع تاخیر و «موج» رد می شوند. زمانبندی زمان انتظار را محدود می کند و منابع را آزاد می کند و کنترل مدار (قطع کننده + ریختن + رقابت تطبیقی) مانع از تخریب در امتداد زنجیره وابستگی می شود. هدف این است که p95/p99 در مرزهای هدف حفظ شود و در دسترس بودن برای شکست های جزئی حفظ شود.
2) تعاریف اساسی
2. 1 انواع وقفه (L7/L4)
Connect timeout: برقراری ارتباط TCP/TLS
TLS/Handshake timeout - دست دادن TLS/HTTP2 مقدمه.
Write timeout - ارسال یک درخواست (از جمله یک بدن).
خواندن timeout - منتظر اولین بایت پاسخ و/یا کل بدن است.
Idle/Keep-Alive timeout - اتصال غیر فعال.
مهلت کلی - مهلت «سخت» برای کل درخواست (پایان به پایان).
2. 2 بودجه مهلت
هدف را انتخاب کنید «deadline _ total» و تقسیم بر مراحل:- 'ورود (دروازه) + authZ + برنامه + DB/کش + PSP خروجی'.
- دروازه: 30 میلی ثانیه،
- کاربرد: 120 میلی ثانیه،
- DB: 120 میلی ثانیه،
- PSP: 100 میلی ثانیه،
- حاشیه: 30 میلی ثانیه.
2. ۳ انتشار و لغو
'deadline '/' timeout' باید به زنجیره منتقل شود (context, headers, gRPC deadline). در انقضا - لغو عملیات پس زمینه (لغو/ctx لغو), قفل/semaphores روشن.
3) استراتژی های تنظیم زمان
1. بالا به پایین: بر اساس SLO و p95 - تعیین مهلت پایان به پایان، و سپس به زیر تقسیم می شود.
2. شناسایی مسیرهای «گران» (دانلود فایل، گزارش، PSPs خارجی) - فرد دیگر، اما محدود است.
- idempotent (GET/تکرار وضعیت) - کوتاه تر، تهاجمی تر ؛
- نوشتن/پولی - کمی طولانی تر، اما با یک تکرار واحد و idemotency.
4. فارغ التحصیلی توسط برنامه ها/مستاجران (شرکت می تواند زمان طولانی تر، اما موازی کمتر).
4) قطع کننده مدار: مدل ها و پارامترها
4. 1 سیاست های راه اندازی
نرخ شکست - میزان خطا ≥ X٪ در پنجره پرس و جو/زمان N.
شکستهای متعاقب: M شکستهای متوالی.
نرخ تماس آهسته - نسبت تماس های طولانی تر از آستانه T.
کلاس های خطا: timeouts/5xx/connection-reset → «fatal», 4xx - را به حساب نمی.
4. 2 شرایط
بسته - پرش همه چیز، جمع آوری آمار.
باز - شکست فوری (موجب صرفه جویی در منابع، وابستگی را سرکوب نمی کند).
نیمه باز - «نمونه» کوچک (N درخواست) برای «آزمایش آب».
4. 3 اضافات مفید
Bulkhead: مجموعه ای از موضوعات/اتصالات در هر وابستگی به طوری که فرد همه چیز را «از بین نمی برد».
همزمانی تطبیقی: محدودیت همروندی خودکار (الگوریتمهای مشابه AIMD/Vegas) توسط تأخیر مشاهده شده.
کاهش بار: خرابی/تخریب زودهنگام در صورت کمبود منابع محلی (صف، CPU، مکث GC).
5) تعامل: وقفه، عقب نشینی، محدودیت
اولین مهلت، پس از آن retray: هر تکرار باید به یک مهلت مشترک متناسب باشد.
عقب نشینی + jitter برای تکرار ؛ احترام به «Retry-After» و بودجه مجدد تلاش کنید.
محدود کردن نرخ: با باز کردن شکن - محدودیت های پایین تر به طوری که طوفان را تشدید نمی کند.
Idempotency: اجباری در عملیات نوشتن (برای جلوگیری از طول می کشد با «گنگ» وقفه).
که در آن به عقب نشینی: ترجیحا در لبه (مشتری/دروازه) به جای عمیق در داخل.
6) ارزش هدف عملی (معیار)
Public read API: end-to-end '200-500 ms', خواندن timeout '100-300 ms'.
نوشتن انتقادی (پرداخت): 300-800 ms 'e2e ؛ PSP خارجی ≤ «250-400 میلی ثانیه».
اتصال/TLS: '50-150 ms' (بیشتر - مشکل شبکه/لحیم کاری).
بیکار: 30-90 ثانیه (مشتریان تلفن همراه - کوتاه تر برای صرفه جویی در باتری).
مقادیر را برای p95/p99 و مناطق تنظیم کنید.
7) پیکربندی ها و نمونه ها
7. 1 نماینده (خوشه + مسیر، شبه)
yaml clusters:
- name: payments_psp connect_timeout: 100ms type: STRICT_DNS lb_policy: ROUND_ROBIN circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 2000 max_requests: 2000 max_retries: 50 outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s max_ejection_percent: 50
routes:
- match: { prefix: "/api/v1/payments" }
route:
cluster: payments_psp timeout: 350ms # per-request deadline idle_timeout: 30s retry_policy:
retry_on: "reset,connect-failure,refused-stream,5xx,gateways"
num_retries: 1 per_try_timeout: 200ms
7. 2 NGINX (محیط)
nginx proxy_connect_timeout 100ms;
proxy_send_timeout 200ms; # write proxy_read_timeout 300ms; # read (первый байт/все тело)
keepalive_timeout 30s;
send_timeout 15s;
Быстрый отказ при перегрузке limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 50;
7. 3 gRPC (مشتری، Go-pseudo)
go ctx, cancel:= context.WithTimeout(context.Background(), 350time.Millisecond)
defer cancel()
resp, err:= client.Pay(ctx, req) // Deadline передается вниз
7. 4 مشتری HTTP (برو)
go client:= &http.Client{
Timeout: 350 time.Millisecond, // общий дедлайн на запрос
Transport: &http.Transport{
TLSHandshakeTimeout: 100 time.Millisecond,
ResponseHeaderTimeout: 250 time.Millisecond,
IdleConnTimeout: 30 time.Second,
MaxIdleConnsPerHost: 100,
},
}
7. 5 Resilience4j (جاوا، شبه)
yaml resilience4j.circuitbreaker.instances.psp:
slidingWindowType: TIME_BASED slidingWindowSize: 60 failureRateThreshold: 50 slowCallDurationThreshold: 200ms slowCallRateThreshold: 30 permittedNumberOfCallsInHalfOpenState: 5 waitDurationInOpenState: 30s
resilience4j.timelimiter.instances.psp:
timeoutDuration: 350ms
8) قابلیت مشاهده و هشدار
8. 1 معیارها
'http _ client _ requests {endpoint, status}', 'client _ latency _ bucket'
8. 2 مسیرهای پیاده روی
دهانه: ورود → رسیدگی → DB/Redis → خارجی.
ویژگی ها: «timeout _ ms _ target»، «circuit _ state»، «queue _ time _ ms».
نمونه ها: قله های p99 را به شناسه ردیابی خاص گره بزنید.
8. 3 هشدار
'p99 _ latency {critical}'> هدف X دقیقه در یک ردیف است.
'timeout _ rate {dependency}' پرش> Y%.
انتقال مکرر به «باز »/« فلاپ» شکن.
رشد 'shed _ requests _ total' با CPU/GC بالا.
9) همزمانی تطبیقی و کاهش بار
9. ایده های 1
اتوماسیون موازی را کاهش می دهد به عنوان دم تاخیر رشد:- AIMD: به آرامی افزایش می یابد، به شدت کاهش می یابد.
- وگاس مانند: نگه داشتن زمان صف.
- توکن محور: هر درخواست توکن را «میسوزاند» ؛ توکن ها بر اساس سرعت اندازه گیری شده صادر می شوند.
9. 2 پیاده سازی
سمافورهای محلی در هر مسیر ؛ هدف این است که «queue _ time» را زیر آستانه نگه دارید.
«فیوز» جهانی (RPS حاشیه ای/رقابتی) در دروازه.
اگر کمبود CPU/اتصالات وجود دارد، شکست زود هنگام قبل از اجرای منطق (429/503 با 'Retry-After').
10) سناریوهای تست و هرج و مرج
تزریق تاخیر: به طور مصنوعی 50-300 میلی ثانیه در هر وابستگی اضافه کنید.
از دست دادن بسته/dup/drop (tc/tbf، Toxiproxy).
چرخش دستگیره: کاهش استخرهای اتصال، افزایش بار به اشباع.
کشتن/تخریب یک منطقه/شارد (عدم دسترسی جزئی).
چک: «شکست» طوفان retray نیست; شکن باز می شود قابل پیش بینی ؛ آیا صف در حال رشد است ؟
11) ضد گلوله
یک جهانی «خواندن زمان» بدون جزئیات اتصال/TLS/در هر مرحله.
فقدان یک مهلت مشترک → بازپرداخت فراتر از SLO است.
Retray بدون لرزش و بدون تلاش مجدد بودجه.
اتصالات «ابدی» بدون وقفه بیکار → توصیفگرهای نشت.
Breaker 4xx را به عنوان اشتباهات مرگبار شمارش می کند.
بدون لغو/لغو → کار پس زمینه پس از اتمام وقت مشتری ادامه می یابد.
وقفه ها برای شبکه های موبایل/ناپایدار بسیار طولانی هستند.
12) مشخصات iGaming/امور مالی
نوشتن بحرانی (سپرده ها/خروجی ها): یک تکرار کوتاه با Idempotency-Key، سپس '202 Accepted' + نظرسنجی به جای انتظارات بی نهایت.
PSP/بانکداری: سیاست های جداگانه توسط ارائه دهنده/منطقه (برخی از کندتر).
پرداخت های مسئول و محدودیت ها: برای قفل/بررسی - سریع '423/409'، معاملات «حلق آویز» کشش نیست.
گزارش/تجمع - اجرا به صورت ناهمگام (دسته ای + منابع وضعیت).
13) تولید لیست آمادگی
- پایان دادن به پایان مهلت مسیر بحرانی (GET/POST) تعریف شده است.
- بودجه توسط مرحله ؛ انتشار مهلت فعال شده است.
- اتصال/TLS/خواندن/نوشتن/idle پیکربندی در دروازه و مشتریان.
- قطع کننده مدار با آستانه نرخ شکست و تماس آهسته ؛ منطق نیمه باز
- Bulkheads در وابستگی ؛ محدودیتهای همروندی در هر مسیر
- ریختن بار قبل از منطق کسب و کار در طول اضافه بار اجرا می شود.
- ادغام با عقب نشینی: عقب نشینی + jitter، تلاش مجدد بودجه، احترام 'تلاش-پس از'.
- Idempotency نوشتن، 'Idempotency-کلید' و صندوق خروجی برای رویدادها.
- معیارها: timeout/slow-call/breaker/queue time/رقابتی.
- آزمون هرج و مرج: تزریق تاخیر/زیان/شکست، تخریب مناطق.
- مستندات مشتری: زمان بندی نمونه، کدهای پاسخ، راهنمایی های پخش.
14) TL ؛ دکتر متخصص
به هر درخواست یک مهلت سخت بدهید، آن را در مراحل مختلف ترتیب دهید و آن را در زنجیره گسترش دهید. مدیریت گسل از طریق قطع کننده مدار + bulkheads + همزمانی تطبیقی + ریختن بار. تکرار - تنها در مهلت، با jitter و بودجه ؛ نوشتن - فقط idempointent. اندازه گیری زمان وقفه/تماس آهسته، حالت شکن و «queue _ time»، به طور منظم آزمون های هرج و مرج را اجرا کنید.