ضمانات أمر الرسالة
1) ما هو «النظام» ولماذا هو مطلوب
ترتيب الرسائل هو علاقة «ما يجب معالجته قبل» لأحداث كيان واحد (طلب، مستخدم، محفظة) أو للتيار بأكمله. ومن المهم بالنسبة للثوابت: «الحالة A قبل B»، «التوازن قبل الشطب»، «النسخة n قبل n + 1».
وفي النظم الموزعة، يكون الترتيب الإجمالي العالمي باهظ التكلفة ونادرا ما تكون هناك حاجة إليه ؛ وعادة ما يكون الطلب المحلي لكل مفتاح كافيا.
2) أنواع ضمانات النظام
1. لكل تقسيم (ترتيب محلي في قسم السجل) - كافكا: يتم الحفاظ على الترتيب داخل الحزب، بين الأطراف - لا.
2. لكل مفتاح (طلب مجموعة المفتاح/الرسالة) - يتم توجيه جميع الرسائل ذات المفتاح الواحد إلى «خيط» واحد للمعالجة (مفتاح كافكا، SQS FIFO MessageGroupId، مفتاح الطلب الفرعي/الحانة).
3. الترتيب الكلي العالمي - يرى النظام بأكمله طلبًا واحدًا (يومية/متسلسل موزع). باهظ الثمن ويؤدي إلى تدهور التوافر والإنتاجية.
4. الترتيب السببي - «الحدث B بعد A إذا لاحظ B التأثير A.» قابل للوصول من خلال البيانات الوصفية (الإصدارات، Lamport-times/vector clocks) بدون متسلسل عالمي.
5. أفضل طلب - يحاول الوسيط الحفاظ على النظام، ولكن في حالة الفشل، تكون التباديل ممكنة (غالبًا في NATS Core، RabbitMQ مع العديد من المستهلكين).
3) حيث ينهار الطلب
المستهلكون المتوازيون من نفس قائمة الانتظار (RabbitMQ: العديد من المستهلكين لكل قائمة انتظار → التشابك).
إعادة/إعادة التسليم (مرة واحدة على الأقل)، مهلات «ack»، إعادة الانتظار.
إعادة التوازن/الخداع (كافكا: تحرك الحزب/الزعيم).
DLQ/إعادة المعالجة - تذهب الرسالة «السامة» إلى DLQ، وتذهب الرسالة التالية إلى أبعد من ذلك → استراحة منطقية.
تعدد المناطق والتكرار - تأخيرات مختلفة → اختلالات.
4) تصميم ترتيب المفتاح
المفتاح يشكل "وحدة الطلب. التوصيات:- استخدم المفاتيح الطبيعية: «طلب _ معرف»، «محفظة _ معرف»، «مجمع _ معرف».
- شاهد «المفاتيح الساخنة» - يمكن لمفتاح واحد «منع» التدفق (حجب رأس الخط). إذا لزم الأمر، قسّم المفتاح: 'طلب _ معرف # شرد (0.. k-1) مع إعادة بناء حتمية للنظام على الحوض.
- في كافكا - مفتاح واحد → جزء واحد، سيتم الحفاظ على الترتيب داخل المفتاح.
java producer.send(new ProducerRecord<>("orders", orderId, eventBytes));
(المفتاح = «المعرف» يضمن النظام المحلي.)
5) «Order vs. Bandwidth»
غالبًا ما تتعارض الضمانات القوية مع الإنتاجية والتوافر:- يحافظ مستهلك واحد لكل قائمة انتظار على الطلب ولكنه يقلل من التزامن.
- تحسن العملة المتزامنة مرة واحدة على الأقل + الأداء، ولكنها تتطلب الخصوصية و/أو إعادة الترتيب.
- يضيف النظام العالمي قفزة إلى متسلسل → ↑latentnost وخطر الفشل.
حل وسط: ترتيب لكل مفتاح، التوازي = عدد الأحزاب/المجموعات، + الكدمات الحمقاء.
6) مراقبة النظام في وسطاء محددين
كافكا
النظام داخل الحزب.
راقب 'max. في. الرحلة. الطلبات. per. connection ≤ 5 'с' enable. idempotence = true 'بحيث لا تغير عمليات إعادة إنتاج المنتج الترتيب.
مجموعة المستهلكين: طرف واحد → عامل واحد في كل مرة. من الممكن أن تحافظ عمليات التسليم المتكررة → التسلسل/الإصدار في طبقة العمل.
تحافظ معاملات القراءة والعملية والكتابة على اتساق الموازنة بين القراءة والكتابة والفتات، ولكنها لا تخلق نظامًا عالميًا.
properties enable.idempotence=true acks=all retries=2147483647 max.in.flight.requests.per.connection=5
RabbitMQ (AMQP)
الطلب مضمون في قائمة انتظار واحدة لمستهلك واحد. مع العديد من مستهلكي الرسائل يمكن أن تأتي «مختلطة».
للطلب: مستهلك واحد أو بريفتش = 1 + ack عند الانتهاء. للتزامن، قوائم انتظار منفصلة حسب المفاتيح (تبادل الشحن/تبادل التجزئة المتسقة).
NATS/JetStream
NATS Core - أفضل جهد، زمن انتقال منخفض، النظام قد يكون مضطربًا.
جيت ستريم: الطلب داخل التيار/التسلسل ؛ أثناء عمليات إعادة التسليم، من الممكن إعادة الترتيب على وحدة التحكم → تسلسل الاستخدام وحاجز الاسترداد.
SQS FIFO
المعالجة مرة واحدة بالضبط (بشكل فعال، بسبب التفريغ) والطلب داخل MessageGroupId. التزامن - عدد المجموعات داخل مجموعة رؤساء الخطوط.
Google Pub/Sub
طلب المفتاح يعطي الترتيب داخل المفتاح ؛ في حالة حدوث أخطاء، يتم حظر النشر حتى يتم استعادته - احترس من الضغط الخلفي.
7) أنماط الحفاظ على النظام واستعادته
7. 1 تسلسل/إصدار
كل حدث يحمل «seq »/« نسخة». المستهلك:- يأخذ الحدث فقط إذا 'seq = last_seq + 1' ؛
- خلاف ذلك - وضع حاجز الانتظار قبل وصول المفقودين («الأخير _ seq + 1»).
pseudo if seq == last+1: apply(); last++
else if seq > last+1: buffer[seq] = ev else: skip // дубль/повтор
7. 2 حاجزات ونوافذ (تجهيز التيار)
نافذة زمنية + علامة مائية: نقبل خارج النظام داخل النافذة، وفقًا للعلامة المائية، «نغلق» النافذة ونرتبها.
التأخير المسموح به: قناة للوصول المتأخر (إعادة الحوسبة/التجاهل).
7. 3 التوجيه اللاصق بالمفتاح
يرسل التجزئة (المفتاح)٪ تجزئة التجزئة جميع الأحداث الرئيسية إلى عامل واحد.
في Kubernetes - حافظ على جلسة (لزجة) على مستوى قائمة الانتظار/الشيردات، وليس على توازن L4 HTTP.
7. 4 ممثل - نموذج/» تيار واحد لكل مفتاح«
للمجموعات الحرجة (المحفظة): يعالج الفاعل بالتتابع، وبقية التوازي - عدد الممثلين.
7. 5 الفراغ + إعادة الترتيب
حتى مع استعادة النظام، التكرار ممكن. اجمع UPSERT حسب إصدار key + و Inbox (راجع بالضبط مرة واحدة مقابل مرة واحدة على الأقل).
8) العمل بالرسائل «السامة» (حبوب سامة)
تواجه مهمة الحفاظ على النظام: «كيف تعيش إذا لم تتم معالجة رسالة واحدة ؟»
الترتيب الصارم: حظر تدفق المفتاح (SQS FIFO: المجموعة بأكملها). الحل هو DLQ حسب المفتاح: نقوم فقط بنقل مفتاح/مجموعة المشكلة إلى قائمة انتظار منفصلة/تحليل يدوي.
الترتيب المرن: نسمح بالتخطي/التعويض ؛ نسجل ونواصل (ليس للتمويل/المجاميع الحرجة).
سياسة إعادة التدوير: محدودة «الحد الأقصى للتسليم» + التراجع + التأثيرات التنقية.
9) النظم المتعددة المناطق والعالمية
ولا يضمن الربط/التكرار بين المجموعات (كافكا) وجود نظام عالمي أقاليمي. إعطاء الأولوية للترتيب المحلي لكل مفتاح والكدمات الحمقاء.
بالنسبة للنظام العالمي حقًا، استخدم متسلسلًا (سجل مركزي)، ولكن هذا يؤثر على التوافر (CAP: ناقص A لفواصل الشبكة).
البديل: الترتيب السببي + CRDT لبعض المجالات (العدادات، المجموعات) - لا حاجة إلى ترتيب صارم.
10) إمكانية مراقبة النظام
Метрики: 'out _ of _ order _ total', 'recorded _ in _ window _ total', 'late _ events _ total', 'buffer _ size _ current', 'blocked _ keys _ total', 'fifo _ group _ backlog'.
11) الأنماط المضادة
قائمة انتظار واحدة + العديد من المستهلكين دون شق المفتاح - ينهار الطلب على الفور.
Retrai من خلال إعادة الجمهور في نفس قائمة الانتظار دون الغباء - يتضاعف + خارج النظام.
النظام العالمي «في حالة» هو انفجار في زمن الكمون والقيمة دون فائدة حقيقية.
SQS FIFO مجموعة واحدة للجميع - رأس خط كامل. استخدم MessageGroupId لكل مفتاح.
تجاهل «المفاتيح الساخنة» - «محفظة» واحدة تبطئ كل شيء ؛ تقسيم المفتاح إلى مفاتيح فرعية حيثما أمكن.
مزج التيارات الحرجة والجملة في نفس قائمة الانتظار/المجموعة - التأثير المتبادل وفقدان النظام.
12) قائمة التنفيذ المرجعية
- لكل مفتاح/لكل تقسيم/سببي/عالمي ؟
- تصميم استراتيجية مفتاح التسلسل ومفاتيح مكافحة الحرارة.
- تم تكوين جهاز التوجيه: التقسيم/MessageGroupId/مفتاح الطلب.
- يتم عزل وحدات التحكم بواسطة المفاتيح (التوجيه اللزج، عمال الشظايا).
- يتم تضمين الخصوصية و/أو Inbox/UPSERT على الكدمات.
- نفذ التسلسل/النسخة وإعادة الترتيب الاحتياطي (إذا لزم الأمر).
- DLQ من خلال السياسة الرئيسية وإعادة التراجع.
- مقاييس blocked_keys والترتيب late_events والتنبيه.
- يوم اللعبة: إعادة التوازن، فقدان العقدة، رسالة سامة، تأخير الشبكة.
- الوثائق: ثوابت الطلبات، حدود النوافذ، التأثير على اتحادات تحرير السودان.
13) أمثلة التكوين
13. 1 Kafka Consumer (التقليل من مخالفة الطلب)
properties max.poll.records=500 enable.auto.commit=false # коммит после успешной обработки батча isolation.level=read_committed
13. 2 RabbitMQ (طلب حسب سعر التزامن)
مستهلك واحد لكل قائمة انتظار + أساسي. qos (prefetch = 1) "
للتزامن - عدة قوائم انتظار وتبادل التجزئة:bash rabbitmq-plugins enable rabbitmq_consistent_hash_exchange публикуем с хедером/ключом для консистентного хеша
13. 3 SQS FIFO
ضبط MessageGroupId = مفتاح. المتزامنة = عدد المجموعات.
MessageDeduplicationId للحماية من النسخ المكررة (في نافذة المزود).
13. 4 NATS JetStream (مستهلك مطلوب، رسم تخطيطي)
bash nats consumer add ORDERS ORD-KEY-42 --filter "orders.42.>" --deliver pull \
--ack explicit --max-deliver 6
المفتاح> مراقبة «التعادل» وإعادة الترتيب الاحتياطي في التطبيق.
14) الأسئلة الشائعة
س: هل أحتاج إلى نظام عالمي ؟
ج: تقريبا أبدا. دائمًا ما يكفي لكل مفتاح. النظام العالمي مكلف ويضرب القدرة على تحمل التكاليف.
س: ماذا عن الرسالة «السامة» بموجب أمر صارم ؟
ج: نقل مفتاحه/مجموعته فقط إلى DLQ، والباقي - استمر.
س: هل يمكنك الحصول على النظام والمقياس في نفس الوقت ؟
ج: نعم، ترتيب المفتاح + العديد من المفاتيح/الأجزاء + العمليات الخفية وإعادة ترتيب المخازن المؤقتة عند الضرورة.
س: أيهما أكثر أهمية: طلب أم مرة واحدة بالضبط ؟
ج: بالنسبة لمعظم المجالات - ترتيب المفتاح + تأثيرات فعالة مرة واحدة بالضبط (الخصوصية/UPSERT). يمكن أن يكون النقل مرة واحدة على الأقل.
15) المجاميع
النظام هو ضمان محلي حول مفتاح العمل، وليس انضباطًا عالميًا باهظ الثمن. مفاتيح التصميم والحفلات، والحد من المفاتيح الساخنة، واستخدام الخصوصية، وعند الضرورة، التسلسل + إعادة الترتيب الاحتياطي. احترس من مقاييس المفاتيح غير المطلوبة والمحظورة، واختبار الأعطال - وستحصل على معالجة يمكن التنبؤ بها دون التضحية بالأداء أو التوافر.