معماری تاخیر کم
چرا معماری تاخیر کم
تاخیر کم نه تنها «میانگین سریع» است، بلکه دم پایدار (p95/p99) تحت بار واقعی است. مسیر این است که بودجه تاخیر، نظم و انضباط صف/بازپرداخت، نزدیکی داده ها و حافظه پنهان، پروتکل ها/اتصالات صحیح و بهره برداری دقیق (محدودیت، مشاهده پذیری، تخریب) باشد.
اهداف تاخیر و بودجه
1. SLO را تعریف کنید: "p95 ≤ 120ms، p99 ≤ 250ms، ≤ خطا 0. 3%».
2. جمع آوری بودجه: مشتری → لبه → خدمات → stor → پاسخ.
- لبه مشتری: 15 میلی ثانیه
- منطقه لبه: 15 میلی ثانیه
- Gateway/L7: 10 میلی ثانیه
- خدمات کسب و کار: 40 میلی ثانیه
- ذخیره سازی/ذخیره سازی: 25ms
- موجودی/لرزش: 15 میلی ثانیه
متریک و دم
اندازه گیری p50/p90/p95/p99، از طریق و در هر هاپ.
شکستن برچسب ها: منطقه، روش، نسخه مشتری، نوع شبکه (تلفن همراه/پهنای باند)، اندازه بار.
بین زمان صف و زمان اجرا تمایز قائل شوید (قانون Little را ببینید: L = λ· W).
تکنیک های حساس به دم: درخواست های پرچین (به ندرت و با حفاظت)، ممنوعیت ردیابی آبشار.
شبکه و پروتکل ها
QUIC/HTTP/3: تلفات کمتر در تلفن همراه/رومینگ، multiplexing بدون سر از خط.
TLS 1. 3 و 0-RTT (فقط برای پرس و جوهای ایمن).
DNS: TTL کوتاه برای مسیرهای پویا، Anycast برای POP.
TCP: 'TCP _ NODELAY' (محتاطانه)، غیرفعال کردن اضافی 'Nagle '/' ACK تاخیر' در صورت توجیه ؛ زنده نگه داشتن و بازیابی سریع اتصالات.
gRPC/HTTP/2: چندگانه، کنترل جریان و تنظیمات پنجره ؛ اجتناب از فشرده سازی بیش از حد در بارهای کوچک.
اتصالات و استخر
استخرهای جداگانه توسط دامنه/مقصد (به طوری که «همسایگان آهسته» اسلات را دور نمی کنند).
گرم کردن/زنده نگه داشتن: حفظ تعداد ثابت اتصالات گرم.
ادغام اتصال (HTTP/2/3) и استفاده مجدد.
وقفه ها: «اتصال»، «TLS دست دادن»، «درخواست»، «بیکار». ارزش های مختلف در هاپ های مختلف.
محل داده و محاسبات
لبه/منطقه: خواندن و محاسبات آسان را به کاربر نزدیک تر کنید (گره های لبه و منطق منطقه ای را ببینید).
Read-local/Write-global: ماکت برای خواندن، جهانی برای نوشتن.
سلسله مراتب کش: CDN/edge cache → regional KV/Redis → service cache → local in-proc.
گرم شدن: بارگیری کلید های داغ در هنگام انتشار/پوسته پوسته شدن.
Stale-while-revalidate برای داده های کم خطر.
مخازن و شاخص ها
طرح های دسترسی O (1 )/O (logN) را انتخاب کنید ؛ شاخص های باریک را تحت نمایش های مکرر نگه دارید.
کلید های داغ: Shard توسط «hash (id)» یا اضافه کردن «نمک» برای یکنواختی.
دسته بندی در خروج به پایگاه داده/کش (به اندازه معقول) به جای ده ها تن از تماس های تک.
برای OLTP، کوتاه ترین معاملات ممکن ؛ read-committed/snapshot به جای قفل سریال.
رقابتی و غیر مسدود کردن
ابتدا صف های انتظار را حذف کنید، سپس CPU را بهینه سازی کنید.
Async I/O و رانندگان غیر مسدود کننده ؛ ساختار قفل آزاد که در آن مناسب است.
اجتناب از mutexes جهانی ؛ قفل گرانول، CAS/نسخه.
Thread pools: اندازه ها را ثابت کنید تا به سوئیچ های زمینه وارد نشوید.
آگاهی NUMA: اتصال موضوعات به سوکت ها، تخصیص دهنده های محلی.
JVM/GC و تنظیم زمان اجرا (در صورت لزوم)
تولید و تخصیص کد: عوارض جانبی کمتر → مکث GC کمتر
مخازن مدرن (G1/ZGC/Shenandoah) با مکث هدف ؛ فرار و اجاره بافر.
به اشتراک گذاری کلاس/داده ها، گرم شدن JIT، AOT/بومی تصویر برای توابع وابسته به شروع.
شامل هیستوگرام مکث GC در بودجه تاخیر کل.
صف، فشار پشتی، حفاظت از اضافه بار
اندازه صف = کوچک: صف های طولانی به «P50 زیبا» و کشتن P99.
backpressure صریح: پاسخ «کندتر» از ذخیره کنید.
همزمانی تطبیقی: موازی سازی را با افزایش خطا/تأخیر کاهش می دهد (الگوریتم های VEGAS/gradient، AIMD).
قطع کننده مدار: شکست سریع در طول تخریب بالادست، حصار (شرکت های کابین) برای استخر ها و منابع.
محدودیت نرخ: پنجره کشویی/نشانه، اولویت بندی (سطح کاربر/مسیر بحرانی).
Retray، هجینگ و idempotency
Retrai فقط برای خطاهای گذرا، با jitter و حداکثر تلاش.
عملیات Idempotent و «Idempotency-Key» برای تکرار لازم است.
درخواست های هجدار: ارسال دو برابر پس از آستانه (به عنوان مثال، p95 + 10 ms) و همیشه اضافی را لغو کنید.
هرگز بدون هماهنگی در داخل هر لایه جمع نشوید - طوفان کنید.
ذخیره سازی و گرم کردن
مسیر داغ باید بدون شبکه در بار معمولی (in-proc/LRU) باشد.
کش منفی برای 10-60 ثانیه به طوری که کلید های از دست رفته چکش نیست.
گرم شدن توده در هنگام انتشار/مقیاس بندی: لیست های کلیدی داغ، خواندن پیش رو، تازه کردن پس زمینه.
تخریب و follbecks
تخریب برازنده: کاهش در ویژگی های جزئی زمانی که تاخیر افزایش می یابد (پاسخ کمتر دقیق، بدون غنی سازی).
Soft timeouts: پاسخ پایه/کش را به جای 5xx برگردانید.
Fail-open/Fail-closed - سند صریح برای هر تماس.
قابلیت مشاهده و پروفایل
ردیابی توزیعی: دهانه در هر هاپ، نمونه برداری مبتنی بر دم.
метрики قرمز/استفاده: نرخ، خطاها، مدت زمان/استفاده، اشباع، خطاها.
بالا N «آهسته» مسیرهای روزانه.
پروفایلر (cpu/lock) در یک محصول با سربار کم (eBPF/async-profiler/Flight Recorder).
مصنوعی از ASN/شبکه های مختلف و کانال های تلفن همراه.
تست عملکرد
تست های Latency-SLO (p95/p99) با بار واقعی و تنوع.
سناریوهای هرج و مرج: تخریب DNS، افزایش از دست دادن بسته، تاخیر TLS، ذخیره آهسته.
Cold-start/scale-up: اندازه گیری اولین دقیقه پس از انتشار زمانی که کش ها خالی هستند.
استخرهای بار جداگانه با توجه به اسکریپت ها (با تست های خواندن/نوشتن دخالت نکنید).
قالب های کوتاه
سیاست اتمام وقت/جمع کردن (شبه)
yaml timeouts:
connect: 100ms tls_handshake: 150ms request_p95_budget: 80ms retries:
max_attempts: 2 backoff: exp_jitter(10ms..60ms)
retry_on: [CONNECT_ERROR, TIMEOUT, 502, 503, 504]
hedging:
enabled: true threshold: p95 + 10ms cancel_extra_on_first_success: true circuit_breaker:
error_rate_threshold: 5%
p95_threshold_increase: 30%
half_open_after: 10s
استخر و bulkheads
yaml pools:
checkout:
max_conns: 256 per_host: 64 queue: 8 # small analytics queue:
max_conns: 64 queue: 4
پاسخ با تخریب
json
{
"status": "ok",
"profile": { "id": "u123", "name": "…"},
"recommendations": "degraded, "//disabled the heavy part
"served_from": "edge-cache",
"trace_id": "…"
}
موارد کاربرد
iGaming/finance: مجوز پرداخت <200 ms p95، محدودیت/تعادل - خواندن از پیش بینی های منطقه ای، سوابق - idemotent با نسخه.
بازاریابی/توصیه ها: پاسخ <100 ms p95، کش پرچم های ویژگی در لبه، مدل ها - نمره اولیه + قوانین سریع در راه داغ.
مشتریان تلفن همراه: HTTP/3، اتصالات استفاده مجدد تهاجمی، کاهش payload (Protobuf)، وقفه های امنیتی و کش آفلاین.
ضد الگوهای
صف های طولانی در مقابل کارگران: «متوسط زیبا» و کشته شدن p99.
آبشار بر روی هر لایه بدون هماهنگی بازبینی می شود.
جهانی «مگا کش» بدون ناتوانی و گرم شدن.
زمان های فازی (در همه جا «به طور پیش فرض») - دم های کنترل نشده.
یک استخر اتصال مشترک برای همه ترافیک، مسدود کردن سر خط است.
منطق سنگین در لبه با اثرات stateful.
تله متری دم معلول - شما «نمی توانید ببینید» p99.
چک لیست تولید
- یک بودجه تاخیر هاپ و وقفه برای آن وجود دارد.
- HTTP/2/3 فعال، TLS 1. 3، استخرهای اتصال و گرم کردن.
- سلسله مراتب کش، لیست کلید داغ و استراتژی های گرم کردن.
- خواندن محلی/نوشتن جهانی و کلید اشتراک گذاری داغ.
- فشار پشتی صریح، صف های کوچک، قطع کننده مدار و بدنه.
- Retrai با لرزش، idempotency، مصون سازی محدود است.
- ردیابی با برچسب منطقه/نسخه/مشتری ؛ نظارت بر p95/p99.
- ASN/Mobile synthetic perf tests, cold-start and chaos scripts.
- روش های تخریب و follbacks مستند شده است.
- p95/p99 مربوط به SLO در بار واقعی است.
سوالات متداول
چرا P99 مهمتر از حد متوسط است ؟
زیرا کاربران با خط مواجه هستند، نه متوسط. P99 نشان می دهد «چقدر واقعا صدمه دیده است».
آیا باید همه جا هج کنیم ؟
نه، اينطور نيست این برای دم های نادر در مسیرهای بحرانی و تنها تحت محدودیت های شدید/idempointency مفید است.
چگونه شروع سرماخوردگی را کاهش دهیم ؟
گرم کردن انبارها/اتصالات، قبل از کامپایل/JIT گرم کردن، به حداقل رساندن مقدار اولیه تنبل، استخر گرم است.
آیا «شکست دادن شبکه» ممکن است ؟
به طور جزئی: HTTP/3، لبه POP، Anycast، Payload جمع و جور، استفاده مجدد از اتصال و زمان معقول.
مجموع
معماری تاخیر کم یک سیستم از ترتیبات و رشته ها است: بودجه تاخیر، نزدیکی داده ها، صف های کوچک، بازپرداخت قابل پیش بینی، سلسله مراتب حافظه پنهان، پروتکل های صحیح و قابلیت مشاهده بی رحمانه. با پیروی از این اصول، شما p95/p99 را بدون قربانی کردن ثبات و کیف پول نگه می دارید.