رسائل المعاملات
الرسائل المعاملات هي مجموعة من التقنيات المعمارية التي تضمن الاتساق بين تغييرات الدولة المحلية (قاعدة البيانات/ذاكرة التخزين المؤقت) والرسائل على الوسيط/الحافلة. الغرض: «الحالة ثابتة ↔ الرسالة لا تضيع أو تتكرر» في حالة الإخفاقات وإعادة التدوين والتحجيم وتعدد الإيجارات.
1) دلالات التسليم
على الأكثر مرة واحدة: سريع ورخيص، خسائر ممكنة، لا تأخذ.
مرة واحدة على الأقل: لا تفقد الرسائل، التكرارات ممكنة → الخصوصية مطلوبة.
(فعال) مرة واحدة بالضبط: لا خسارة ولا مأخذ مرئي للتأثيرات التجارية، يتم تحقيقه من خلال مجموعة من التقنيات (outbox/inbox، معاملات المنتج/المستهلك، dedup).
2) لماذا «حرفان» خطير
المنطق الساذج «يكتب أولاً إلى قاعدة البيانات، ثم يرسل إلى الحافلة» (أو العكس) يكسر عند الوقوع بين الدرجات: يتم إصلاح البيانات، ويضيع الحدث ؛ إما أن الحدث قد انتهى، لكن لا توجد بيانات. رسائل المعاملات تجسر هذه الفجوة.
3) الأنماط الأساسية
3. 1 Outbox (الشركة المصنعة)
في إحدى المعاملات المحلية، نكتب تغيير الأعمال والصف إلى جدول «outbox» ؛ ناشر منفصل يقرأ صندوق الخروج وينشر في وسيط مع التراجع والتراجع. الخسائر المستبعدة ؛ يتم إطفاء الزوجي بسبب الخصوصية بين المستهلكين.
3. 2 Inbox/Idempotent Consumer
قبل تنفيذ التأثير، يجعل المستهلك "INSERt' في" inbox (المستهلك، event_id) "المفتاح الأساسي. تعارض رئيسي = حدث تمت معالجته بالفعل → تخطي. هذه هي الطريقة التي يتم بها تحقيق «مرة واحدة بشكل فعال».
3. 3 اقرأ عملية الكتابة مع معاملة التعويض
نموذج للحافلات الموجهة نحو تسجيل الدخول: يقرأ المستهلك الدفعة، وفي نفس المعاملة يسجل تغيير العمل و "التعويض الممرر. "بعد الالتزام، يعتبر الوسيط الرسائل مستهلكة. هذا يلغي «قراءة → السقوط → التكرار» دون تكرار في التأثير.
3. 4 TSS/Sagas للتأثيرات بين الخدمات
عندما تحتاج إلى عملية متسقة متعددة الخطوات، استخدم TCC أو sagas ؛ - نقل الأوامر/الأحداث، والمعاملات - على مستوى الخطوات والتعويضات.
4) المنتجون والمستهلكون الأفراط
المنتج: 'message _ id '/' idempotency _ key' المستقر، والعودة بنفس المفتاح لا تخلق تأثيرات جديدة للمشتركين ؛ الحفاظ على التسلسل حسب المفتاح.
المستهلك: «inbox» + business idempotency (upsert/melge، تحقق من أحدث إصدار/مراجعة).
5) الترتيب والسببية
المشاركة بواسطة مفتاح العمل (على سبيل المثال، 'مجموع _ معرف'، 'مستأجر _ معرف') بحيث تصل أحداث أحد الأجسام بالترتيب.
احتفظ بأرقام/طوابع زمنية متتالية داخل القرعة ؛ عند إعادة الرسم من DLQ، راقب «بالمفتاح وبالتتابع».
إذا لم يكن النظام العالمي حاسمًا، فتأكد من النظام المحلي حسب المفتاح وأصلح ثوابت المجال.
6) التعويضات وتأثيرات التثبيت
الخيار ألف: «التعويض في مصرف التنمية»
اكتب «آخر تعويض تمت معالجته (التقسيم، التعويض)» لنفس المعاملة حيث تقوم بتغيير بيانات النطاق. عند إعادة التشغيل، استمر من التعويض التالي، وتجنب التأثير المتكرر.
الخيار باء: معاملة الوسيط
يدعم بعض السماسرة التسجيل الذري للرسائل والتعويضات في صفقة منتج/مستهلك واحد. استخدم إذا كان متاحًا، ولكن دائمًا ما يكون مكملًا بحماقة على المستهلك.
7) Retrai، تراجع، DLQ
كرر الأخطاء القابلة للتراجع فقط (المهلة، 5xx)، مع التراجع الأسي والنفخ.
غير قابل للسحب (مخطط/تحقق) - مباشرة في DLQ مع البيانات الوصفية (المستأجر، المفتاح، التعويض، السبب).
قم بجرعة إعادة السحب من DLQ (دفعة، حد السعر)، تحقق من الدائرة قبل التكرار، راقب الترتيب حسب المفتاح.
8) تعدد الإيجارات والمناطق
إدراج «مستأجر _ معرف» و «خطة» و «منطقة» في البيانات الوصفية للرسائل ومفاتيح التقسيم.
الإنصاف لكل مستأجر: الحد من النشر/المعالجة بحيث لا يقوم العميل «الصاخب» بخصم الميزانية من الباقي.
الإقامة: تخزين الرسائل وصندوق الخروج في نفس المنطقة مثل بيانات النطاق ؛ التكرارات الأقاليمية - التجمعات غير المتزامنة.
9) قابلية الملاحظة ومراجعة الحسابات
التتبع: الارتباط 'event _ id '/' algrigate _ id '/' saga _ id'، يمتد «يقرأ → عملية → الكتابة/الالتزام».
المقاييس: تأخر النشر/المعالجة (p95/p99)، معدل النجاح، معدل DLQ، إعادة تعزيز النجاح، «مكررات مكبوتة».
الجذوع: اختصار للنجاح ؛ تفاصيل عن الأخطاء (السبب والمحاولة والمفتاح والتعويض).
التدقيق: من أعاد الرسم/التراجع، ما هي الدفعة وبأي نتيجة.
10) السلامة والامتثال
تقليل مؤشر الاستثمار الدولي في الحمولة إلى الحد الأدنى ؛ قناع عند التحويل إلى DLQ/logs.
توقيع/تشفير رسائل للحافلات الخارجية ؛ استخدام mTLS بين الخدمات.
إدارة مدة الصلاحية و «الحق في النسيان» لكل مستأجر/منطقة.
11) مخططات التكامل النموذجية
1. مصدر الخدمة (جانب الكتابة)
المعاملة المحلية: سجل النطاق + صندوق الخروج.
الناشر: دفعات، «SKIP LOCKED»، تراجع، حدود لكل مستأجر.
المراقبة متأخرة الآن − occurred_at'.
2. مستهلك الخدمات (جانب القراءة)
قراءة الدفعة → محاولة «إدخال صندوق الوارد (المستهلك، event_id)» → إذا نجحنا، فإننا ننفذ التأثير.
في نفس المعاملة، نصلح «التعويض الممرر» (الخيار أ) أو نعتمد على معاملة السمسار (الخيار ب).
عند الخطأ: إعادة الدرس أو DLQ حسب السياسة.
3. التوقعات/النظرة الملموسة
التحديثات الخفية فقط (مزعجة)، مفاتيح التفريغ المدمجة، التحقق الدوري من الشيكات.
12) نماذج التكوين (مثال)
yaml producer:
idempotency_key: event_id partition_key: "{tenant_id}:{aggregate_id}"
retry:
max_attempts: 8 initial_ms: 200 max_ms: 8000 strategy: exponential_full_jitter
consumer:
batch: 500 offset_commit: "with_domain_tx" # или "broker_tx"
inbox_enabled: true concurrency_per_partition: 4 dlq:
enabled: true batch_redrive: 200 rate_limit_per_sec: 50 order_by_key: true
observability:
metrics:
- processing_lag_ms
- publish_success_ratio
- dlq_rate
- redrive_success_ratio tracing_tags: [event_id, tenant_id, aggregate_id, partition, offset]
13) قائمة مرجعية قبل البيع
- تم حذف «حرفين»: صندوق الخروج على المنتج أو تحديد التعويض والأثر في معاملة واحدة على المستهلك.
- المستهلك اللطيف: «inbox »/dedup journal، business impempotency of operations.
- التقسيم حسب مفتاح العمل، يتبع النظام المحلي.
- تراجع + تراجع، تصنيف خطأ، DLQ غني بالبيانات الوصفية.
- إعادة سحب الجرعة، آمنة ؛ هناك كتب لعب.
- الحدود والأولويات المتعددة المستأجرين ؛ علامات «المستأجر _ المعرف/الخطة/المنطقة».
- القياس عن بعد: تأخيرات، معدل النجاح، «مكررات مقطوعة»، تنبيهات بواسطة p95/p99.
- يجري إنفاذ سياسات تحديد الأداء المكتسب/الاحتفاظ/التشفير.
- الاختبارات: اسقاط بين الخطوات، التكرارات، ترتيب المفتاح، إعادة رسم الكتلة.
14) أخطاء نموذجية
إرسال الحافلة والكتابة إلى قاعدة البيانات في خطوات منفصلة دون صفقة خارجية/تعويضية.
المستهلك الذي لا يتمتع بالحماقة → يكرر الآثار الجانبية.
النظام العالمي «يأتي ما قد» مكلف ونادرا ما يكون مبررا ؛ ما يكفي من النظام حسب المفتاح.
إعادة رسم ضخمة بلا حدود → حادثة ثانوية.
عدم وجود مقاييس تتبع/تأخر → «تدهور خفي».
خلط PII في DLQ/logs.
15) وصفات سريعة
أحداث SaaS: Outbox + المستهلك الخفي (صندوق الوارد)، التقسيم حسب «المستأجر _ المعرف: المجموع _ المعرف».
ETL/الإسقاطات: اقرأ عملية الكتابة مع تعويضات التثبيت في معاملة واحدة، دفعات 500-1000، مزعجة.
الحمل العالي: شحنات النشر، «SKIP LOCKED»، WFQ لكل مستأجر، التحكم المتأخر.
منطقة الامتثال الصارمة: صندوق الخروج الإقليمي، وتشفير الحمولة، والاحتفاظ بعمليات إعادة التوصيل ومراجعتها.
استنتاج
الرسائل المعاملات هي نظام ربط البيانات والرسائل. من خلال الجمع بين صندوق الخروج/صندوق الوارد، والخصوصية، والتثبيت التعويضي جنبًا إلى جنب مع التأثيرات وإعادة التدوير المدارة مع DLQ، تحصل على سلوك عملي مرة واحدة بالضبط بدون أقفال عالمية وتحتفظ بـ SLO حتى مع الحوادث والقمم والاستغلال المعقد متعدد المستأجرين.