تصميم دفتر أستاذ قائم على الأحداث يثق به المدققون
استمع إلى المقال
جارٍ تجهيز الصوت…
هندسة التقنيات المالية
أستخدم الأحداث لتوزيع العمل المالي، لكنني لا أسمح لناقل الرسائل بأن يعلن نفسه دفتر الأستاذ. أبدأ من حدّ ترحيل محاسبي متوازن وواضح.

ثلاثة سجلات مختلفة
في تحويل محفظة بقيمة 250 درهماً، يكون طلب التحويل أمراً يمكن رفضه. ويكون القيد المتوازن حقيقة محاسبية لا تُعدّل بعد الترحيل. أما TransferBooked فهو حدث تكامل ذو إصدار يخبر الأنظمة الأخرى بما حدث. قد تشترك السجلات في معرّف واحد، لكنها لا تملك السلطة نفسها.
يشرح عرض Square الهندسي لخدمة Books استخدام قيود متوازنة غير قابلة للتعديل كأساس للاتساق. وتوضح إرشادات AWS لنمط Transactional Outbox كيفية حفظ حالة المجال وسجل النشر في معاملة قاعدة بيانات واحدة، مع بقاء احتمال تكرار التسليم.
ضع الحد الذري حول الترحيل
قبل التثبيت، تحقّق من توازن المدين والدائن لكل عملة أو أصل، وصحة الحسابات والدقة النقدية وإصدار قاعدة الترحيل وعدم تكرار العملية التجارية. ثم أضف قيود اليومية وسجل outbox في معاملة واحدة. لا تنشر الحدث قبل نجاح الترحيل، ولا تكتب إلى قاعدة البيانات والناقل كعمليتين مستقلتين.
احفظ ثلاثة أزمنة: وقت التسجيل في المنصة، ووقت الأثر الاقتصادي، ووقت المصدر الخارجي. فالبيانات المتأخرة قد تُسجل اليوم ويعود أثرها إلى تاريخ سابق، ودمج الساعات يفسد تفسير الإقفال المالي.
اجعل الزمن والإصدارات جزءاً من العقد
أستخدم recorded_at لمعرفة متى قبلت المنصة القيد، وeffective_at لمعرفة متى يؤثر اقتصادياً في الكشف أو الفائدة، وsource_occurred_at لحفظ ساعة الشبكة أو المزود. قد يصل ملف تسوية اليوم عن أثر حدث بالأمس؛ إذا اختزلت الأزمنة في حقل واحد فلن أستطع تفسير الإقفال أو إعادة بناء ما عرفه النظام في لحظة معينة.
وللحدث مخطط ذو إصدار ومعرفات دلالية ثابتة. الإضافات المتوافقة أسهل، لكن تغيير معنى الترحيل يحتاج عقداً جديداً أو إصداراً واضحاً. أحفظ الحمولة الأصلية عندما يلزم الدليل التشغيلي، مع حماية البيانات الشخصية والأسرار، وأسجل أي محول طبق قبل وصولها إلى المستهلك.
التصحيح قيد جديد
إذا رُحّل المبلغ إلى حساب تاجر خاطئ، أنشئ معاملة عكس مرتبطة بالأصل ثم معاملة صحيحة. احفظ السبب والمنفّذ والموافقة. حذف السطر يزيل الدليل الذي استندت إليه كشوف سابقة. لكن «العكس» ليس حلاً عاماً؛ تحرير حجز تفويض قد يُمثَّل بتحرير مخصص أو حسابات تذكيرية وفق سياسة المنتج.
أعد بناء الإسقاطات لا الآثار الخارجية
يخزن مستهلك الإسقاط معرّف الحدث أو نقطة التحقق مع تحديثه المحلي، فيتحمل التسليم المتكرر. يمكن إعادة بناء الأرصدة التحليلية والكشوف من القيود، لكن إعادة تشغيل الأحداث القديمة يجب ألا تستدعي مزود دفع مجدداً. افصل الإسقاط النقي عن مدير سير العمل الذي ينفذ أثراً خارجياً وله هوية وعدم تكرار خاصان به.
عند إعادة البناء أبدأ من نقطة قطع معلومة، وأمنع المستهلك الجديد من اللحاق بالبث الحي قبل أن يثبت موقعه. يمكن استخدام سجل إزاحة أو معرف حدث وتحديثه ذرياً مع الإسقاط المحلي. وإذا وصل الحدث نفسه مرتين، يعيد المستهلك النتيجة المحلية نفسها من دون مضاعفة الرصيد أو الكشف.
أما مدير العملية الذي يرسل تحويلاً أو إشعاراً ذا أثر، فلا أعيد تشغيله كما أعيد بناء تقرير. أحفظ أمره وحالته ومفتاح عدم تكرار أثره في سجل مستقل، وأميز بين «إعادة قراءة حقيقة» و«طلب فعل جديد». هذا الفصل هو ما يجعل إعادة التشغيل أداة تعافٍ بدلاً من سبب لدفع المال مرة أخرى.
يحتاج المدقق إلى رابط متصل من الأمر إلى القيد إلى حدث outbox، وإلى إصدار قاعدة الترحيل وسلسلة التصحيح. راقب تأخر النشر والتكرار وعمر الرسائل المعزولة وانحراف الإسقاطات وفروق التسوية الخارجية.
ضوابط يستطيع المدقق اختبارها
أريد إثبات إصدار قاعدة الترحيل الذي صنع كل يومية، وقيد التوازن المطبق عند التثبيت، والرابط من الأمر إلى القيود ثم سجل outbox، والتصحيحات الممثلة كمعاملات مرتبطة، ونقاط تحقق كل إسقاط. وأقارن دورياً إجماليات الدفتر بدليل التسوية الخارجي، لأن الاتساق الداخلي لا يثبت أن الشبكة سجلت الأثر نفسه.
أختبر اللحظات الصعبة: تثبت قاعدة البيانات ثم يتعطل الناشر؛ يعيد الناقل التسليم بعد ضياع الإقرار؛ يغير نشر جديد تفسير مخطط؛ يصل تصحيح متأخر عبر فترة محاسبية؛ ويعاد بناء إسقاط بينما تستمر الأحداث الحية. ينجح التعافي فقط عندما تتفق الأرصدة والأدلة ونقاط التحقق، لا عندما تختفي الرسائل من قائمة الانتظار.
الخلاصة الدائمة
قاعدتي أن الأحداث توزع حقيقة مالية مثبتة ولا تصنع سلطتها. قبل الإنتاج أوثق معاملة قاعدة البيانات التي تحتوي القيود وسجل الإرسال، وكيف يحفظ الناشر تقدمه، وكيف يمنع كل مستهلك التكرار. أعيد بناء إسقاط في بيئة نظيفة وأقارنه بالإجماليات، ثم أحاكي تعطل الناشر والرجوع عن مخطط وتصحيحاً متأخراً. إذا لم يستطع الفريق تفسير اليومية ونقاط المستهلكين، فإعادة التشغيل ليست آمنة بعد.
أضيف إلى ذلك خطة واضحة للرسائل المعزولة. لا أعيدها بلا حدود؛ أسجل سبب الفشل وإصدار المستهلك وعدد المحاولات، وأفصل الخطأ المؤقت عن مخالفة العقد. بعد إصلاح السبب أعيد المعالجة من معرف ثابت وأثبت أن التحديث المحلي لم يطبق سابقاً. وإذا كانت الرسالة تمثل حقيقة مالية صحيحة لكن مستهلكاً واحداً لا يفهمها، فلا أعدل الحقيقة لتناسب ذلك المستهلك.
أراجع حدود الاحتفاظ أيضاً. قد ينتهي عمر رسالة الناقل قبل حاجة التدقيق أو إعادة بناء كشف تاريخي، لذلك يكون الدفتر ومخزن الدليل المرجع طويل الأجل، لا فترة احتفاظ الموضوع. أوثق من أين تبدأ إعادة البناء، وكيف تستعاد الإصدارات القديمة للمخططات والمحولات، ومن يوافق على حذف الدليل.
في تمرين تشغيل كامل أنشر القيد، وأوقف الناشر، وأعيده، وأكرر الحدث، وأعيد بناء إسقاط بالتوازي، ثم أرسل تصحيحاً بتاريخ أثر سابق. أقارن الإجماليات ونقاط التحقق والرسائل المعزولة والدليل الخارجي. نجاح كل خطوة منفردة لا يكفي؛ المطلوب أن تظل القصة المالية واحدة عند جميع القراء.
وأمنع المستهلكين من استنتاج قيود جديدة من حدث تكامل مختصر إذا كان دفتر الأستاذ يملك قاعدة الترحيل. يمكن لخدمة الكشف أو التحليل عرض الحقيقة، لكن إنشاء أثر محاسبي آخر يحتاج أمراً صريحاً وهوية وقاعدة معتمدة. هذا يمنع نسخاً متعددة من المنطق المالي من الانحراف مع الزمن، ويجعل الحدث إشارة إلى حقيقة واحدة بدلاً من مادة خام لتفسيرات مالية متعارضة.
وأراجع هذا الحد كلما ظهر مستهلك جديد أو تغير عقد الحدث، لأن الملكية المالية يجب ألا تنتقل ضمنياً مع توسع المنصة.
قاعدتي التصميمية أن الأحداث توزع حقيقة مالية مثبتة ولا تصنع سلطتها. أثق بالدفتر حين تُثبت القيود المتوازنة ذرياً، وتحفظ التصحيحات التاريخ، ويعود كل حدث مشتق إلى قيد محدد.
ما القرار الذي كنت ستتخذه؟
شارك سؤالاً أو تجربة أو رأياً مخالفاً. التعليقات متاحة للأعضاء المسجلين للحفاظ على نقاش مهني ومفيد.