خمسون شاشة، رابط واحد: كيف تعمل المزامنة الفورية فعلاً
خلف كواليس بنية WebSocket ثنائية المسار التي تبقي خمسين شاشة في تزامن مثالي مع مزامنة أولية دون 50 مللي ثانية.
· تقني · 9 min read
أكبر نشر شهدته شخصياً تضمّن 47 شاشة موزعة على ثلاثة طوابق في مركز مؤتمرات. شاشات ثقة في كل غرفة فرعية، وشاشات عد تنازلي في الممرات، وساعة رئيسية في القاعة الكبرى، ولوحات أجندة عند كل مدخل، وسطح تحكم على جهاز لوحي في مكتب الإنتاج. كل واحدة من تلك الشاشات عرضت نفس حالة المؤقت، محدّثة في نفس إطار الرسوم المتحركة، من رابط متصفح واحد. كلها متصلة بغرفة التحكم الرئيسية عبر مصفوفة الاتصال الداخلي الموحدة.
هذا هو السيناريو الذي يُعطّل معظم أدوات المؤقت على الويب. ليس شاشتين ولا خمساً. سبع وأربعون شاشة، متصلة عبر شبكة WiFi مكانية كانت تخدم في نفس الوقت 2000 حاضر يتصفحون ويراجعون بريدهم الإلكتروني ويحمّلون ملفات العروض. فهم لماذا يتعامل Timers Studio مع هذا السيناريو بموثوقية يتطلب فهم البنية التحتية.
يستخدم النظام نهج المسار المزدوج لمزامنة البيانات. المسار الأول يتعامل مع بيانات الحالة: إعدادات المؤقت وإعدادات السمة وبيانات التشغيل الوصفية وأسماء المتحدثين ومدد المقاطع. هذه البيانات تتغير نادراً وتتحمل زمن استجابة معتدل. تتزامن عبر طبقة الاشتراك الفوري في Supabase، التي تستخدم آلية الاستماع والإشعار في PostgreSQL لنشر التغييرات للعملاء المتصلين. عندما تعيد تسمية مؤقت أو تغيّر لون سمة، تتلقى كل شاشة ثقة وكل شاشة عرض متصلة ذلك التحديث خلال بضع مئات من المللي ثانية. لبيانات الحالة، هذه السرعة أكثر من كافية.
المسار الثاني يتعامل مع أوامر النقل: التشغيل والإيقاف المؤقت والتوقف وضوء التالي والسابق والإرجاع وتعديلات الوقت. هذه الأوامر تحتاج للوصول بأسرع ما هو ممكن فيزيائياً لأنها تؤثر على ما يراه الجمهور والمتحدثون في الوقت الفعلي. أوامر النقل تتجاوز قاعدة البيانات بالكامل. تنتقل عبر قناة بث WebSocket مخصصة يعيد الخادم ترحيلها لجميع العملاء المتصلين في وقت واحد. لا يخزّن الخادم هذه الأوامر. يستقبلها ويوزعها فوراً. هذا هو سبب بقاء زمن استجابة النقل تحت 10 مللي ثانية بغض النظر عن حمل قاعدة البيانات أو ازدحام الشبكة على قناة الحالة أو عدد الشاشات المتصلة. [اكتشف وحدة التحكم] وشاهد هذه السرعة بنفسك.
المزامنة الأولية هي القطعة الحرجة الأخرى. عندما تتصل شاشة Player جديدة بجلسة، لا يمكنها ببساطة البدء في تلقي تحديثات تدريجية. تحتاج الحالة الكاملة الحالية: أي مؤقت نشط وكم من الوقت متبقٍ وكيف يبدو إعداد العرض وما إذا كان منادي العرض يبث رسالة حالياً. يوصل Timers Studio لقطة الحالة الكاملة هذه في أقل من 50 مللي ثانية. يحتفظ الخادم بتمثيل مضغوط لحالة الجلسة الحالية في الذاكرة، وعند اتصال عميل جديد يرسل هذه اللقطة كأول رسالة WebSocket قبل بدء أي تحديثات تدريجية.
الأهمية العملية للمزامنة الأولية السريعة من السهل التقليل منها حتى تكون في بيئة إنتاج. الشاشات تنقطع وتعيد الاتصال طوال العرض. فني المكان يعيد تشغيل شاشة لإصلاح مشكلة دقة. شخص ما يغلق علامة تبويب متصفح بالخطأ ويعيد فتحها. نقطة وصول WiFi تعيد التشغيل. في كل هذه الحالات، تحتاج الشاشة المعاد اتصالها لعرض الحالة الصحيحة فوراً، ليس بعد مؤشر تحميل ولا بعد شريط تقدم ولا بعد فترة استقصاء مدتها خمس ثوانٍ. أقل من 50 مللي ثانية يعني أن شاشة الثقة تنتقل من فارغة إلى صحيحة بسرعة لا يستطيع المراقب معها تمييز أنها كانت منقطعة.
التوسع لخمسين شاشة متزامنة يقدم تحديات يتجاهلها معظم الدروس التعليمية حول WebSockets. النهج البسيط هو أن يرسل الخادم رسائل فردية لكل عميل، مما يعني خمسين رسالة لكل أمر نقل. هذا يتوسع خطياً ويخلق دفعة من الحركة الصادرة يمكنها إرهاق مخزن الشبكة المؤقت للخادم. يستخدم Timers Studio نمط البث حيث يكتب الخادم الرسالة مرة واحدة في القناة وتتولى بنية WebSocket التحتية التوزيع في طبقة النقل. تكلفة معالجة الخادم لا تزيد بشكل ملموس سواء كان عشرة أو خمسون عميلاً متصلين.
هناك أيضاً مسألة عواصف إعادة الاتصال. إذا انقطعت WiFi المكان لثلاثين ثانية ثم عادت، ستحاول جميع الشاشات الخمسين إعادة الاتصال بغرفة التحكم الرئيسية في وقت واحد. بدون هندسة دقيقة، يمكن لهذه الموجة أن تُعطل خادم WebSocket أو تخلق تدافعاً يُضعف الأداء لدقائق بعدها. منطق إعادة الاتصال في Timers Studio يستخدم التراجع الأسي مع التشويش، بمعنى أن كل عميل ينتظر فترة عشوائية مختلفة قليلاً قبل إعادة الاتصال. هذا يوزع حمل إعادة الاتصال على عدة ثوانٍ بدلاً من تركيزه في لحظة واحدة.
أريد تناول سؤال تطرحه فرق الإنتاج غالباً: ماذا يحدث إذا فشل اتصال الإنترنت بالكامل؟ شاشات Player تستمر في عرض آخر حالة معروفة. العد التنازلي الذي كان يعمل يستمر في العد محلياً لأن Player يحتفظ بحلقة رسوم متحركة خاصة به مدفوعة بآخر طابع زمني مستلم من الخادم. هذا يعني أنه حتى أثناء انقطاع الشبكة، يرى الجمهور مؤقتاً لا يزال يعد ولا يزال دقيقاً ضمن تحمل انحراف جهاز واحد على فترة قصيرة. عند استعادة الاتصال، يعيد Player المزامنة تلقائياً عبر مصفوفة الاتصال الداخلي، مصححاً أي انحراف متراكم دون قفزة مرئية.
تتعامل البنية أيضاً مع ظروف الشبكة المتباينة بسلاسة. في مكان حقيقي، ليس لكل شاشة نفس مسار الشبكة. بعضها على إيثرنت وبعضها على WiFi 5 غيغاهرتز وبعضها على 2.4 غيغاهرتز. الشاشات على الاتصالات الأسرع تتلقى التحديثات قبل بضع مللي ثوانٍ من الشاشات على الاتصالات الأبطأ، لكن الفرق غير محسوس لأن زمن الاستجابة المطلق لجميع المسارات يبقى جيداً تحت عتبة الإدراك البشري.
لمنتجي الأحداث الذين يقيّمون ما إذا كانت أداة مبنية على الويب يمكنها التعامل مع حجمهم، السؤال المناسب ليس "كم شاشة يمكنها دعمها" بشكل مجرد. السؤال المناسب هو ما إذا كانت البنية مصممة للتوصيل الفوري المتزامن أم مصممة لمستخدم واحد ثم وُسّعت بالاستقصاء والتخزين المؤقت كأفكار لاحقة. [جرب التجربة الآن] بفتح رابط Player في عدة علامات تبويب متصفح في وقت واحد. كل علامة تبويب تتصرف تماماً كشاشة فعلية منفصلة، والمزامنة بينها فورية ومتسقة.
نشر مركز المؤتمرات الذي وصفته في بداية هذا المقال عمل بلا عيب لثلاثة أيام. لم تكن هناك حاجة لإعادة مزامنة يدوية أبداً. لم تعرض أي شاشة ثقة حالة خاطئة. نسي فريق الإنتاج البنية التحتية للمؤقت تماماً، وهو بالضبط ما يجب أن تطمح إليه البنية التحتية. [أنشئ استوديوك الأول] وابدأ ببناء عرضك المتعدد الشاشات الآن.