كشف النزاعات وحلها
1) ما يعتبر نزاعًا
الصراع هو حالة يدعي فيها مصدران أو أكثر من مصادر التغيير وجود حالات غير متوافقة من نفس الكيان أو المورد أو الثابت.
Syntactic: تغييرات متداخلة لملف/مفتاح واحد (دمج الصراع في Git، تصادم التصحيح في Kustomize).
الدلالة: المستند الصحيح وفقًا للنظام ينتهك الثابت التجاري (مبلغ الخصم ≠ الائتمان، الحد الزائد).
التشغيل/الزمني: سباقات الكتابة/القراءة، تكرار الأحداث، التباين بين السبب والنتيجة.
المجال: عمليات منافسة على المورد (بيع تذاكر مزدوجة، سلع مكتبية).
المهمة: الكشف عن الصراع في أقرب وقت ممكن، وشرح سببه واختيار أحد الإجراءات بأمان: استعادة السيارات، وإعادة الدمج، والاندماج، والتعويض، والتصعيد.
2) آليات الكشف
2. 1 مقارنة الإصدار والحالة
ETag/If-Match in REST، rowversion/xmin in DB - اكتشاف التحديث المفقود.
الدمج ثلاثي الاتجاهات (قاعدتنا، قاعدتنا، خاصتهم) - تسليط الضوء على التعديلات غير المتوافقة.
Checksum/Hash حسب المجال/المستند - مقارنة رخيصة.
2. 2 علامات الوقت والسببية
ساعة لامبورت: الترتيب الكلي «تقريبي في الوقت المناسب».
2. 3 الثوابت والقيود
المخططات والمصدقين (مخطط JSON/OpenAPI) - صلاحية الإعراب.
الثوابت: التفرد، عدم السلبية، التوازن، قواعد الرباط الصليبي الأمامي.
التحقق من النزاهة: فهارس FK/UNIQUE/EXTREME، قيود جزئية.
يؤكد المجال في المدونة/السياسات (OPA/Kyverno/Conftest).
2. 4 الكشف في تدفقات الأحداث
Idempotency Key/Dedup Store (على سبيل المثال Redis/DB مع TTL): رفض اللقطات.
المعاملات/بالضبط مرة واحدة في البث: معرف المعاملات، حقبة المنتج، أوفست المستهلك.
كشف فجوة التسلسل: الثغرات والتكرار (n, n + 1, n + 1).
2. 5 إمكانية الرصد والإنذار
خطأ/تصادم/ريتراي بروميتريك.
3) استراتيجيات الحل
3. 1 تلقائي بالكامل (آمن بالتعريف)
CRDT (أنواع البيانات المتكررة الخالية من النزاعات): G-Counter، PN-Counter، OR-Set، LWW-Register، Map/Graph CRDT.
ضمان التقارب دون تنسيق ؛ ومن المهم اختيار دلالات الخسارة/الاستبقاء.
العمليات التبادلية: تطبق بأي ترتيب (الزيادات، تذييلات السجلات).
المتعاملون الأغبياء: التكرار لا يغير النتيجة (مزعج بالمفتاح، وضع إذا كان غائبًا).
الدمج المتفائل للهياكل: «الدمج العميق + السياسة» مع الترتيب الحتمي.
3. 2 شبه آلية (مع سياسة)
3-way memge + array rules ('استبدال' append 'uniqueBy (key) | patchBy (key)').
LWW (Last-Write-Wins): بسيط ولكن خطر فقدان الصواب السببي.
أولويات المصادر هي «مدخلات تفاعلية> كونفيج من ملف> افتراضات».
قواعد العمل: «إذا تم تجاوز الحد - تأكيد/تعويض جزئي».
3. 3 التنسيق
OCC/MVCC (حظر متفائل/متعدد النسخ): تسوية النسخة، إعادة الطباعة.
أقفال متشائمة: "حدد... للتحديث '، أقفال موزعة (Redlock/DB-lock/etcd).
توافق الآراء (رافت/باكسوس): زعيم واحد يقرر الأمر ؛ هناك صراعات أقل، والثمن هو زمن الكمون.
3. 4 شخص في حلقة (HITL)
واجهة مستخدم للدمج/التحكيم اليدوي (وخاصة المحتوى والتعريفات والكتالوجات).
معاينة ديفا، شرح السياسة، الأزرار: «تقبل لنا/لهم»، «دمج الحقول»، «خلق التعويض».
4) الأنماط حسب طبقات العمارة
4. 1 API/REST/gRPC
التزامن المتفائل: «If-Match: <etag>»، 409/412 في حالة الصراع → يتراجع العميل مع الأخذ في الاعتبار ETag الجديد.
Idempotency-Key in POST (المدفوعات/الطلبات).
Semantic 409: أبلغ السبب والإجراءات المقترحة.
4. 2 مستودعات البيانات
RDBMS: MVCC (عزل لقطة)، فهارس فريدة، فهارس جزئية.
متاجر KV/Doc: الإصدارات/التنقيحات (rev)، المقارنة والمبادلة (CAS).
تكرار متعدد الماجستير: استخدم/CRDT أو اكتب إلى القائد فقط للكيانات الحيوية.
4. 3 قوائم انتظار/بث
مرة واحدة بالضبط (عمليًا - «مرة واحدة فعليًا»): منتج المعاملات + الكتابة الذرية إلى الحوض.
Dedup على وحدة التحكم: تخزين آخر معرف N، منطق مزعج/دمج.
نمط Outbox/Inbox: نشر حدث متسق.
4. 4 تكوينات و IaC
دمج ثلاثي الاتجاهات في GitOps، بوابات السياسة (OPA/Kyverno) قبل الاستخدام.
Kustomize/Helm: استراتيجيات الدمج الحتمية وحظر «المفاتيح غير المعروفة».
Terraform: plan-diff كإشارة صراع «الانجراف مقابل المطلوب».
5) الخوارزميات والأمثلة
5. 1 دمج ثلاثي الاتجاهات (مبسط)
text resolve(base, ours, theirs):
diff1 = delta(base, ours)
diff2 = delta(base, theirs)
if independent(diff1, diff2): return apply(base, diff1 ⊕ diff2)
if conflictsOnlyInArrays: return arrayPolicyMerge(...)
else:
return CONFLICT with hunks
5. 2 OCC لموارد REST
http
Client reads
GET /accounts/42 -> ETag: "v17", body: {balance: 100}
Trying to write off
PUT /accounts/42
If-Match: "v17"
{balance: 50}
If someone has managed before
HTTP/1. 1 412 Precondition Failed
{error: "version_mismatch", currentEtag: "v18"}
يقوم العميل بإعادة القراءة وتطبيق الدلتا على الحالة الحالية والتكرار.
5. 3 الصراع الدلالي (ثابت)
pseudo on Debit(accountId, amount):
current = read(accountId)
if current. balance - amount < 0:
return REJECT ("insufficient _ funds") # write early detection (accountId, version = current. version+1, balance=current. balance - amount)
5. 4 CRDT: مجموعة OR (رسم تخطيطي)
تتم إضافة العناصر بعلامة فريدة، حذف - لعلامة معينة.
يتم حل نزاع «إضافة مقابل إزالة» باستخدام علامات الإزالة لإزالة العلامات المضافة المرئية فقط.
6) سياسة القرار: كيفية إضفاء الطابع الرسمي
وصف في العقيدة المعمارية:1. سلسلة الأولويات.
2. الاستراتيجيات حسب نوع البيانات: الأرقام القياسية/الكائنات/المصفوفات/الوسائط المتعددة.
3. نموذج السببية: هل تستخدم الإصدارات، Lamport، الساعات المتجهة.
4. دلالات الخسارة: ما يمكن أن يضيع في LWW، حيث هناك حاجة إلى الإجماع.
5. النوافذ الزمنية: TTL للتفريغ ونوافذ الغباء.
6. التصعيد: عند حظر الدقة التلقائية، متطلبات واجهة المستخدم/الموافقة.
7. التعويضات: استراتيجيات SAGA «تلغي/تعوض» عن إعادة تجميع الثوابت.
7) المقاييس و SLO
conflicts_total{type} هو التردد حسب النوع.
conflicts_resolved_auto_ratio - حصة التصاريح الذاتية.
mean_time_to_resolution هو متوسط وقت التسوية.
lost_update_incidents - حوادث التحديثات المفقودة.
idempotency_hit_rate - نسبة مفاتيح Idempotency التي نجحت.
divergence_depth هو عمق تباعد النسخة المتماثلة (متجهات النسخة).
مثال SLO: «≥ 99٪ من النزاعات النحوية يتم حلها تلقائيًا في ≤ 5 ثوانٍ، تتعارض الدلالات في ≤ 15 دقيقة مع HITL».
8) سيناريوهات عملية
8. 1 المدفوعات
المفتاح: Idempotency-Key، OCC بشكل عام، SAGA للخطوات القابلة للعكس.
التضارب: الشطب المزدوج → التخلص + إصدار الميزانية العمومية التحقق → التعويض الجزئي.
8. 2 المخزون/التذاكر
الخيارات: فتحة/مقعد متشائمة ؛ وتحفظ متفائل بانتهاء صلاحية TTL ؛ قائمة انتظار المقارنة والاحتياطي.
8. 3 المحتوى/الكتالوجات
الدمج الثلاثي + HITL: يختار المحرر المجموع ؛ قواعد السيارات للحقول «الآمنة» (علامات SEO التي لا تؤثر على السعر)
8. 4 GitOps/Kubernetes
تقديم الطلب والتصديق عليه قبل تقديمه ؛ ورفض المفاتيح المجهولة ؛ دون مراجعة.
كشف الانجراف والتراجع المفروض على السياسات.
9) الأنماط المضادة
LWW في كل مكان: البساطة على حساب خسارة السببية.
إعادة تصوير مخفية بدون خبث: نسخ مكررة تشبه الانهيار الجليدي.
لا توجد سياسة صريحة للمصفوفة - فقدان الصمت لنقاط التكوين.
المتحولات العالمية فوق الشبكات: SPOF والأقفال الطويلة.
التعويضات «العمياء» بدون تدقيق الأسباب: تضارب متكرر.
10) قائمة التنفيذ المرجعية
- تحديد أنواع التنازع في المجالات والثوابت.
- حدد آلية الإصدار (ETag/xmin/vector clock).
- تمكين الخصوصية في POST/الأوامر الحرجة.
- ضبط سياسة الدمج حسب نوع البيانات (الكميات القياسية/المصفوفات/الكائنات).
- تمكين المصدقين على المخطط والتحقق المسبق من نطاق الالتزام.
- إعداد مقاييس الاصطدام والتنبيه.
- بالنسبة للكيانات الحيوية - القائد/توافق الآراء، أو CRDT.
- تحديد تدفق HITL و UX (diff، التعليقات، سجل مراجعة الحسابات).
- وثائق المنظمات غير الحكومية وإجراءات التعويض.
11) الأسئلة الشائعة
س: متى تختار CRDT ومتى تختار الإجماع ؟
ج: يكون CRDT مناسبًا عندما يكون الاتساق النهائي مقبولًا ويكون التوافر العالي/الإدخالات المحلية مهمة. توافق الآراء - فيما يتعلق بالبيانات مع الثوابت الصارمة والترتيب الصارم للعمليات (الأرصدة النقدية، وحقوق الوصول).
س: هل LWW كافية ؟
ج: بالنسبة للمخابئ والمقاييس والفهارس الثانوية - غالبًا نعم. لبيانات المستخدم والمال، دائمًا لا.
س: كيف أختار نافذة تفريغ ؟
ج: ركز على الحد الأقصى المتوقع لتأخير إعادة التسليم + نفاخ الشبكة، أضف هامش 3-5 × البند 99.
س: هل يجب عليك دائمًا القيام بـ HITL ؟
ج: لا. اترك HITL لتضارب المنازعات/القيمة أتمتة وسجل الباقي.
12) المجاميع
الكشف الفعال عن النزاعات وحلها هو مزيج من الإصدار، والعلامات السببية، والثوابت، والسياسة الواضحة تكملها خوارزميات مناسبة (CRDT/OT/OCC/MVCC/توافق الآراء) وقابلية الملاحظة. وتظل النظم التي يكون فيها النزاع حالة «عادية» متاحة ويمكن التنبؤ بها ؛ حيث يكون التضارب «استثناء» ينهار في أسوأ وقت ممكن. حدد نموذجًا، وأضفي الطابع الرسمي على القواعد، وقياس النتيجة.