دعني أكون صريحاً بشأن شيء واحد قبل الدخول في المعمارية: انتهى الدور لأن وحدة الأعمال أُغلقت في إعادة هيكلة استراتيجية. ليس لأن Mo كسر شيئاً. كانت الأنظمة تعمل بشكل جيد. Fintech غريبة بهذا الشكل — يمكنك شحن بنية تحتية ممتازة ثم تشاهد الهيكل التنظيمي ينهار تحتك على أي حال. على أي حال. لنصل إلى الجزء الممتع فعلاً.

ما يعنيه “تقييم الائتمان المدفوع بالأحداث” حين تتوقف عن المجاملة

إليك النسخة التي تظهر في كل وصف وظيفي في fintech: “معالجة معاملات عالية الحجم في معمارية مدفوعة بالأحداث.” إليك ما تعنيه فعلاً في سوق قروض يعمل بحجم جاد:

يُقدّم المقترض طلباً. هذا الطلب ليس صفاً في قاعدة بيانات سيلتقطه cron job في النهاية. إنه حدث، فوراً، وكتلة من الخدمات downstream تنتظره: pipeline تسجيل الائتمان، وطبقة كشف الاحتيال، وخطافات التقارير التنظيمية، ومنطق توجيه شركاء الإقراض. كل من هؤلاء دومين خاص به، كل منه له نمط فشل خاص به، والمتطلب أن لا أحد منهم يحجب الآخر. المسار السعيد يجب أن يعمل. المسارات غير السعيدة — timeout على شبكة استدعاء مكتب الائتمان، API شريك مُقرض تحدّث سرعته — يجب معالجتها دون أن يعرف المقترض أن شيئاً ما حدث على الإطلاق.

Kafka هو العمود الفقري هنا لأنك تحتاج الديمومة والإعادة وتقدم المستهلك المستقل. مكالمة مكتب الائتمان تفشل؟ مستهلكك يُعيد المحاولة من الـoffset المُلتزَم بحالة نظيفة. تحتاج إعادة تشغيل ثلاثة أيام من الأحداث لأن خدمة downstream كان بها خطأ؟ أعِد خيط المستهلك. تحتاج إعداد شريك مُقرض جديد يحتاج معالجة أحداث حدثت بالفعل؟ أعِد التشغيل مرة أخرى. هذا هو سبب وصول الفرق في هذا المجال إلى Kafka لا مجرد message queue: الـqueues تنسى، Kafka تتذكر.

القيد التنظيمي يُشكّل كل شيء downstream

البنية التحتية في Fintech ليست مجرد API تستدعي خدمات خارجية. كل قرار — كل عرض قرض، وكل حد ائتمان، وكل رفض — يجب أن يكون قابلاً للشرح. هذا ليس اختيارياً، إنه متطلب قانوني في ألمانيا وعبر الاتحاد الأوروبي. GDPR وBaFin وتوجيه الائتمان الاستهلاكي. مسار التدقيق ليس ميزة حسنة؛ إنه المنتج.

هذا يغيّر كيفية تصميم pipeline الأحداث. لا تستطيع فقط المعالجة والنسيان. الأحداث تحتاج أن تكون غير قابلة للتغيير ومنسوبة وقابلة للاسترجاع. الـschema لحدث في سير عمل ائتماني يحمل metadata أكثر من الحمولة في بعض الحالات — من بدأ القرار، وأي إصدار نموذج استُشير، وأي قاعدة نُفِّذت، وكيف بدت بيانات الإدخال في وقت اتخاذ القرار. كل ذلك يجب أن يبقى لسنوات.

على Kubernetes هذا يعني أنك تفكر أيضاً في دلالات الـexactly-once على جانب المستهلك، ومعالجات idempotent، وطوابير dead-letter يُراقَب عليها فعلاً بدلاً من النوع الذي يتراكم بصمت حتى يلاحظ أحد أن التنبيهات كانت مكتومة. اسألني كم عدد طوابير dead-letter التي رأيتها تُعامَل كتخزين للكتابة فقط.

شحن أتمتة الذكاء الاصطناعي والـLLM في backend منظّم مشكلة مختلفة

إليك الشيء المفقود في معظم الحديث المؤتمري حول تكامل الذكاء الاصطناعي في الخدمات المالية: النموذج ليس الجزء الصعب. الحصول على أتمتة LLM من مراجعة الامتثال، داخل pipeline الإنتاج، في بيئة مالية منظّمة — هذا هو الجزء الصعب.

