مشروع · 2014 · مؤلف · مؤرشف

BluLogix CIS: فواتير الاتصالات تلتقي Salesforce عبر ETL

قاد تطوير الواجهة الأمامية وتكامل CIS مع Salesforce في BluLogix - منصة فوترة اتصالات على Java EE وGWT وTalend ETL مع تصميم BPMN.

Screenshot of blulogix.com - BluLogix cloud billing platform for telecom operators

ثمة فئة محددة من مشاكل التكامل تبدو بسيطة على لوح الرسم ثم تُعلّمك شيئاً جديداً كل أسبوع لمدة عام. تكامل CIS مع Salesforce في BluLogix كان تلك المشكلة.

BluLogix تبني Cloud Innovation Suite (CIS) - منصة فوترة سحابية لمشغّلي الاتصالات. ليس فوترة SaaS عامة. فوترة اتصالات تحديداً: رسوم قائمة على الاستخدام، وتسلسلات هرمية للخطط، وأسعار ترويجية، وإدارة حزم، وتعديلات منتصف الدورة، وفواتير بالتناسب. نوع التعقيد في الفواتير الذي لا يقدّره تقديراً كاملاً إلا من خاض فيه. كنت قائد فريق ومطوراً على الجانب الأمامي وقدت عمل تكامل Salesforce من 2013 إلى 2014.

لماذا فواتير الاتصالات نطاق خاص بها

فواتير الاتصالات ليست نسخة مبسّطة من الفوترة العامة. إنها تخصص مستقل بنماذج بيانات مستقلة.

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

نموذج البيانات يعكس ذلك التعقيد. للمشترك ملف تعريف خدمة. لملف التعريف خطة واحدة أو أكثر. لكل خطة استحقاقات وتجاوزات ومعدِّلات ترويجية. أحداث الاستخدام تصل باستمرار ويجب تسعيرها مقابل نسخة الخطة الصحيحة للفترة التي وقعت فيها - لأن المشترك قد يكون قد غيّر خطته خلال الدورة، أو قد يكون المشغّل قد غيّر شروط الخطة، ويجب أن يكون التسعير التاريخي صحيحاً.

هذا نطاق CIS. إنها تعرفه عمقاً. المشكلة أن أنظمة CRM - Salesforce تحديداً - تعرف نطاقاً مختلفاً تماماً.

مشكلة نماذج البيانات غير المتوافقة

Salesforce مبني حول نموذج كائنات CRM: Accounts وContacts وOpportunities وLeads وCases. يعرف العملاء والصفقات وتذاكر الدعم. لا يعرف المشتركين وملفات تعريف الخدمة وأحداث الاستخدام ودورات التسعير.

متطلب التكامل كان حقيقياً: مشغّلو الاتصالات الذين يستخدمون CIS يستخدمون أيضاً Salesforce لعمليات المبيعات والدعم. للمشترك في CIS Account مقابل في Salesforce. تغيير خطة CIS بدأه فريق الدعم في Salesforce يحتاج الانتقال إلى CIS دون أن يحتاج موظف الدعم تسجيل الدخول إلى CIS بشكل منفصل. تاريخ الفوترة يجب أن يكون مرئياً من داخل واجهة Salesforce دون الحاجة إلى تسجيل دخول منفصل.

هذه متطلبات منتج معقولة. وهي أيضاً، عملياً، مشكلة ترجمة نماذج بيانات في اتجاهين في آنٍ واحد.

Talend ETL: طبقة التكامل التي شُحنت فعلاً

كان النهج هو Talend ETL - منصة ETL مؤسسية - كطبقة تكامل بين CIS وSalesforce. لا تكامل API مباشر، لا خدمة middleware مخصصة، بل طبقة تنسيق وظائف ETL مخصصة تملك مسؤولية الترجمة بشكل صريح.

كان هذا القرار الصحيح لعدة أسباب لم تتضح بالكامل إلا بعد التجربة.

التحويل ذو حالة. تعيين مشترك CIS إلى Salesforce Account ليس ترجمة مرة واحدة. إنه مزامنة مستمرة. التغييرات تتدفق في كلا الاتجاهين. طبقة ETL تتتبع حالة المزامنة، وتتعامل مع التعارضات، وتدير تاريخ ما تمت مزامنته - وهذا عمل مختلف عن الذي يجب على محرك فوترة CIS أو مؤسسة Salesforce القيام به.

