چگونه برای ساخت پردازش شکست امن از میلیون ها معاملات در روز
مقاله کامل
1) منظور از fail-safe برای معاملات چیست ؟
Fail-safe زمانی است که هر وضعیت شکست خورده منجر به توقف ایمن یا حالت جبران خسارت بدون از دست دادن پول و داده ها می شود. اهداف:- «بدهی/اعتبار دو برابر» = 0.
- معاملات/رویدادهای از دست رفته = 0.
- SLO قابل پیش بینی توسط تاخیر/تحویل، حالت های تخریب روشن و دکتر
اساس - ناورداهای پولی (تعادل واقعی در یک مکان)، idempotence، تحویل توافق شده از حوادث.
2) اصول معماری (کوتاه)
1. تنها منبع حقیقت: ترازنامه و حسابداری - در لجر/کیف پول. خدمات در اطراف نگه داشتن دولت از فرآیندها، نه پول.
2. Idempotency در همه جا: تمام عملیات «نوشتن» را 'Idempotency-Key' ؛ تکرار همان نتیجه را برمی گرداند.
3. رویداد با تضمین تحویل: outbox/CDC، صف، DLQ، deadup.
4. Sagas و جبران خسارت، نه «ویرایش دستی».
5. فشار برگشتی و اولویت ها: سیستم کند می شود، اما سقوط نمی کند.
6. مشاهده پذیری پیش فرض: گزارش های ساختاری، ردیابی، معیارها.
7. چند منطقه ای و DR: دارایی-دارایی/دارایی-بدهی، ورزش به طور منظم
3) توپولوژی مرجع
خدمات ──Command لبه/API GW ──App API (ساگا)
│           │
│ (جعبه خروجی TX)
جدول خروجی RateLimit ──Publisher ──Kafka/Pulsar ──Consumers
│                      │
└─DLQ/Replay WAF
│
└─Ledger/Wallet (ACID، بدهی idempotent/اعتباری)
│
└─CDC/Changefeed های ──DWH/BI/Reconمکان های کلیدی: صندوق پستی (سابقه اتمی یک تیم و «پیش نویس» یک رویداد)، ناشر (دقیقا یک تحویل)، مصرف کنندگان (idemotent، با یک کلید dedup)، DLQ/پخش (تکرارهای کنترل شده).
4) ناورداهای پولی و سازگاری
True by balance - Ledger (ACID، معاملات قابل سریال سازی یا سفارش دقیق با حساب).
دستورات پولی: «debit»، «credit»، «hold»، «commit»، «rollback» بی معنی هستند.
فرآیندهای ترکیبی مانند sagas ساخته شده است:- 'authorize → settlement → credit', 'request → submit → settled/failed', 'refund/void'.
- هیچ ترازنامه مستقیمی با دور زدن لجر ویرایش نمیشود.
5) Idempotence: طراحی کلیدی
کلید باید به طور منحصر به فرد معامله تجاری را شناسایی کند:- 'bet _ id + amount + currency', 'payment _ intent + capture _ id', 'payout _ id', 'chain _ txid'.
- نتیجه را با کلید ذخیره کنید (cache response). تکرار با همان کلید → همان بدن/وضعیت.
- عدم تطابق مانیتور - کلید مشابه با مقدار مختلف → 'IDEMPOTENCY _ عدم تطابق'.
6) صف، سفارش و مرده
اثرات دقیقا یک بار نه با حمل و نقل، بلکه توسط مصرف کنندگان idempotent + dedup ذخیره سازی (LRU/Redis/DB C TTL) به دست می آید.
ترتیب کلید را نگه دارید (کلید پارتیشن = 'account _ id/round _ id/player _ id').
برای کلیدهای «ناهمگن» - ماشین حالت به ازای هر موجودیت.
DLQ اجباری است: پس از N تلاش - به یک موضوع جداگانه با علت قابل خواندن انسان.
7) Outbox/CDC: چرا حوادث «گم نمی شوند»
در چارچوب یک معامله، ما هر دو تغییر کسب و کار و ورودی صندوق ورودی را در پایگاه داده خدمات ثبت می کنیم.
یک ناشر جداگانه صندوق خروجی را می خواند و آن را به اتوبوس تأیید منتشر می کند.
در عوض، CDC (Change Data Capture) در سطح پایگاه داده (Debezium/Replication Log).
هیچ «رویداد رویداد» گذشته از معامله منبع از دست دادن است.
8) فشار برگشتی و اولویت ها
سطل نشانه و سهمیه ورودی (در هر مستاجر/نام تجاری/منطقه).
صف های اولویت: مسیرهای پول بالاتر از تبلیغی/تله متری.
هنگامی که بیش از حد: حالت «بدون جلسات جدید/درخواست»، انجماد ویژگی های ثانویه، صرفه جویی در هسته.
تخریب خودکار: فرکانس کارهای پس زمینه را کاهش دهید، کارگران بحرانی را به صورت پویا گسترش دهید.
9) پایداری چند منطقه ای
دارایی برای API و صف، لجر محلی (یا جهانی با منطقه/ارز sharding).
اقامت داده ها: پول/PII/سیاهههای مربوط بدون قوانین صریح عبور نمی کند.
تکرار رویداد بین منطقه ای است - ناهمزمان، مشخص شده «منطقه».
RPO/RTO: هدف RPO ≤ 5 دقیقه، RTO ≤ 30 دقیقه ؛ به طور مرتب بررسی کنید.
10) SLO/SLI و داشبورد
نشانه ها (مثال):- p95 'authorize/debit/credit' <150-300 ms (مسیر داخلی).
- p95 پایان به پایان «اتوبوس komanda → sobytiye» <1-2 s.
- تحویل webhooks/رویدادهای خارجی p99 <5 دقیقه.
- معاملات از دست رفته/تکراری = 0 (چک قرارداد).
معیارها: تاخیر p50/p95/p99، نرخ خطا (4xx/5xx/business)، تاخیر مصرف کننده/صف، طوفان های مجدد، تاخیر حل و فصل، تاخیر webhook، اندازه DLQ، فرکانس IDEMPOTENCY _ MISMATCH.
11) قابلیت مشاهده و حسابرسی
سیاهههای مربوط به ساختار JSON با 'trace _ id'، 'idempotency _ key'، شناسه کسب و کار، کدهای خطا.
OpenTelemetry: ردیابی HTTP/gRPC/DB/bus، محدوده ساگا.
ممیزی WORM: سیاهههای مربوط به تغییرات بحرانی غیر قابل تغییر (محدودیتها، کلیدها، تنظیمات تبلیغی/جکپات).
PII/ماسک مخفی، سطل منطقه ای، RBAC/ABAC برای دسترسی ورود به سیستم.
12) تست قابلیت اطمینان
تست های قرارداد: تکرار/تکراری، خارج از ترتیب، idemotency، dedup.
بار: مشخصات پیک (x10)، ثبات صف و DB.
موارد هرج و مرج: Ledger/wallet قطره، صف/مناطق تخلیه، تاخیر CDC، retray «طوفان»
روز بازی: دریل DR به طور منظم و حوادث، با MTTR اندازه گیری شد.
13) ذخیره سازی و داده ها
OLTP برای پول: پایگاه داده معاملات (RPO≈0)، شاخص های دقیق، سطوح قابل سریال برای اشخاص مهم.
کش (Redis) - فقط برای شتاب، نه برای «حقیقت». "TTL + jitter، حفاظت از حافظه پنهان.
OLAP/DWH - برای گزارش/تجزیه و تحلیل. جریان از CDC/اتوبوس، بدون بار در OLTP.
طرحوارههای داده نسخهبندی میشوند ؛ مهاجرت بدون خرابی (گسترش/قرارداد).
14) ارکستر از Retraces
عقب نشینی نمایشی + لرزش، مهلت/زمان در RPC.
تکرار Idempotent در هر لایه (مشتری → سرویس → مصرف کننده).
سهمیه بندی مجدد، محافظت در برابر «طوفان» (قطع کننده مدار، درخواست های محافظت شده در صورت لزوم).
پخش از DLQ فقط به پنجره های «امن»، با محدودیت سرعت.
15) ایمنی حمل و نقل
mTLS در همه جا S2S، نشانه های کوتاه مدت (OAuth2 CC)، امضای بدن (HMAC/EdDSA) برای وب سایت ها.
اسرار در Vault/HSM، چرخش، کلید در هر نام تجاری/منطقه.
سیاستمداران کمترین امتیاز، «چهار چشم» در عملیات دستی.
16) قراردادهای نمونه (قطعات)
فرمان بدهی ایده آل
POST/v1/کیف پول/بدهی
عنوان ها: X-Idempotency-Key: debit_pi_001، X-Trace-Id: tr_a1b2
{
«account_id":"acc_42,» «مقدار «: {«جزئی _ واحد «: 5000،» ارز»:» EUR»}، «دلیل «:» پرداخت»، «reference_id":"po_001»
}
→ 200 {«وضعیت «: «متعهد», «entry_id":"e_77»}
(تکرار → همان پاسخ)رویداد از صندوق خروجی
جی سون
{
«event_id":"uuid,» event_type":"wallet بدهی. متعهد «،»  « »  «،» ارز «:» EUR «،». 3. 0"
}17) چک لیست
پلت فرم/اپراتور
- درست در تعادل - یک لجر ؛ هيچ راه حلي وجود نداره.
- تمام عملیات نوشتن با 'Idempotency-Key' ؛ پاسخ کلیدی ذخیره شده است.
- Outbox/CDC به تمام سوابق دامنه، DLQ و پخش مدیریت شده.
- صف های اولویت، فشار برگشتی، حالت های تخریب.
- کلید های پارتیشن توسط کلید های کسب و کار انتخاب می شوند ؛ مصرف کنندگان بی نظیر هستند.
- داشبورد SLO، OpenTelemetry، حسابرسی WORM.
- تمرینات منظم DR/xaoc، تست قرارداد/بار.
- اقامت داده ها، رمزگذاری، Vault/HSM، چرخش کلید.
ارائه دهندگان/ادغام
- ارسال ردیابی ID/Idempotency-کلید، آماده برای تحویل مجدد.
- Webhooks امضا شده و deduplicated.
- نسخه های طرح ها/قراردادها مشاهده می شود (semver، deprecation).
18) پرچم های قرمز (ضد الگوهای)
تعادل توسط webhook بدون فرمان در Ledger تغییر می کند.
عدم توانایی → دوبار نوشتن/اعتبار.
انتشار رویدادها با دور زدن outbox/CDC.
Monolith بدون فشار برگشت: اوج ترافیک همه چیز را پایین می آورد.
مخلوط کردن OLTP و گزارش ها: BI به پایگاه داده مبارزه می کند.
عدم وجود DLQ/پخش ؛ «آرام» مصرف اشتباهات.
بدون PII منطقه ای/جداسازی پول ؛ کلید های به اشتراک گذاشته شده در سراسر مارک های مختلف.
ویرایش دستی تعادل/وضعیت در پایگاه داده.
19) خط پایین
پردازش میلیون ها تراکنش در روز با شکست مواجه می شود: یک منبع واحد از حقیقت، دستورات idemotent، sagas و outbox/CDC، سفارش و deadup در صف، قابلیت مشاهده و تخریب مدیریت شده. دستورالعمل های دسترسی، شیوه های DR و تمرینات منظم را اضافه کنید - و یک سیستم که در آن پول به سرعت و تنها یک بار حرکت می کند، حوادث از بین نمی روند، و رشد ترافیک و اختلالات تبدیل به خطرات قابل کنترل، نه شگفتی.
