الزمن الحقيقي، دون إطار عمل ضخم

الإشعارات الحيّة والمحادثة ولوحات المعلومات التي تُحدّث نفسها لا تحتاج منصّةً ثقيلة. إليك البنية الصغيرة المملّة التي نستخدمها — ولماذا المملّ هو المقصود.

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

PHP ينشر، Go يوزّع، وRedis بينهما

يبقى منطق أعمالنا في PHP، حيث ينتمي. وحين يقع ما يستحقّ الإرسال الفوري — رسالة جديدة، تحديث طلب، تغيّر مقياس — يكتب PHP حدثًا واحدًا إلى مجرى Redis. وتستهلك خدمة Go صغيرة أحادية الغرض ذلك المجرى وتوزّع الحدث عبر WebSockets إلى المتصفحات المتّصلة المعنيّة. هذا هو الشكل كله.

تقسيم العمل مقصود. PHP لا يُبقي اتصالًا حيًّا مفتوحًا أبدًا؛ وGo لا يمسّ قاعدة البيانات ولا قواعد العمل. كل جانب يفعل الشيء الوحيد الذي يُتقنه، ولا يصير أيٌّ منهما مكانًا ثانيًا يعيش فيه المنطق ثم يتباعد.

مصادقة دون تسريب رمز

يُثبت المتصفح هويّته بـتذكرة قصيرة العمر أحادية الاستخدام، لا برمزٍ طويل العمر يُلصَق في رابط حيث يتسرّب عبر السجلات والتاريخ. تُبادَل التذكرة لحظة الاتصال وتُستهلَك فورًا. طبقة الاتصال الحيّ لا يلزمها أن تعرف أعمالك — يلزمها فقط أن تعرف أنه أنت.

القاعدة التي تُبقيه صادقًا

الانضباط الوحيد الذي يجعل هذا موثوقًا: الاتصال الحيّ مُسرِّع، لا مصدر الحقيقة أبدًا. عند التحميل، وعند كل إعادة اتصال، يجلب المتصفح حالته الراهنة عبر HTTP عادي — ثم يُطبّق الأحداث الحيّة فوقها. وإن فاتته رسالة أثناء انقطاع، فالتحديث التالي يحملها. لا شيء مهم يوجد فقط كحدث زمن حقيقي.

تلك القاعدة هي سبب بقاء الأمر كله صغيرًا. لا نحتاج طبقة الاتصال الحيّ لتضمن التسليم، أو تُعيد إرسال ما فات، أو تنجو من كل حالة حدّية — لأن الحالة التي تُجلَب عبر HTTP العادي تغطّي ذلك كله أصلًا. ويُترَك جزء الزمن الحقيقي حرًّا ليفعل الشيء الوحيد الذي وُجد له: أن يجعل التحديث يبدو فوريًا.

المملّ، في البنية التحتية، مديح. نظام زمن حقيقي نادرًا ما تضطر للتفكير فيه هو نظامٌ بُني بالحجم الصحيح.

المزيد من المدونة

← كل المقالات