كيفية بناء معالجة آمنة للفشل لملايين المعاملات يوميًا
مقالة كاملة
1) ماذا يعني الفشل الآمن للمعاملات
يكون الفشل آمنًا عندما يؤدي أي وضع فاشل إما إلى توقف آمن أو حالة تعويض دون خسارة الأموال والبيانات. الأهداف:- «الخصم المزدوج/الائتمانات» = 0.
- المعاملات/الأحداث المفقودة = 0.
- يمكن التنبؤ بمؤشرات الكمون/التسليم، وأنماط التدهور الواضحة و DR.
الأساس - الثوابت النقدية (التوازن الحقيقي في مكان واحد)، التطرف، تنفيذ الأحداث المتفق عليه.
2) المبادئ المعمارية (قصيرة)
1. مصدر واحد للحقيقة: الميزانية العمومية والمحاسبة - في Ledger/Wallet. الخدمات المحيطة بها تحمل حالة العمليات وليس المال.
2. الخصوصية في كل مكان: جميع عمليات «الكتابة» تأخذ «مفتاح الخصوصية» ؛ ويعيد التكرار نفس النتيجة.
3. الحدث مع ضمان التسليم: outbox/CDC، قوائم الانتظار، DLQ، dedup.
4. القصة والتعويضات، وليس «التعديلات اليدوية».
5. الضغط الخلفي والأولويات: يتباطأ النظام، لكنه لا ينهار.
6. القابلية للرصد الافتراضي: جذوع الأشجار المنظمة، والتعقب، والمقاييس.
7. متعدد المناطق و DR: الأصول/الأصول/الخصوم، ممارسة منتظمة.
3) الطوبولوجيا المرجعية
Edge/API GW ──Command API ──App Service (Sagas)
│           │
│ (Outbox TX)
الجدول ──Publisher ──Kafka/Pulsar ──Consumers
│                      │
الاتحاد العالمي للملاحة الجوية └─DLQ/Replay
│
└─Ledger/Wallet (ACID، الخصم/الائتمان الخفي)
│
└─CDC/Changefeed ──DWH/BI/Reconالأماكن الرئيسية: Outbox (السجل الذري للفريق و «مسودة» الحدث)، الناشر (تسليم واحد بالضبط)، المستهلكون (غير القادرين، مع مفتاح التخلص)، DLQ/Replay (التكرارات الخاضعة للرقابة).
4) الثوابت النقدية والاتساق
صحيح بالتوازن - دفتر الأستاذ (ACID، المعاملات التسلسلية أو الطلب الصارم عن طريق الحساب).
الأوامر المالية: «الخصم»، «الائتمان»، «الاحتفاظ»، «الالتزام»، «التراجع» هي غير واقعية.
تم بناء العمليات المشتركة مثل الملاحم:- «تفويض → تسوية → الائتمان»، «طلب → تقديم → تسويتها/فشلها»، «استرداد/فراغ».
- لا توجد ميزانية عمومية مباشرة تتعدى ليدجر.
5) الفراغ: تصميم المفتاح
يجب أن يحدد المفتاح بشكل فريد المعاملة التجارية:- 'bet _ id + auth + comment', 'payment _ intent + capture _ id', 'payout _ id', 'chain _ txid'.
- قم بتخزين النتيجة بواسطة المفتاح (ذاكرة التخزين المؤقت للاستجابة). كرر بنفس المفتاح → نفس الجسم/الحالة.
- رصد عدم التطابق - نفس المفتاح بكمية مختلفة → 'IDEMPOTENCY _ MISMATCH'.
6) قوائم الانتظار والنظام والوفاة
لا تتحقق التأثيرات مرة واحدة بالضبط عن طريق النقل، ولكن عن طريق المستهلكين الأغبياء + التخزين (LRU/Redis/DB c TTL).
احتفظ بترتيب المفتاح (مفتاح التقسيم = 'الحساب _ id/round _ id/player _ id').
بالنسبة للمفاتيح «غير المتجانسة» - آلة الدولة لكل كيان.
DLQ إلزامي: بعد محاولات N - في موضوع معزول لسبب مقروء من الإنسان.
7) Outbox/CDC: لماذا الأحداث «لا تضيع»
في إطار صفقة واحدة، نسجل كل من تغيير الأعمال وإدخال صندوق الخروج في قاعدة بيانات الخدمة.
ناشر منفصل يقرأ صندوق الخروج وينشره في حافلة التأكيد.
بدلاً من ذلك، CDC (Change Data Capture) على مستوى قاعدة البيانات (Debezium/replication log).
لا توجد «سجلات أحداث» بعد الصفقة مصدر خسارة.
8) الضغط الخلفي والأولويات
دلاء رمزية وحصص مدخلات (لكل مستأجر/علامة تجارية/منطقة).
قوائم الانتظار ذات الأولوية: مسارات المال فوق الترويج/القياس عن بُعد.
عند التحميل الزائد: أوضاع «لا جلسات/طلبات جديدة»، وتجميد الميزات الثانوية، وحفظ النواة.
التدهور الذاتي: خفض وتيرة المهام الخلفية، وتوسيع العمال المهمين ديناميكيًا.
9) الاستدامة متعددة الأقاليم
أصول API وقوائم الانتظار، Ledger المحلي (أو العالمي مع شحن المنطقة/العملة).
الإقامة في البيانات: لا يتم تجاوز الأموال/PII/السجلات بدون قواعد صريحة.
تكرار الأحداث هو أقاليمي - غير متزامن، علامة «منطقة».
RPO/RTO: صوب RPO ≤ 5 دقائق، RTO ≤ 30 دقيقة ؛ تحقق بانتظام.
10) SLO/SLI ولوحات القيادة
المعالم (مثال):- p95 'archorize/debit/credit' <150-300 mm (المسار الداخلي).
- p95 من طرف إلى طرف «bus komanda→sobytiye» <1-2 s.
- تسليم الخطابات الشبكية/الأحداث الخارجية p99 <5 دقائق.
- المعاملات المفقودة/المزدوجة = 0 (الشيكات التعاقدية).
المقاييس: زمن الوصول p50/p95/p99، معدل الخطأ (4xx/5xx/business)، تأخر المستهلك/قائمة الانتظار، إعادة تجربة العواصف، تأخر الاستقرار، تأخر الويب، حجم DLQ، تردد «IDEMPOTENCY _ MISMATCH».
11) قابلية الملاحظة ومراجعة الحسابات
سجلات JSON منظمة مع «تتبع _ معرف»، «idempotency _ key»، معرف الأعمال، رموز الخطأ.
OpenTelemetry: HTTP/gRPC/DB/تتبع الحافلات، امتدادات من الملاحم.
تدقيق WORM: سجلات تغيير حرجة غير قابلة للتغيير (حدود، مفاتيح، تكوينات ترويجية/جائزة كبرى).
PII/إخفاء سري، دلاء إقليمية، RBAC/ABAC للوصول إلى السجل.
12) اختبار الموثوقية
اختبارات العقد: التكرار/التكرار، الخروج عن النظام، الخمول، التخلص.
الحمل: ذروة الملف الشخصي (x10)، واستقرار قوائم الانتظار و DB.
حالات الفوضى: دفتر الأستاذ/إسقاط المحفظة، طابور/تفريغ المناطق، تأخيرات مراكز السيطرة على الأمراض والوقاية منها، إعادة «العاصفة»
أيام اللعبة: تدريبات وحوادث DR منتظمة، مع قياس MTTR.
13) التخزين والبيانات
OLTP مقابل المال: قاعدة بيانات المعاملات (RPO≈0)، المؤشرات الصارمة، المستويات القابلة للتسلسل للكيانات الحيوية.
ذاكرة التخزين المؤقت (Redis) - فقط من أجل التسريع، وليس من أجل "الحقيقة. TTL + jitter, cache stampede protection.
OLAP/DWH - للتقارير/التحليلات. يتدفق من مركز السيطرة على الأمراض/الحافلة، لا حمولة على OLTP.
وتحرر مخططات البيانات ؛ الهجرة دون توقف (التوسع/التعاقد).
14) تنظيم Retraces
التراجع الأسي + jitter، المواعيد النهائية/المهلة على RPC.
التكرار الفطري على كل طبقة (خدمة → العميل → المستهلك).
حصص Retrai، الحماية من «العواصف» (قاطع الدائرة، الطلبات التحوطية عند الاقتضاء).
إعادة التشغيل من DLQ فقط إلى النوافذ «الآمنة»، مع حد للسرعة.
15) سلامة وسائل النقل
mTLS في كل مكان S2S، رموز قصيرة العمر (OAuth2 CC)، توقيعات الجسم (HMAC/EdDSA) لخطابات الويب.
أسرار في Vault/HSM، تناوب، مفاتيح لكل علامة تجارية/منطقة.
السياسيون الأقل امتيازًا، «أربع عيون» على العمليات اليدوية.
16) عينة عقود (شظايا)
أمر الخصم اللطيف
POST/v1/wallet/debit
الرؤوس: X-Idempotency-Key: debit_pi_001، X-Trace-Id: tr_a1b2
{
"account_id":"acc_42," "المبلغ": {"minor _ units': 5000،" العملة ":" EUR "}،" السبب ":" الدفع "،" reference_id":"po_001 "
}
→ 200 {«حالة «: «ملتزمة»، «entry_id":"e_77»}
(كرر → نفس الجواب)حدث من outbox
جسون
{
"event_id":"uuid," "event_type":"wallet. الخصم. الملتزم، « »  « »، «العملة»: «اليورو»، « » . 3. 0"
}17) القوائم المرجعية
المنصة/المشغل
- صحيح بشكل عام - دفتر أستاذ واحد ؛ لا توجد حلول بديلة.
- تكتب جميع العمليات باستخدام «Idempotency-Key» ؛ يتم تخزين الاستجابة الرئيسية.
- Outbox/CDC لجميع سجلات النطاقات و DLQ والإعادة المدارة.
- قوائم الانتظار ذات الأولوية، الضغط الخلفي، أوضاع التدهور.
- يتم اختيار مفاتيح التقسيم بواسطة مفاتيح العمل ؛ فالمستهلكون يتمتعون بالحماقة.
- لوحات معلومات SLO، OpenTelemetry، تدقيق WORM.
- تمارين DR/xaoc العادية، اختبارات العقد/التحميل.
- إقامة البيانات، التشفير، Vault/HSM، تناوب المفتاح.
مقدمو/عمليات التكامل
- إرسال Trace-Id/Idempotency-Key، جاهز لإعادة التسليم.
- يتم التوقيع على خطوط الويب وإسقاطها.
- لوحظت نسخ من المخططات/العقود (نصف النهائي، الاستنكار).
18) الأعلام الحمراء (الأنماط المضادة)
يتغير التوازن عن طريق خطاف الويب بدون أمر في ليدجر.
عدم التمكن → الشطب المزدوج/الاعتمادات.
نشر الأحداث التي تتجاوز صندوق الخروج/مركز السيطرة على الأمراض.
مونوليث بدون ضغط خلفي: ذروة حركة المرور تخفض كل شيء.
مزج OLTP والتقارير: BI تصل إلى قاعدة بيانات القتال.
عدم وجود DLQ/إعادة التشغيل ؛ ابتلاع الأخطاء «الهادئة».
عدم وجود عزل إقليمي لمؤشر الاستثمار الدولي/النقود ؛ المفاتيح المشتركة عبر العديد من العلامات التجارية.
تعديلات يدوية للأرصدة/الأوضاع في قاعدة البيانات.
19) خلاصة القول
تدور المعالجة الآمنة للفشل لملايين المعاملات يوميًا حول الثوابت والانضباط: مصدر واحد للحقيقة، والأوامر الحمقاء، والملاحم الخارجية/مراكز السيطرة على الأمراض والوقاية منها، والنظام والوفاة في قوائم الانتظار، وإمكانية الملاحظة والتدهور المدار. أضف تفويضات الوصول وممارسات DR والتمارين المنتظمة - واحصل على نظام تتحرك فيه الأموال بسرعة ومرة واحدة فقط، ولا تضيع الأحداث، ويصبح نمو حركة المرور والاضطرابات مخاطر يمكن التحكم فيها، وليس مفاجآت.