حين كنت أقوم بهذا العمل في auxmoney، لم يكن التحدي هو القدرة. LLMs الحديثة مفيدة فعلاً لفهم المستندات، والتصنيف، واستخراج البيانات المُهيكلة من المدخلات غير المُهيكلة. التحدي كان الحوكمة. كيف تشرح قراراً ساعد فيه LLM؟ كيف تُصدر إصداراً للنموذج بحيث يمكن إعادة إنتاج قرار اتُّخذ في يناير وشرحه في أكتوبر حين يسأل منظّم؟ كيف تختبر أن مخرجات النموذج تُستخدم كإشارة في سير عمل يشمل الإنسان مقارنةً بسير عمل مؤتمت بالكامل، وكيف يُوثَّق ذلك؟

الإجابات تتضمن كثيراً من الهندسة غير المرئية للمستخدم. استدعاء النموذج في سير عمل ائتماني ليس استدعاء API خاماً؛ إنه استدعاء مُصدَر إصداراً ومُسجَّل وقابل للتدقيق مع قالب prompt ثابت مُثبَّت على إصدار نموذج محدد، مع المخرجات المُخزَّنة جانباً سجل القرار. يصبح LLM مكوّناً في pipeline قابل للتدقيق، لا صندوقاً أسود تستدعيه وتنسى. هذا أكثر تحفظاً مما تفعله معظم الفرق في التطبيقات الاستهلاكية، ويجب أن يكون كذلك. المخاطر مختلفة.

Playing Captain في قاعدة كود PHP + Java قديمة

“شديد العملية في قاعدة الكود كـPlaying Captain” هي لغة مؤسسية تعني: كنت مهندساً معمارياً رئيسياً كتب أيضاً كوداً وراجعه وأصلح الأشياء حين كانت تشتعل. في قاعدة كود fintech تعمل لعقد من الزمن، هذا يعني التنقل في حفريات ما هو موجود فعلاً. خدمات PHP تسبق هجرة Kubernetes جانباً microservices Java تسبق تبني Kafka جانباً أدوات Go جديدة كتبها أحد الربع الأخير.

عمل المعمارية لا ينفصل عن واقع الكود الموجود. لا تستطيع تصميم pipeline ائتمان مدفوع بالأحداث جميل جديد دون مراعاة خدمة PHP التي هي المصدر الحالي للحقيقة لحالة المقترض وليست مُعاد كتابتها هذا الربع. إذن تبني محوّلات، وتُنشر أحداث الدومين من حدود الأنظمة القديمة، وتُعرّف العقد على مستوى موضوع Kafka وتترك كل خدمة تملك تنفيذها. هذا ليس عملاً مُبهِجاً. إنه العمل الوحيد الذي يُشحن فعلاً.

AWS تحت كل شيء: EKS لأحمال عمل Kubernetes، وMSK لـKafka المُدارة، وRDS للحالة العلائقية التي تحتاج أن تكون علائقية. البنية التحتية ليست غريبة. المشاكل في الدومين، لا في الـstack.

ما يتركه هذا النوع من العمل لديك

البنية التحتية للإقراض المُنجزة بشكل صحيح هي من أكثر المجالات دقة تقنياً عملت فيها. مزيج حجم المعاملات العالي، ومتطلبات الـlatency الصعبة، وقابلية الشرح التنظيمي، والعواقب المالية للخطأ، يُنتج انضباطاً هندسياً لم أرَه مُكرَّراً في بيئات أخرى كثيرة.

شحنت أنظمة رعاية صحية على مستوى المستشفيات (EHR وصرف الأدوية وسير العمل السريرية)، وبنيت تطبيقات للمستهلكين، وأجريت حفريات التكامل المؤسسي. البنية التحتية لائتمان Fintech تجلس في فئة محددة: تعاقب على الإهمال في كل طبقة، وحين تُصيبها، تكون قد بنيت شيئاً متيناً فعلاً. إغلاق وحدة الأعمال لا يغير ما كان النظام يفعله قبل تغيّر الهيكل التنظيمي.

أنا حالياً بين مناصب، أعمل على مصدر مفتوح في Fulcrum — منصة تحكم وكلاء محلية أولاً — وأُقدّم استشارات. إذا كنت تبني بنية تحتية مالية مدفوعة بالأحداث وتريد التحدث عن المعمارية، تعرف أين تجدني.