بناء خط أنابيب تحليلات احتيال في الزمن الحقيقي
جولة معمارية: استيعاب 50 ألف حدث/ثانية، وإثراؤها بالإشارات الذكية، وتقييم المخاطر في أقل من 10 مللي ثانية باستخدام محرّك البثّ لدينا.
إنّ معالجة 50٬000 حدث تعريف في الثانية، وإثراء كلٍّ منها بالإشارات الذكية، وإعادة درجة مخاطر في أقل من 10 مللي ثانية، تتطلّب معمارية بثّ مُصمَّمة بعناية. تستعرض هذه المقالة خط الأنابيب لدينا من الاستيعاب حتى القرار.
طبقة الاستيعاب
تصل الأحداث على هيئة طلبات HTTPS POST من وكيل JavaScript لدينا الذي يعمل داخل متصفحات الزوّار. يحتوي كل حدث على حمولة الإشارات المُشفَّرة — عادةً 8-12 كيلوبايت من البيانات المضغوطة تُغطّي أكثر من 130 إشارة متصفّح. تُنهي خوادمنا الطرفية اتصال TLS، وتتحقّق من توقيع الطلب، وتُمرِّر الحمولة إلى خط أنابيب المعالجة.
نستخدم نشراً متعدّد المناطق حيث تُوضَع الخوادم الطرفية بجوار عُقد CDN الخاصة بعملائنا. يُبقي هذا زمن الذهاب والإياب الشبكي دون 20 مللي ثانية لـ95% من الطلبات عالمياً. الخوادم الطرفية هي خدمات Go عديمة الحالة تعمل خلف موازِن أحمال، وتتوسّع أفقياً بناءً على حجم الطلبات.
استخراج الإشارات
تقوم مرحلة المعالجة الأولى بفكّ تشفير حمولة الإشارات وتحليلها. تُستخرَج كل إشارة ويُتحقَّق منها ويُحدَّد نوعها. تُدقَّق تجزئات Canvas مقابل قيم مستحيلة معروفة (تُشير إلى حجب Canvas أو انتحاله). تُتحقَّق مُعامِلات WebGL تحقّقاً متبادلاً للاتّساق. تُفحَص خصائص Navigator مقابل تركيبات صالحة معروفة.
تُنفِّذ هذه المرحلة أيضاً تطبيع الإشارات. تُحلَّل سلاسل وكيل المستخدم إلى مكوّنات مُهيكَلة (المتصفّح، الإصدار، نظام التشغيل، الجهاز). تُطبَّع أبعاد الشاشة لمراعاة تحجيم DPI. يُتحقَّق من إزاحات المنطقة الزمنية مقابل بيانات تحديد الموقع الجغرافي لعنوان IP.
إثراء الإشارات الذكية
تُثرى الإشارات المُستخرَجة بعد ذلك بتحليل الإشارات الذكية — طبقة الذكاء لدينا من جانب الخادم. يشمل هذا كشف التصفّح المتخفّي (بمقارنة أنماط الإشارات مقابل توقيعات تصفّح خاص معروفة)، وكشف VPN (بالإحالة المرجعية لبيانات IP مع إشارات المنطقة الزمنية واللغة المحلية)، وكشف التلاعب بالمتصفّح (بتحديد التناقضات التي تُشير إلى انتحال الإشارات)، وكشف الأجهزة الافتراضية (بالتعرّف على مواصفات العتاد المرتبطة بـVMware وVirtualBox والأجهزة الافتراضية السحابية).
تُحسَب كل إشارة ذكية بشكل مستقل وتُنتِج نتيجة منطقية (بوليان) ودرجة ثقة معاً. تُضيف مرحلة الإثراء 24 إشارة إضافية إلى كل حدث، ما يُوفّر تقييماً شاملاً للتهديدات يتجاوز ما يمكن تحقيقه بالتجميع من جانب العميل وحده.
محرّك تقييم المخاطر
يُمرَّر الحدث المُثرى إلى محرّك تقييم المخاطر لدينا — وهو نموذج شجرة قرار مُعزَّزة بالتدرّج مُدرَّب على ملايين الأحداث المُصنَّفة. يأخذ النموذج في الحسبان جميع الإشارات الخام التي يزيد عددها عن 130، و24 إشارة ذكية، وعدداً من السمات المُشتقّة: مقاييس السرعة (عدد الأحداث من هذا الجهاز خلال آخر 5 دقائق وساعة واحدة و24 ساعة)، وأنماط السلوك التاريخية، ودرجات سمعة الشبكة.
يُخرج النموذج درجة مخاطر بين 0 و100، إلى جانب أبرز العوامل المُساهِمة. فدرجة 85، مثلاً، قد تكون مصحوبة بعوامل مثل «كُشِف VPN»، و«وضع التصفّح المتخفّي»، و«سرعة عالية — 47 حدثاً في 5 دقائق». هذه القابلية للتفسير حاسمة لمحلّلي الاحتيال الذين يحتاجون إلى فهم سبب الإبلاغ عن حدث معيّن.
طبقة التخزين والاستعلام
تُحفَظ جميع الأحداث في ClickHouse — قاعدة بيانات عمودية مُحسَّنة للاستعلامات التحليلية على مجموعات بيانات كبيرة. تتعامل ClickHouse مع حجم الكتابة لدينا (50 ألف حدث/ثانية) دون أدنى عناء، ويُمكِّن تخزينها العمودي من استعلامات تحليلية دون الثانية على مليارات الصفوف.
نستخدم استراتيجية استبقاء متعدّدة المستويات. تُخزَّن البيانات الساخنة (آخر 7 أيام) على أقراص NVMe SSD لاستجابة استعلام دون 100 مللي ثانية. البيانات الدافئة (7-90 يوماً) على أقراص SSD قياسية. أما البيانات الباردة (أكثر من 90 يوماً) فتُضغَط وتُنقَل إلى تخزين الكائنات، وتظلّ قابلة للاستعلام لكن بزمن استجابة أعلى.
Kafka بوصفها العمود الفقري
تربط Apache Kafka خط الأنابيب معاً. تقرأ كل مرحلة من مواضيع Kafka وتكتب إليها. تكتب طبقة الاستيعاب الأحداث الخام. تقرأ مرحلة استخراج الإشارات الأحداث الخام وتكتب الأحداث المُستخرَجة. تقرأ مرحلة إثراء الإشارات الذكية الأحداث المُستخرَجة وتكتب الأحداث المُثراة. يقرأ محرّك تقييم المخاطر الأحداث المُثراة ويكتب الأحداث المُقيَّمة.
توفّر هذه المعمارية عدّة مزايا: يمكن توسيع المراحل بشكل مستقل، ولا تؤثّر الأعطال في مرحلة على غيرها، ويمكننا إعادة تشغيل الأحداث عبر أي مرحلة لأغراض التنقيح أو إعادة المعالجة. تُمكِّن مجموعات المستهلكين في Kafka من المعالجة المتوازية داخل كل مرحلة، وتضمن دلالة «مرة واحدة بالضبط» أنّ أي حدث لا يُعالَج مرّتين أو يُفقَد.
ميزانية زمن الاستجابة
هدفنا لزمن الاستجابة من الطرف إلى الطرف هو 10 مللي ثانية، من لحظة وصول حمولة الإشارات المُثراة إلى خط أنابيب المعالجة حتى لحظة إعادة درجة المخاطر. وهكذا تتوزّع الميزانية: يستغرق استخراج الإشارات 1-2 مللي ثانية، وإثراء الإشارات الذكية 3-4 مللي ثانية، وتقييم المخاطر 2-3 مللي ثانية، والتسلسل والاستجابة 1-2 مللي ثانية. أما قفزة Kafka بين المراحل فتُضيف أقل من 1 مللي ثانية في نشرنا المُتجاور.
يتطلّب الوفاء بهذه الميزانية باستمرار عند 50 ألف حدث/ثانية تحسيناً دقيقاً في كل مرحلة. نستخدم تجمّعات ذاكرة مُخصَّصة مسبقاً، وتسلسلاً بلا نسخ (zero-copy)، وكتابات ClickHouse مُجمَّعة. ويُترجَم نموذج تقييم المخاطر إلى شيفرة أصلية باستخدام ONNX Runtime، ما يُلغي عبء مُفسِّر Python.
أمضى Mark أسبوعين في تحليل أداء خط الأنابيب قبل أن يعثر على عنق الزجاجة في طبقة البحث الموزَّعة لدينا — كان قفل mutex وحيد يُسلسِل عمليات البحث عبر جميع الـgoroutines. وبعد التبديل إلى تصميم أقفال مُجزّأة، هبط p99 من 48 مللي ثانية إلى 9 مللي ثانية. أحياناً يكون الحلّ بسيطاً إلى حدّ محرج بمجرّد أن تعثر عليه.