أنماط الفشل مختلفة. تكامل API مباشر بين نظامي إنتاج يقرن أنماط فشلهما: إن كانت API الـSalesforce بطيئة، هل تُبطّئ CIS؟ إن فشل دفع حدث CIS، هل يرى موظف الدعم في Salesforce بيانات قديمة أم خطأ؟ طبقة ETL تفصل تلك النطاقات. CIS تعمل، Salesforce تعمل، طبقة ETL تتعامل مع الفجوة.

قواعد العمل في مكان واحد. التعيين من ملف تعريف خدمة CIS إلى حقول Salesforce Account قاعدة عمل. كذلك تعيين حالة الخطة إلى مرحلة فرصة. وجود تلك القواعد في تكوين وظيفة ETL بدلاً من توزيعها عبر النظامين جعلها قابلة للتدقيق والاختبار والتغيير دون لمس أي نظام إنتاجي.

تصميم BPMN

سير عمل الفوترة وسير عمل التكامل صُمّمت بـBPMN - Business Process Model and Notation. ليس كتوثيق بعد الواقعة، بل كمواصفة نفّذها محرك سير العمل.

هذا الفرق مهم. BPMN كتوثيق هو مخطط دقيق يوم رسمه ثم ينجرف عن الواقع. BPMN كتنفيذ هو التعريف السلطوي لما يفعله النظام. حين أراد مشغّل اتصالات فهم سبب عدم انتشار تغيير خطة إلى Salesforce بعد، كانت الإجابة مخطط BPMN يُظهر بالضبط أين سير العمل، وأي شرط ينتظره، وما ستكون الخطوة التالية.

قدت تصميم BPMN لجانب التكامل. التحدي أن سير عمل فوترة الاتصالات لها تبعيات توقيت طبيعية - لا يمكنك تحديث Salesforce ببيانات الفاتورة قبل إغلاق دورة الفوترة - كان يجب التعبير عنها كشروط انتظار صريحة في نموذج سير العمل، لا كمؤقتات sleep أو جداول cron. الفرق أن سير عمل BPMN يعرف لماذا ينتظر ويمكنه الاستجابة بشكل صحيح حين يحلّ الشرط، بدلاً من الاستطلاع حتى يُطلَق المؤقت.

الواجهة الأمامية: GWT في 2013

بُنيت واجهة CIS الأمامية على GWT - Google Web Toolkit - الذي يُترجم Java إلى JavaScript. في 2013 كان هذا اختياراً معمارياً معقولاً لتطبيق بيانات مؤسسي معقد مع مساهمين كثيرين. أمان الأنواع الذي توفره Java عبر قاعدة كود كبيرة ليس تافهاً. نموذج المكوّنات كان ناضجاً. أدوات التصحيح كانت أفضل من بدائل نظام JavaScript البيئي آنذاك.

وهو أيضاً، في 2026، اختيار تقنية تجاوزه الزمن بشكل حاسم. منصة الويب تحرّكت. أطر JavaScript تقاربت على أنماط تجعل مقايضات GWT غير ضرورية. أذكره بصراحة لأنه جزء من المحاسبة الصادقة للعمل: بنيت واجهة مستخدم مهمة بـGWT، وقدت فريقاً يطور GWT، وأستطيع إخبارك بالضبط لماذا كان ذلك الاختيار منطقياً في 2013 وبالضبط لماذا لن أختاره اليوم.

أشرفت على فريق التطوير الأمامي وقدته - مراجعة الكود وقرارات الهندسة المعمارية والتنسيق على مستوى المهام الذي يُحدث الفرق بين فريق يسلّم وفريق ينتج pull requests لا تُدمج أبداً. كانت أول تجربة حقيقية لي في دور قيادة الفريق، والدروس منها (حول القرارات التقنية على مستوى الفريق، وحول الفجوة بين معرفة كيفية عمل شيء ومعرفة كيفية شرحه لشخص يتعلم) بقيت معي في كل دور لاحق.

ما كنت سأقوله لنفسي قبل الدخول فيه

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

عملت طبقة Talend ETL لأنها أخذت مهمة الترجمة بجدية كمهمة - لا كمحوّل رفيع مربوط بـAPI موجودة. كان لها حالتها الخاصة. كان لها معالجة فشلها الخاصة. كانت مسؤولة عن الفجوة بين عالم CIS وعالم Salesforce، وكانت تعرف تلك المسؤولية بوضوح.

ذلك النموذج - امتلك الحدود، لا تتظاهر أنها أرفع مما هي - هو الشيء الذي أستند إليه في كل مشكلة تكامل منذ ذلك الحين. أدوات مختلفة، نفس الرؤية.