مقدمة
ما الذي يقدمه Node فعليًا، وما الثمن الذي تدفعه في المقابل.
JavaScript من جهة الخادم
لديك واجهة API يجب كتابتها. تستقبل طلب HTTP، وتستعلم من قاعدة بيانات PostgreSQL، وتستدعي خدمتين خارجيتين، وتجمّع الردود ثم تعيد JSON. من أصل 180 مللي ثانية هي مدة هذه المعالجة، قد يعمل المعالج 4 مللي ثانية فقط. أما الباقي فانتظار: الشبكة والقرص وقاعدة البيانات. فالخادم التقليدي الذي يخصص خيط تنفيذ لكل طلب يُبقي ذاكرة المكدس محجوزة طوال 176 مللي ثانية دون أي عمل مفيد، ويتضاعف ذلك بعدد الطلبات المتزامنة. وعند ألف اتصال نشط، تتحول المسألة إلى مشكلة بالجيجابايت وتبديلات سياق كثيرة.
ينطلق Node.js من الملاحظة المعاكسة: ما دام الخادم يقضي وقته في الانتظار، فلا بأس بخيط تنفيذ واحد يعالج الأحداث تباعًا كلما أصبحت جاهزة. فالطلب الذي ينتظر قاعدة البيانات لا يشغل خيطًا، بل يشغل مدخلًا في جدول من دوال الاستدعاء الراجع (callbacks)، أي بضع مئات من البايتات. وهذه المقايضة، وهي وحدها، تفسر لماذا يتحمل Node بكفاءة عالية الأحمال القائمة على عمليات الإدخال والإخراج، ولماذا ينهار بمجرد أن يستقر حساب طويل نسبيًا في الخيط الوحيد. وفهم هذه الصفقة قبل كتابة السطر الأول سيجنبك نصف مشكلات الإنتاج.
ما هو Node فعليًا
Node ليس لغة برمجة. إنه بيئة تنفيذ تجمع ثلاثة مكونات: محرك JavaScript المسمى V8 الخاص بـ Chrome، الذي يترجم الشيفرة وينفذها؛ ومكتبة C المسماة libuv، التي توفر حلقة الأحداث وعمليات الإدخال والإخراج غير الحاجبة للنظام؛ ومكتبة قياسية تتيح لـ JavaScript أمورًا لا يمنحها المتصفح أبدًا — نظام الملفات، ومقابس TCP، والعمليات، والتشفير.
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش