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

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

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

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

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

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

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

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

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

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

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

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

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

كل المقالات