الواجهة الخلفية للكازينو التي تربط السلوتس وألعاب الموزّع المباشر وألعاب الطاولة من مزوّدين كثيرين تحتاج إلى طبقة تجميع واحدة: جلسات يُصدرها المشغّل، وردود استدعاء للرصيد تصمد أمام إعادات المحاولة وعمليات التراجع، وجولات قد تُغلق بعد الجلسة، ومطابقة يومية مع التقرير الخاص بكل مزوّد. هكذا تُقسَّم هذه الطبقة، وأين تتعطل تكاملات المزوّدين عادةً.
المشغّل الذي يبني واجهة خلفية خاصة به للكازينو ويربط بها السلوتس وألعاب الموزّع المباشر وألعاب الطاولة من مزوّدين كثيرين ينتهي به الأمر إلى عقود تكامل بعدد المزوّدين: مسارات إطلاق مختلفة، واستدعاءات محفظة مختلفة، وتصورات مختلفة لماهية الجولة. وطبقة التجميع تحوّلها إلى عقد داخلي واحد، فتُكتب المحفظة واللوبي والمكافآت والحدود والتقارير مرة واحدة، ويُكيَّف كل مزوّد معها.
فيما يلي كيف تُقسَّم هذه الطبقة عادةً: ما يبقى لدى المزوّد، وكيف تُصدَر الجلسات، وكيف تصمد ردود استدعاء الرصيد أمام إعادات المحاولة وعمليات التراجع (rollbacks)، وكيف تُسجَّل الجولات حين تُغلق بعد الجلسة، وكيف تُطابَق النتيجة مع أرقام المزوّد نفسه.
الجواب القصير هو عقد داخلي واحد مع محوّل لكل مزوّد. المشغّل يُصدر الجلسة؛ وكلٌّ من الخصم والإضافة للرصيد والتراجع يحمل ID المعاملة لدى المزوّد بوصفه مفتاح idempotency ضمن نطاق المزوّد ونوع الاستدعاء؛ والتراجع عن معاملة لم ترها المحفظة قط يُخزَّن، فتُرفض المعاملة الأصلية المتأخرة؛ والجولات تُسجَّل بوصفها حالة قد تُغلق بعد انتهاء الجلسة؛ وتقرير كل مزوّد الخاص به يُطابَق مع دفتر أستاذ المحفظة كل يوم.
المزوّد يشغّل اللعبة: توليد الأرقام العشوائية، ورياضيات اللعبة، وعميل اللعبة واعتمادها من مختبر اختبار. والمشغّل يحتفظ بكل ما يمسّ اللاعب والمال: الهوية، والرصيد، والحدود، والمكافآت، واللوبي، والسجلات التي قد تطلبها جهة تنظيمية أو نزاع مع لاعب. وطبقة التجميع تقع بينهما، وينبغي أن تكون الكود الوحيد في جانب الخادم الذي يتخاطب مع واجهة API الخاصة بكل مزوّد.
يتصل المزوّدون بأموال المشغّل بإحدى طريقتين. في المحفظة السلسة (seamless wallet) يبقى الرصيد لدى المشغّل، ويستدعي المزوّد محفظة المشغّل عند كل رهان ومكسب. وفي محفظة التحويل (transfer wallet) ينقل المشغّل المال قبل اللعب إلى رصيد محفوظ في جانب المزوّد، ولا يعيده إلا حين يطلبه.
تفترض بقية هذه المقالة محفظة سلسة، لأن كل رهان ومكسب فيها استدعاءٌ للمحفظة.
يبدأ إطلاق اللعبة في جانب المشغّل. تتحقق الواجهة الخلفية من أنه يجوز لهذا اللاعب أن يلعب هذه اللعبة الآن، وهو ما يشمل حالة الحساب، والاستبعاد الذاتي، والحدود، وما إذا كان يجوز تقديم اللعبة في الولاية القضائية للاعب. ثم تُنشئ جلسة مرتبطة باللاعب واللعبة والعملة، وتمرّر إلى المزوّد عند الإطلاق رمزًا معتمًا (opaque token). وحين يُجري خادم المزوّد رد الاستدعاء، يحدد ذلك الرمز رصيدَ مَن يتعلق به الاستدعاء.
الوثائق المنشورة للمشغّلين تقول ذلك صراحةً. تقول واجهة API للمحفظة لدى Hub88 إنه يجب عدم التحقق من صلاحية الرمز في المكاسب وعمليات التراجع، لأنها قد تصل بعد أن يكون الرهان قد لُعب. وتقول VeliGames إنه لا يجوز للمشغّل رفض المكسب في جولة حتى لو انتهت صلاحية الجلسة.
أي استدعاء بين خادمين قد تنتهي مهلته بعد أن يكون العمل في الطرف الآخر قد أُنجز. والمزوّد لا يستطيع التمييز بين خصم فشل وخصم ضاع الرد عليه، فيكرر الاستدعاء أو يلغي المعاملة. ومهمة المحفظة أن تجعل كلا الأمرين آمنًا.
تُظهر وثائق التكامل المنشورة مدى إلحاح التكرارات. فواجهة API لمحفظة المشغّل لدى Hub88 تعدّ الرهان فاشلًا حين لا تتلقى HTTP 200، فتُنشئ تراجعًا وتعيد محاولة ذلك التراجع حتى 500 مرة مع تباعد أُسّي بين المحاولات (exponential back-off). وتعيد Gamomat محاولة الطلب الفاشل مرتين بفاصل 500 ms، ثم تبدأ تراجعًا وتعيد محاولته على فترات تتزايد من ثانية واحدة إلى 30 دقيقة. ومهلة المحفظة لدى Tom Horn Gaming هي 10 ثوانٍ، يُرسَل بعدها تراجع تلقائيًا. والمحفظة التي تتوقف بضع دقائق تعود إلى طابور من التكرارات وعمليات التراجع، لا إلى الصمت.
الرد المتوقع على التكرار ليس موحّدًا هو الآخر. تشترط Hub88 ألا تُعالَج الطلبات التي تحمل ID المعاملة نفسه مرتين، وأن يكون الرد هو نفسه لكل الطلبات المكررة؛ وتطلب VeliGames خطأً مع HTTP status 409 وDUPLICATE_TRANSACTION؛ ولدى Tom Horn Gaming كود نتيجة منفصل للمرجع المكرر. ويجيب المحوّل كل مزوّد بصيغته الخاصة، ويبقى دفتر الأستاذ تحته كما هو.
التراجع عن معاملة مجهولة يسهل الخطأ فيه. فإن لم تحتفظ المحفظة بشيء، يصل بعد لحظة خصمٌ تأخر في الطريق فحسب وينجح، فيدفع اللاعب ثمن رهان ألغاه المزوّد بالفعل. وتخزين التراجع أولًا والتحقق من وجوده تحت قفل الحساب الذي يأخذه الخصم يسدّ هذه الثغرة.
ينص المزوّدون على هذه القاعدة في وثائقهم الخاصة. تقول واجهة API الخاصة بالمشغّلين لدى St8 إنه حين يتلقى المشغّل ID معاملة لعملية إلغاء لم يعالجها من قبل، يجب حفظ هذا الـ ID لمنع معالجته لاحقًا. وتتوقع Tom Horn Gaming كود النتيجة الخاص بالمعاملة المجهولة لديها حين لا تكون المحفظة قد عالجت قط عملية السحب التي يشير إليها التراجع.
الجولة هي وحدة اللعب لدى المزوّد، ونادرًا ما تقابل معاملة واحدة. فدورة السلوتس كثيرًا ما تكون خصمًا واحدًا وإضافة واحدة للرصيد، يُرسَلان أحيانًا في استدعاء واحد. والبلاك جاك قد يضيف عمليات خصم عند التقسيم أو المضاعفة. والروليت المباشر يتلقى رهانات من لاعبين كثيرين خلال نافذة مراهنة ويسوّيها جميعًا حين تُعرف النتيجة. والجولات المجانية قد تُنتج سلسلة من المكاسب المترابطة.
سجل الجولات هو ما يُحسم به النزاع مع اللاعب. احفظ كل قيد في دفتر الأستاذ مع المزوّد واللعبة والجولة والمبالغ والرصيد قبله وبعده، وطابعين زمنيين، طابع المزوّد وطابع المحفظة، واربط به تفاصيل الجولة لدى المزوّد نفسه حيث توفّرها واجهة API الخاصة به. وبذلك يُجاب من السجلات عن سؤالٍ يخص المال في دورة واحدة.
الجهات التنظيمية تحدد الحد الأدنى الذي يجب أن يغطيه هذا السجل. فـ GLI-19، وهو معيار أنظمة الألعاب التفاعلية الصادر عن Gaming Laboratories International، يشترط توفير خاصية استرجاع اللعبة (game recall) للاعب، إما في صورة إعادة تمثيل وإما بالوصف. وتشترط المعايير التقنية للمقامرة عن بُعد الصادرة عن هيئة المقامرة البريطانية (UK Gambling Commission) ثلاثة أشهر على الأقل من سجل الحساب والمقامرة دون التواصل مع المرخَّص له، و12 شهرًا على الأقل عند الطلب. ويمنح توجيه حماية اللاعبين الصادر عن سلطة الألعاب في مالطا (Malta Gaming Authority) اللاعبَ إمكانية الوصول إلى سجل مقامرته عن الأشهر الستة السابقة مباشرةً.
السلوتس توزّع الحمل على الزمن، لأن كل لاعب يلعب دوراته وفق توقيته الخاص. أما طاولات الموزّع المباشر فتُزامِن اللاعبين: رهانات كل من على الطاولة تصل في الثواني التي تسبق إغلاق المراهنة، ومكاسب الجميع تصل معًا حين تُعرف النتيجة. والطاولة الرائجة تكرر ذلك لكل لاعب راهن.
المحوّلات هي موطن الاختلافات بين المزوّدين، وينبغي أن تكون موطنها الوحيد. يتولى كل محوّل ما يلي:
يبقى العقد الداخلي صغيرًا: فتح جلسة، وقراءة الرصيد، والخصم، والإضافة للرصيد، والخصم والإضافة للرصيد في استدعاء واحد، وصرف مبلغ دون رهان، والتراجع، وإغلاق جولة، ومجموعة ثابتة من الأخطاء التي يمكن للمحفظة أن تُرجعها. وعندئذ يكون المزوّد الجديد محوّلًا ومجموعة اختبارات، ونادرًا ما يكون تغييرًا في المحفظة.
يحتفظ كل مزوّد بسجله الخاص لكل جولة ويُصدر منه فواتيره للمشغّل. ودفتر أستاذ طبقة التجميع هو جانب المشغّل من المال نفسه. طابِق الاثنين كل يوم، وفق حدود اليوم والمنطقة الزمنية لدى كل مزوّد، لكل مزوّد وعملة ولعبة:
المدة التي يجب أن تُحفظ فيها هذه الأدلة جزء من التكامل. تطلب Hub88 تخزين ID كل معاملة لدى الطرفين مدة أربعة أشهر على الأقل لأغراض المطابقة، وتُرجع واجهة API الخاصة بالمشغّلين لدى Gamomat بيانات المطابقة لنطاق زمني أو لجولة واحدة.
لهذا السؤال ثلاثة أنواع من الإجابات، وهي تبيع أشياء مختلفة. فالمجمّعون ومورّدو المنصات يؤجّرون طبقتهم للمشغّل: عقد واحد، ومزوّدون كثيرون، وشروطهم التجارية. ومنصات turnkey وwhite-label تضمّ الطبقة داخل منصة يملكها المورّد. أما شركات الهندسة فتبني الطبقة داخل الواجهة الخلفية للمشغّل، والمشغّل يوقّع عقوده مع المزوّدين بنفسه.
أيًّا كان النوع الذي تتحدث إليه، فهذه الأسئلة تُظهر ما إذا كان الفريق قد بنى هذا من قبل:
الإجابة التي تبقى عامة في السؤالين الأولين تعني أن الحالات الحدّية ستُكتشف في الإنتاج.
amBrain شركة تطوير برمجيات متخصصة في منصات التداول ومحركات المطابقة وأنظمة المزايدة الفورية وهندسة منصات الكازينو. وتبني amBrain البرمجيات منذ عام 2019.
في iGaming، الأرقام التي تنشرها amBrain بوصفها مقيسة هي أكثر من 500 تكامل مع مزوّدين خارجيين و12 مشغّلًا في الإنتاج.
تعمل amBrain بثلاث صيغ: تسليم كامل، أو فريق مخصص، أو مهندسون مدمجون في فريقك. ويحتفظ العميل بالملكية الكاملة للمنتج وللكود، باستثناء مكوّنات amBrain القابلة لإعادة الاستخدام.
تشرح هذه المقالة كيف تعمل طبقة التجميع؛ وهي ليست دراسة حالة، ولا تسمّي أي عملاء.
لذا فالقرار الأول ليس أي المزوّدين توقّع معهم. بل العقد الداخلي الذي سيُكيَّف معه كل مزوّد، مدوَّنًا مع حالات الخطأ الخاصة به قبل أن يوجد أول محوّل.
أحضر بنيتك الحالية وسيناريو الفشل الذي يقلقك، وسنراجعه معًا خلال نصف ساعة.