Ledgerline
منصة مفتوحة المصدر، بُنيت باستخدام Claude Code · منصة مدفوعات مبنية كأنظمة البنوك
منصة مدفوعات لا تُخلق فيها الأموال ولا تضيع ولا تُنقل مرتين: دفتر قيد مزدوج على سجل أحداث، ومدفوعات البطاقات والتحويلات كمعاملات Saga، وصندوق صادر (outbox) إلى Kafka، وفحص احتيال فوري، وتحليلات في ClickHouse، وواجهة gRPC للتجار، وتتبّع OpenTelemetry، وكل ذلك مُثبت بإحداث الأعطال عمداً.

المشكلة
تُختبر أنظمة الدفع يوم الأعطال: رد ضائع أو قاعدة بيانات متوقفة أو طلب مكرر يجب ألا يخلق أموالاً أو يضيعها أو ينقلها مرتين، ونادراً ما تُظهر العروض ذلك.
الحل
دفتر قيد مزدوج على سجل أحداث، ومعاملات Saga لا تخمّن أبداً، وتساوي الأثر في كل مكان، وصندوق صادر إلى Kafka، ثم اختبارات فوضى وحمل ونموذج احتيال وتنبيهات، كلها مقيسة لا مفترضة.
التفاصيل التقنية
لا شيء ضاع ولا شيء نُفّذ مرتين عبر 11 سيناريو فوضى و40,461 طلباً؛ التقاط 88% من الاحتيال مقابل 37% للقواعد؛ نحو 430 تحويلاً/ث على نواة واحدة؛ كل تنبيه ثبت عمله؛ عرض حيّ وتكامل مستمر.
نظرة عامة
Ledgerline منصة مدفوعات مفتوحة المصدر بنيتُها باستخدام Claude Code لأعرض ما يحتاجه قلب نظام بنكي: أموال لا تُخلق ولا تضيع ولا تُنقل مرتين، حتى حين يتعطل كل ما حولها. يحفظ دفتر القيد المزدوج المكتوب بـKotlin وSpring Boot سجل أحداث لا يُعدَّل في PostgreSQL؛ والأرصدة إسقاطات يعاد بناؤها منه، وكل عملية كتابة متساوية الأثر، وتعيد المراجعة حساب الدفاتر. وتعمل فوقه مدفوعات البطاقات والاستردادات والتحويلات كآلات حالة ومعاملات Saga، ويصل كل تغيير إلى Kafka عبر صندوق صادر في المعاملة نفسها.
وقد أُثبت ذلك بإحداث الأعطال بينما يواصل عميل الدفع: إيقاف الخدمات وPostgreSQL وKafka قسراً، وقطع الشبكة، وقطع الردود في منتصفها. وعبر 11 سيناريو فوضى و40,461 طلباً (أُرسل 4,188 منها مرتين في آن واحد) لم يجد المدقق شيئاً ضاع ولا شيئاً نُفّذ مرتين. وكشفت اختبارات الحمل نقاط الاختناق: ينفّذ الدفتر نحو 430 تحويلاً في الثانية على نواة واحدة، ويرفض الفائض بدل أن ينهار.
التقط نموذج LightGBM المبني على خصائص فورية من Kafka 88% من الاحتيال مع 0.7% فقط من الرفض الخاطئ، مقابل 37% للقواعد المضبوطة، مقيساً على الحقيقة المخفية للمحاكي؛ وتطابق تحليلات ClickHouse الدفتر حتى آخر كوبيك. ويحصل التجار على واجهة gRPC وwebhooks موقّعة وSDK بلغة TypeScript: وحين أُوقفت الخدمة في منتصف الدفع، وصلت جميع التغييرات الـ1,085 إلى المتجر التجريبي. ويلاحق التتبّع الدفعة عبر الصندوق الصادر والعامل الخلفي والـwebhooks، وثبت عمل كل تنبيه بإحداث العطل الذي يراقبه.
ماذا يفعل
- دفتر قيد مزدوج بلغة Kotlin وSpring Boot على سجل أحداث لا يُعدَّل في PostgreSQL، بعمليات كتابة متساوية الأثر (idempotent)، ودون سحب على المكشوف مهما تزامنت الطلبات، ومراجعة تعيد حساب الدفاتر
- مدفوعات البطاقات والاستردادات والتحويلات إلى بنك محاكى غير موثوق كآلات حالة ومعاملات Saga؛ وكل تغيير يصل إلى Kafka عبر صندوق صادر في المعاملة نفسها
- يقيّم نموذج LightGBM الاحتيال فورياً بخصائص مأخوذة من Kafka، مقيساً على الحقيقة المخفية لمحاكٍ؛ وتحليلات ClickHouse تطابق الدفتر حتى آخر كوبيك
- واجهة gRPC وwebhooks موقّعة وSDK بلغة TypeScript للتجار؛ وتتبّع يلاحق الدفعة عبر الصندوق الصادر والعامل الخلفي والـwebhooks؛ وتنبيهات SLO ثبت أنها تعمل بإحداث كل عطل
الخطوة التالية
تبحث عن مطوّر Full-Stack أو Python — أو تحتاج إلى بناء شيء مشابه؟ لنتحدث.
منفتح على عروض العمل — حضورياً أو بنظام هجين في موسكو، أو عن بُعد؛ بدوام كامل أو بعقد. أردّ خلال 48 ساعة — وأسرع عبر Telegram.