مقدمة
إذا كنت قد سمعت عن العقدة ، أو قرأت بعض المقالات التي تدعي مدى روعة العقدة ، فقد تفكر ، "ما هي بالضبط العقدة؟" على الرغم من أنه ليس للجميع ، فقد تكون العقدة هي الخيار الصحيح لبعض الناس.
لمحاولة شرح ماهية Node.js ، تستكشف هذه المقالة المشكلات التي يمكن أن تحلها ، وكيفية عملها ، وكيفية تشغيل تطبيق بسيط ، وأخيراً ، عندما تكون العقدة ومتى لا تكون حلًا جيدًا. لا تغطي هذه المقالة كيفية كتابة تطبيق عقدة معقدة ، كما أنها ليست برنامج تعليمي شامل للعقدة. يجب أن تساعدك قراءة هذه المقالة في تحديد ما إذا كان يجب عليك تعلم العقدة من أجل استخدامها لعملك.
ما هي العقدة المصممة لحل؟
هدف Node المدعوم علنًا هو "توفير طريقة بسيطة لبناء برامج شبكة قابلة للتطوير". ما هي مشاكل برنامج الخادم الحالي؟ دعونا نفعل مشكلة في الرياضيات. بلغات مثل Java ™ و PHP ، يقوم كل اتصال بإنشاء مؤشر ترابط جديد ، والذي قد يتطلب 2 ميغابايت من الذاكرة المصاحبة لكل مؤشر ترابط جديد. على نظام يحتوي على 8 جيجابايت من ذاكرة الوصول العشوائي ، يبلغ الحد الأقصى لعدد الاتصالات المتزامنة 4000 مستخدم. مع نمو قاعدة عملائك ، تريد أن يدعم تطبيق الويب الخاص بك المزيد من المستخدمين ، لذلك يتعين عليك إضافة المزيد من الخوادم. بطبيعة الحال ، فإن هذا يزيد من تكاليف العمل ، وخاصة تكاليف الخادم وتكاليف الشحن وتكاليف العمالة. بالإضافة إلى زيادات التكاليف هذه ، هناك مشكلة فنية: يجوز للمستخدمين استخدام خوادم مختلفة لكل طلب ، لذلك يجب مشاركة أي مورد مشترك بين جميع الخوادم. على سبيل المثال ، في Java ، يجب مشاركة المتغيرات الثابتة وذاكرة التخزين المؤقت بين JVMs على كل خادم. هذا هو عنق الزجاجة في بنية تطبيق الويب بأكملها: الحد الأقصى لعدد الاتصالات المتزامنة التي يمكن للخادم التعامل معها.
حل Node لهذه المشكلة هو تغيير الطريقة التي يتصل بها الاتصال بالخادم. يقوم كل اتصال بإنشاء عملية لا تتطلب كتلة ذاكرة مصاحبة ، بدلاً من إنشاء مؤشر ترابط OS جديد لكل اتصال (وتخصيص بعض الذاكرة المصاحبة لها). تدعي العقدة أنها لن تتوافق أبدًا لأنها لا تسمح للأقفال على الإطلاق ، ولن تمنع مكالمات الإدخال/الإخراج مباشرة. تدعي العقدة أيضًا أن الخادم الذي يعمل عليه يمكن أن يدعم عشرات الآلاف من الاتصالات المتزامنة. في الواقع ، تقوم العقدة بتغيير وجه الخادم عن طريق تغيير الاختناقات في جميع أنحاء النظام من الحد الأقصى لعدد الاتصالات إلى حركة المرور لنظام واحد.
الآن بعد أن أصبح لديك برنامج يمكنه التعامل مع عشرات الآلاف من الاتصالات المتزامنة ، ما الذي يمكنك بناء العقدة بالفعل؟ إذا كان لديك تطبيق ويب يحتاج إلى التعامل مع العديد من الاتصالات ، فسيكون ذلك شيئًا "فظيعًا"! هذه "إذا كان لديك هذه المشكلة ، فهي ليست مشكلة على الإطلاق". قبل الإجابة على السؤال أعلاه ، دعونا نلقي نظرة على كيفية عمل Node وكيف تم تصميمها للعمل.
العقدة بالتأكيد ليست
نعم ، العقدة هي برنامج خادم. ومع ذلك ، فإنه بالتأكيد لا يبدو مثل أباتشي أو تومكات. هذه الخوادم هي منتجات خادم مستقلة تسمح بتثبيت التطبيقات ونشرها على الفور. مع هذه المنتجات ، يمكنك الحصول على خادم وتشغيله في دقيقة واحدة. العقدة بالتأكيد ليست هذا النوع من المنتجات. يمكن لـ Apache إضافة وحدة PHP للسماح للمطورين بإنشاء صفحات ويب ديناميكية ، ويمكن للمبرمجين الذين يستخدمون TOMCAT نشر JSPs لإنشاء صفحات ويب ديناميكية. العقدة هي بالتأكيد ليست هذا النوع.
في المراحل المبكرة من العقدة (الإصدار 0.4.6 حاليًا) ، لم يكن برنامج خادم "جاهز للتشغيل" ، ولا يمكنك تثبيته ، ووضع الملفات فيه ، ولديك خادم ويب يعمل بالكامل. حتى إذا كنت ترغب في تنفيذ الوظيفة الأساسية لخادم الويب وتشغيلها بعد اكتمال التثبيت ، فلا يزال هناك حاجة إلى الكثير من العمل.
كيف تعمل العقدة
العقدة نفسها تعمل V8 JavaScript. انتظر ، جافا سكريبت على الخادم؟ هذا صحيح ، لقد قرأته بشكل صحيح. يعد JavaScript من جانب الخادم مفهومًا جديدًا نسبيًا تم ذكره منذ حوالي عامين عند مناقشة منتج Aptana Jaxer على DeveloperWorks (انظر الموارد). على الرغم من أن Jaxer لم يكن أبدًا شائعًا حقًا ، إلا أن المفهوم نفسه ليس بعيدًا عن متناول اليد - لماذا لا يمكننا استخدام لغة البرمجة المستخدمة على العميل على الخادم؟
ما الذي يجعل V8؟ محرك V8 JavaScript هو محرك JavaScript الأساسي الذي يستخدمه Google لمتصفح Chrome. قليل من الناس يفكرون في ما يفعله جافا سكريبت بالفعل على العميل؟ في الواقع ، محرك JavaScript مسؤول عن تفسير وتنفيذ الكود. باستخدام V8 ، أنشأت Google مترجمًا فائقًا مكتوبًا في C ++ يحتوي على ميزة فريدة أخرى ؛ يمكنك تنزيل المحرك وتضمينه في أي تطبيق. لا يقتصر على الجري في متصفح واحد. لذلك ، تستخدم Node في الواقع محرك V8 JavaScript الذي كتبه Google وإعادة بناءه للاستخدام على الخادم. مثالي جدا! الآن بعد أن يتوفر حل جيد ، لماذا إنشاء لغة جديدة؟
البرمجة التي تعتمد على الحدث
قام العديد من المبرمجين بتثقيفهم للاعتقاد بأن البرمجة الموجهة للكائنات هي تصميم البرمجة المثالي ويرفضون طرق البرمجة الأخرى. تستخدم Node ما يسمى نموذج البرمجة القائم على الحدث.
سرد 1. البرمجة التي يحركها الحدث باستخدام jQuery على العميل
نسخة الكود كما يلي:
// رمز jQuery على جانب العميل يوضح كيف تعمل البرمجة التي تعتمد على الحدث
// عند الضغط على زر ، يحدث حدث - تعامل معه
// مباشرة هنا في وظيفة مجهولة ، حيث
// متغيرات ضرورية موجودة ويمكن الرجوع إليها مباشرة
$ ("#mybutton"). انقر فوق (function () {
if ($ ("#mytextfield"). val ()! = $ (this) .val ())
تنبيه ("يجب أن يتطابق الحقل إلى نص زر") ؛
}) ؛
في الواقع ، لا يوجد فرق بين الخادم والعميل. نعم ، لا توجد عملية نقرة زر ، ولا يوجد إجراء لتكوين حقل نص ، ولكن على مستوى أعلى ، يحدث الحدث. تم إنشاء اتصال - حدث! يتم استلام البيانات من خلال الاتصال - الأحداث! تتوقف البيانات من خلال الاتصال - الحدث!
لماذا هذا الإعداد مثالي للعقدة؟ JavaScript هي لغة برمجة رائعة تعتمد على الأحداث لأنها تتيح وظائف وإغلاق مجهولة ، والأهم من ذلك ، أن أي شخص كتب رمزًا على دراية بتجنيده. يمكن كتابة وظيفة رد الاتصال المسمى عند حدوث حدث في حدث الالتقاط. وبهذه الطريقة ، من السهل الكتابة والمحافظة على الكود ، دون أطر معقدة موجهة نحو الكائن ، دون واجهات ، وبدون القدرة على تنظيم أي شيء عليها. ما عليك سوى الاستماع إلى الحدث ، واكتب وظيفة رد الاتصال ، ثم تعتني البرمجة التي تعتمد على الحدث بكل شيء!
عينة تطبيق العقدة
أخيرًا ، دعونا نلقي نظرة على بعض التعليمات البرمجية! لنجمع بين كل شيء ناقشناه وننشئ تطبيق العقدة الأول. نظرًا لأننا نعلم بالفعل أن العقدة مثالية للتعامل مع التطبيقات عالية الحركة ، سنقوم بإنشاء تطبيق ويب بسيط للغاية - تطبيق تم تصميمه لتحقيق أقصى سرعة. فيما يلي المتطلبات المحددة لتطبيق العينة الذي أوضحه "Boss": إنشاء واجهة برمجة تطبيقات RESTful API العشوائية. يجب أن يقبل هذا التطبيق إدخالًا: معلمة تسمى "الرقم". يقوم التطبيق بعد ذلك بإرجاع رقم عشوائي بين 0 والمعلمة ويعيد الرقم الذي تم إنشاؤه إلى المتصل. نظرًا لأن "Boss" يريد أن يكون تطبيقًا شائعًا على نطاق واسع ، فيجب أن يكون قادرًا على التعامل مع 50000 مستخدم متزامن. لنلقي نظرة على الكود:
قائمة 2. عقدة مولد الأرقام العشوائية
نسخة الكود كما يلي:
// تحتاج هذه الوحدات إلى استيرادها من أجل استخدامها.
// العقدة لديها عدة وحدات. هم مثل أي #include
// أو بيان الاستيراد بلغات أخرى
var http = require ("http") ؛
var url = require ("url") ؛
// السطر الأكثر أهمية في أي ملف عقدة. هذه الوظيفة
// هل العملية الفعلية لإنشاء الخادم. من الناحية الفنية ،
// Node تخبر نظام التشغيل الأساسي أنه كلما كان
// يتم الاتصال ، يجب أن تكون وظيفة رد الاتصال هذه
// تنفذ. نظرًا لأننا نقوم بإنشاء خدمة ويب باستخدام API REST ،
// نريد خادم HTTP ، والذي يتطلب متغير HTTP
// أنشأنا في السطور أعلاه.
// أخيرًا ، يمكنك أن ترى أن طريقة رد الاتصال تتلقى "طلبًا"
// و "الاستجابة" كائن تلقائيا. يجب أن يكون هذا مألوفًا
// إلى أي مبرمج PHP أو Java.
http.createserver (وظيفة (طلب ، استجابة) {
// تحتاج الاستجابة إلى التعامل مع جميع الرؤوس ورموز الإرجاع
// يتم التعامل مع هذه الأنواع من الأشياء تلقائيًا في برامج الخادم
// مثل Apache و Tomcat ، ولكن العقدة تتطلب كل شيء ليتم القيام به بنفسك
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
// هنا بعض التعليمات البرمجية ذات المظهر الفريد. هذه هي الطريقة التي تعيد بها العقدة
// تم تمرير المعلمات من طلبات العميل. وحدة URL
// يتعامل مع كل هذه الوظائف. وظيفة التحليل
// تفكيك عنوان URL ، ويضع قيم المفاتيح في الاستعلام في
// كائن الاستعلام. يمكننا العثور على قيمة مفتاح "الرقم"
// من خلال الرجوع إليها مباشرة - جمال JavaScript.
var params = url.parse (request.url ، true) .query ؛
var input = params.number ؛
// هذه هي طرق جافا سكريبت العامة التي ستنشئ
// رقمنا العشوائي الذي يتم نقله إلى المتصل
var numInput = number number (input) ؛
var numoutput = number number (math.random () * numinput) .Tofixed (0) ؛
// اكتب الرقم العشوائي للاستجابة
استجابة. write (numOutput) ؛
// تتطلب العقدة منا أن تنهي هذا الاتصال بشكل صريح. هذا لأنه
// Node تتيح لك الحفاظ على اتصال مفتوح وتمرير البيانات ذهابًا وإيابًا ،
// على الرغم من أن هذا الموضوع المتقدم لم يتم مناقشته في هذه المقالة.
استجابة.
// عندما نقوم بإنشاء الخادم ، يتعين علينا توصيل خادم HTTP بشكل صريح
// منفذ. هو 80 منفذ HTTP القياسي ، لذلك سنقوم بتوصيله بهذا المنفذ.
}). الاستماع (80) ؛
// إخراج سلسلة إلى وحدة التحكم بمجرد بدء تشغيل الخادم ، مما يتيح لنا معرفة كل شيء
// يبدأ بشكل صحيح
console.log ("مولد الأرقام العشوائية تشغيل ...") ؛
ضع الكود أعلاه في ملف يسمى "Random.js". الآن ، لبدء التطبيق وتشغيله (ثم قم بإنشاء خادم HTTP والاستماع إلى الاتصالات على المنفذ 80) ، فقط أدخل الأمر التالي في موجه الأوامر: ٪ Node Random.js. إليك ما يبدو عليه عندما يكون الخادم قيد التشغيل بالفعل:
نسخة الكود كما يلي:
root@ubuntu:/home/moila/ws/mike# node random.js
مولد الرقم العشوائي يعمل ...
الوصول إلى التطبيق
التطبيق يصل وتشغيل. العقدة تستمع إلى أي اتصال ، دعنا نختبره. نظرًا لأننا أنشأنا واجهة برمجة تطبيقات بسيطة ، يمكننا استخدام متصفح الويب الخاص بنا للوصول إلى هذا التطبيق. اكتب العنوان التالي (تأكد من إكمال الخطوات المذكورة أعلاه): http: // localhost/؟ number = 27.
ستتغير نافذة المتصفح إلى رقم عشوائي بين 0 و 27. انقر فوق الزر RELOAD على المتصفح وستحصل على رقم عشوائي آخر. هذا كل شيء ، هذا هو تطبيق العقدة الأول!
ما هي العقدة جيدة؟
حتى الآن ، يجب أن تكون قادرًا على الإجابة على السؤال "ما هي العقدة" ، ولكن قد لا تكون واضحًا متى يجب عليك استخدامه. هذا سؤال مهم يجب طرحه ، لأن العقدة جيدة لبعض الأشياء ، ولكن على العكس من ذلك ، قد لا تكون العقدة حلًا جيدًا للآخرين في الوقت الحالي. يجب أن تكون حريصًا على تحديد موعد استخدام العقدة ، لأن استخدامها في الموقف الخاطئ يمكن أن يؤدي إلى الكثير المشفر الزائد.
ما هو جيد ل؟
كما رأيت من قبل ، فإن العقدة مثالية للمواقف التي تتوقع أن يكون فيها ارتفاع حركة المرور ، ومتطلبات المنطق والمعالجة من جانب الخادم ليست ضخمة بالضرورة قبل الاستجابة للعميل. تشمل الأمثلة النموذجية لأداء العقدة المتميز:
1. API API
تتلقى خدمة الويب التي توفر واجهة برمجة تطبيقات RESTful العديد من المعلمات ، وتوصيفها ، وتجمع بين الاستجابة ، وتُرجع استجابة (عادةً نص أقل) للمستخدم. هذا هو الوضع المثالي للعقدة ، حيث يمكنك بنائه للتعامل مع عشرات الآلاف من الاتصالات. لا يتطلب الكثير من المنطق حتى الآن ؛ إنه يبحث فقط عن بعض القيم من قاعدة بيانات ويجمع بين الاستجابة. نظرًا لأن الاستجابة عبارة عن كمية صغيرة من النص وكمية صغيرة من النص على الطلبات الواردة ، فإن حركة المرور ليست عالية ، ويمكن للآلة التعامل حتى مع احتياجات API لأكثر الشركات ازدحامًا.
2. قائمة الانتظار
تخيل شركة مثل Twitter ، والتي يجب أن تتلقى تغريدات وكتابتها إلى قاعدة بيانات. في الواقع ، يتم الوصول إلى الآلاف من التغريدات تقريبًا في الثانية ، ومن المستحيل على قاعدة البيانات معالجة عدد الكتابة المطلوبة خلال فترات الذروة في الوقت المناسب. أصبحت العقدة جزءًا مهمًا من الحل لهذه المشكلة. كما ترون ، يمكن للعقدة التعامل مع عشرات الآلاف من التغريدات الواردة. إنه يكتبها بسرعة وسهولة إلى آلية قائمة انتظار الذاكرة (على سبيل المثال ، memcached) حيث يمكن لعملية منفصلة أخرى كتابتها إلى قاعدة البيانات. دور العقدة هنا هو جمع التغريدات بسرعة وتمرير هذه المعلومات إلى عملية أخرى مسؤولة عن الكتابة. تخيل تصميمًا آخر - يحاول خادم PHP منتظم التعامل مع الكتابة إلى قاعدة البيانات نفسها - كل تغريدة ستتسبب في تأخير موجز عند الكتابة إلى قاعدة البيانات ، لأن استدعاء قاعدة البيانات يحظر القناة. بسبب زمن انتقال قاعدة البيانات ، قد يتعامل جهاز مصمم مثل هذا فقط إلى 2000 تويتر داخلي في الثانية. 1 مليون تغريدة في الثانية تتطلب 500 خادم. بدلاً من ذلك ، تعالج العقدة كل اتصال دون حظر القناة ، وبالتالي التقاط أكبر عدد ممكن من التغريدات. يتطلب آلة العقدة التي يمكنها التعامل مع 50000 تغريدة 20 خادمًا فقط.
3. خادم ملفات الصور
قد تقرر شركة ذات مواقع ويب موزعة كبيرة ، مثل Facebook أو Flickr ، استخدام جميع الآلات فقط لصور الخدمة. ستكون العقدة حلاً جيدًا لهذه المشكلة ، حيث يمكن للشركة استخدامها لكتابة مستردات ملفات بسيطة ثم معالجة عشرات الآلاف من الاتصالات. ستبحث العقدة عن ملف الصورة ، وإرجاع الملف أو خطأ 404 ، ثم لا تفعل شيئًا. سيتيح هذا الإعداد هذه المواقع الموزعة تقليل عدد الخوادم التي يحتاجون إليها لتقديم ملفات ثابتة مثل الصور وملفات .js و .css.
ما هو سيء؟
بالطبع ، في بعض الحالات ، العقدة ليست مثالية. فيما يلي المجالات التي لا تكون فيها العقدة جيدة في:
1. صفحات تم إنشاؤها ديناميكيًا
حاليًا ، لا توفر Node طريقة افتراضية لإنشاء صفحات ديناميكية. على سبيل المثال ، عند استخدام تقنية Javaserver Pages (JSP) ، يمكنك إنشاء صفحة index.jsp التي تحتوي على حلقة في مقتطف رمز JSP هذا. لا تدعم العقدة مثل هذه الصفحات الديناميكية التي تعتمد على HTML. وبالمثل ، فإن العقدة ليست مناسبة جدًا كخادم ويب مثل Apache و Tomcat. لذلك ، إذا كنت ترغب في تقديم مثل هذا الحل من جانب الخادم في العقدة ، فيجب عليك كتابة الحل بأكمله بنفسك. لا يرغب مبرمبو PHP في كتابة محول PHP لـ Apache في كل مرة يقومون فيها بنشر تطبيق ويب ، وحتى الآن هذا هو بالضبط ما تطلب منك Node القيام به.
2. قاعدة البيانات العلائقية تطبيقات ثقيلة
الغرض من العقدة سريع وغير متزامن وغير محظور. قواعد البيانات لا تشارك هذه الأهداف بالضرورة. إنها متزامنة وحظر ، لأن المكالمات إلى قاعدة البيانات أثناء القراءة والكتابة ستحظر القناة حتى يتم إنشاء النتيجة. لذلك ، فإن تطبيق الويب الذي يتطلب الكثير من مكالمات قاعدة البيانات ، والكثير من القراءات ، والكثير من الكتابة لكل طلب غير مناسب جدًا للعقدة ، لأن قاعدة البيانات العلائقية نفسها يمكن أن تعوض مزايا العقدة العديدة. (قاعدة بيانات NOSQL الجديدة أكثر ملاءمة للعقدة ، ولكن هذا موضوع آخر تمامًا.)
خاتمة
السؤال هو "ما هو Node.js؟" كان ينبغي الرد. بعد قراءة هذا المقال ، يجب أن تكون قادرًا على الإجابة على هذا السؤال في جمل واضحة وموجزة. إذا كان الأمر كذلك ، فقد وصلت إلى طليعة العديد من المبرمجين والمبرمجين. لقد تحدثت عن العقدة مع العديد من الناس ، لكنهم كانوا في حيرة من أمرهم حول ماهية العقدة بالضبط. من المفهوم أن لديهم عقلية Apache - الخادم هو تطبيق يضع ملفات HTML فيه وسيعمل كل شيء بشكل صحيح. والعقدة مدفوعة الغرض. إنه برنامج يستخدم JavaScript للسماح للمبرمجين بإنشاء خوادم ويب سريعة وقابلة للتطوير بسهولة. Apache جاهز للتشغيل ، بينما تقوم العقدة بترميز الجري.
تقوم العقدة بتحقيق هدفها المتمثل في توفير خادم قابل للتطوير للغاية. بدلاً من تخصيص نموذج "مؤشر ترابط واحد لكل اتصال" ، يستخدم نموذج "عملية واحدة لكل اتصال" لإنشاء الذاكرة المطلوبة فقط لكل اتصال. يستخدم محرك JavaScript سريع جدًا من Google: محرك V8. يستخدم تصميمًا يحركه الحدث للحفاظ على الكود الحد الأدنى وسهل القراءة. كل هذه العوامل تسهم في الهدف المثالي للعقدة - من الأسهل كتابة حل قابل للتطوير.
لا يقل أهمية عن فهم العقدة ، وفهم ما هو عليه. العقدة ليست بديلاً لـ Apache ، وهو مصمم لجعل تطبيقات الويب PHP أكثر قابلية للتطوير. هذا هو الحال بالفعل. في هذه المرحلة الأولية من العقدة ، من غير المحتمل أن يستخدمها عدد كبير من المبرمجين ، ولكن في السيناريوهات التي تعمل فيها ، يعمل بشكل جيد للغاية.
ما الذي يجب أن أتوقعه من العقدة في المستقبل؟ ربما يكون هذا هو السؤال الأكثر أهمية الذي تطرحه هذا المقال. الآن بعد أن عرفت ما يفعله الآن ، يجب أن تتساءل ماذا ستفعل بعد ذلك. خلال العام المقبل ، أتطلع إلى توفير تكامل أفضل مع مكتبات دعم الطرف الثالث الحالي. قام العديد من مبرمجي الطرف الثالث الآن بتطوير المكونات الإضافية للعقدة ، بما في ذلك إضافة دعم خادم الملفات ودعم MySQL. نأمل أن تبدأ العقدة في دمجها في وظائفها الأساسية. أخيرًا ، أريد أيضًا أن تدعم Node نوعًا من الوحدة النمطية للصفحة الديناميكية بحيث يمكنك القيام بما تفعله في PHP و JSP (ربما صفحة خادم NSP ، في ملف HTML. أخيرًا ، نأمل في يوم من الأيام أن يظهر خادم عقدة "جاهز للنشر" ، والذي يمكن تنزيله وتثبيته ، فقط ضع ملفات HTML فيه ، تمامًا مثل استخدام Apache أو Tomcat. لا تزال العقدة في مراحلها الأولية ، لكنها تتطور بسرعة كبيرة وقد تكون قريبًا في رؤيتك.