فيما يلي 10 قواعد أداء نتبعها عند استخدام node.js:
1. تجنب استخدام الكود المتزامن
من حيث التصميم ، node.js هو واحد. للسماح لخيط واحد بالتعامل مع العديد من الطلبات المتزامنة ، لا يمكنك أبدًا السماح للموضوع بانتظار عمليات منع أو متزامنة أو عمليات طويلة الأمد. ميزة مميزة لـ Node.js هي أنه تم تصميمه وتنفيذه من أعلى إلى أسفل لتحقيق غير متزامن. هذا يجعلها مناسبة للغاية لبرامج نوع الحدث.
لسوء الحظ ، لا يزال هناك احتمال حدوث مكالمات متزامنة/حظر. على سبيل المثال ، تحتوي العديد من عمليات نظام الملفات على إصدارات متزامنة وغير متزامنة ، مثل WriteFile و WriteFilesync. حتى إذا كنت تستخدم التعليمات البرمجية للتحكم في طريقة التزامن ، فلا يزال من الممكن استخدام مكتبة الوظائف الخارجية التي تحظر المكالمات عن غير قصد. عند القيام بذلك ، يكون التأثير على الأداء ضخمًا.
// Good: كتابة ملفات غير متزامنة. // سيئة: كتابة الملفات متزامنة synchronouslyfs.writefilesync ('message.txt' ، 'hello node') ؛ console.log ("تم حفظها ، لكنك منعت جميع الطلبات!") ؛يتضمن سجل التهيئة الخاص بنا عن غير قصد مكالمة متزامنة لكتابة المحتوى إلى القرص عند تنفيذها. إذا لم نقم باختبار الأداء ، فسيكون من السهل تجاهل هذه المشكلة. عند استخدام مثيل Node.js في مربع المطور كاختبار قياسي ، ستؤدي هذه المكالمة المتزامنة إلى انخفاض الأداء من آلاف الطلبات في الثانية إلى بضع عشرات فقط.
2. أغلق تجمع المقبس
سوف يستخدم عميل HTTP Node.js تلقائيًا تجمعات المقبس: افتراضيًا ، سيحد فقط 5 مآخذ لكل مضيف. على الرغم من أن إعادة استخدام المقابس قد تتسبب في زيادة الموارد تحت السيطرة ، إذا كنت بحاجة إلى التعامل مع الطلبات المتزامنة من نفس المضيف ، فإنها ستؤدي إلى سلسلة من الاختناقات. في هذه الحالة ، من الجيد زيادة قيمة MaxSockets أو إغلاق تجمع المقبس:
// تعطيل تجميع المقبس var http = require ('http') ؛ var reports = {.....3. لا تدع الموارد الثابتة تستخدم Node.js
بالنسبة للموارد الثابتة مثل CSS والصور ، استخدم خادم الويب القياسي بدلاً من Node.js. على سبيل المثال ، يستخدم LinkedIn Mobile Nginx. نستخدم أيضًا شبكات توصيل المحتوى (CDNS) ، والتي يمكنها نسخ الموارد الثابتة في جميع أنحاء العالم إلى الخوادم. هذا له فوائدان: (1) يمكن أن يقلل من الحمل على Node.js Server (2) يمكن أن يسمح CDNs بتسليم محتوى ثابت على الخوادم بالقرب من المستخدم ، وبالتالي تقليل وقت الانتظار.
4. عرض على العميل
دعونا نقارن الفرق بسرعة بين عرض الخادم وتقديم العميل. إذا استخدمنا node.js لتقديمه على جانب الخادم ، فسنرسل كل طلب صفحة HTML مثل ما يلي:
<!-مثال على صفحة ويب بسيطة تم تقديمها بالكامل-> <! doctype html> <hheml> <head> <title> linkedIn mobile </title> </hege> <body> <div> <img src = "http://mobile-cdn.linkedin.com/images/linked.png"/> <triv> </viv> </body> </html>
يرجى الانتباه إلى مراقبة جميع محتويات هذه الصفحة ، باستثناء اسم المستخدم ، والباقي ثابت: المحتويات التي تم تحميلها من قبل كل مستخدم والصفحة هي نفسها. لذلك ، فإن النهج الأكثر فاعلية هو السماح لـ Node.js بإرجاع المحتوى الديناميكي الذي تتطلبه الصفحة في نموذج JSON فقط.
{"الاسم": "جون"}
يمكن وضع ما تبقى من الصفحة - جميع علامات HTML الثابتة - في قوالب JavaScript (مثل قالب UndersCore.js):
<!-مثال على قالب javaScript الذي يمكن تقديمه جانب العميل-> <! doctype html> <html> <head> <title> linkedIn mobile </title> </head> <body> <viv> <img src = "http://mobile-cdn.linkedin.com/IMAGES/LinkedIn ٪>! </viv> </body> </html>
يأتي تحسين الأداء من هذه الأماكن: كما تقول النقطة الثالثة ، يمكن توفير قوالب JavaScript الثابتة على جانب الخادم من خلال خادم الويب (مثل Nginx) ، أو تنفيذها مع CDN أفضل. بالإضافة إلى ذلك ، يمكن تخزين قوالب JavaScript في المتصفح أو تخزينها محليًا. بعد تحميل جميع الصفحات الأولية ، فإن البيانات الوحيدة التي يجب إرسالها إلى العميل هي JSON ، والتي ستكون الأكثر فعالية. يمكن أن تقلل هذه الطريقة بشكل كبير من تحميل وحدة المعالجة المركزية و IO و Node.js.
5. استخدم GZIP
تدعم العديد من الخوادم والعملاء GZIP لضغط الطلبات والإجابات. سواء كنت ترد على عميل أو إرسال طلب إلى خادم بعيد ، تأكد من الاستفادة الكاملة منه.
6. التوازي
حاول السماح لجميع عمليات الحظر الخاصة بك - إرسال الطلبات ، ومكالمات DB ، وموازاة الوصول إلى نظام الملفات إلى الخدمات عن بُعد. سيؤدي ذلك إلى تقليل وقت الانتظار لأبطأ عملية حظر ، بدلاً من وقت الانتظار لجميع عمليات الحظر. للحفاظ على عمليات الاسترجاعات ومعالجة الأخطاء نظيفة ، نستخدم الخطوة للتحكم في حركة المرور.
7. تحرير التحرير
يستخدم LinkedIn Mobile إطار عمل Express لإدارة دورات الطلب/الرد. تتضمن العديد من الأمثلة السريعة التكوين التالي:
app.use (express.session ({secret: "Keyboard Cat"})) ؛
بشكل افتراضي ، يتم تخزين بيانات الجلسة في الذاكرة ، مما يضيف النفقات العامة الضخمة إلى الخادم ، خاصة مع زيادة عدد المستخدمين. يمكنك استخدام متجر جلسة خارجي ، مثل MongoDB أو Redis ، ولكن كل طلب سيؤدي إلى النفقات العامة للمكالمات عن بُعد للحصول على بيانات الجلسة. عندما يكون ذلك ممكنًا ، يتمثل الخيار الأفضل في تخزين جميع البيانات عديمة الجنسية على جانب الخادم. من خلال تحرير الجلسة من خلال عدم تضمين التكوين السريع أعلاه ، سترى أداء أفضل.
8. استخدم الوحدات الثنائية
إذا كان ذلك ممكنًا ، استبدل وحدات JavaScript بوحدات ثنائية. على سبيل المثال ، عندما نتحول من وحدة SHA مكتوبة في JavaScript إلى إصدار متجمع من Node.js ، نرى قفزة كبيرة إلى الأمام في الأداء:
// استخدم Crypto Crypto = مطلوب ('crypto') ؛ var hash = crypto.createhmac ("sha1" ، مفتاح) .update (signatureBase) .Digest ("base64") ؛9. استبدل مكتبة العميل بـ V8 JavaScript القياسية
يتم إنشاء العديد من مكتبات JavaScript للاستخدام على متصفحات الويب لأنه في بيئات JavaScript ، على سبيل المثال ، تدعم بعض المتصفحات وظائف مثل Foreach ، خريطة ، وتقليلها ، ولكن بعض المتصفحات لا. لذلك ، عادةً ما تستخدم مكتبات العملاء الكثير من التعليمات البرمجية غير الفعالة للتغلب على اختلافات المتصفح. من ناحية أخرى ، في node.js ، يمكنك معرفة بالضبط أساليب JavaScript فعالة: V8 JavaScript Engine يدعم Node.js لتنفيذ ECMAscript المحدد في الطبعة الخامسة من ECMA-262. استبدال مكتبة العميل مباشرة بوظائف V8 JavaScript القياسية ، ستجد تحسينات كبيرة في الأداء.
10. حافظ على الكود الصغير والخفيف
سيؤدي استخدام جهاز محمول إلى جعل الوصول بطيئًا ومزونًا مرتفعًا ، والذي يخبرنا بالحفاظ على كودنا صغيرًا وخفيفًا. يتم الحفاظ على نفس الفلسفة لرمز الخادم. من حين لآخر ، انظر إلى قرارك واطرح أسئلة على نفسك مثل: "هل نحتاج حقًا إلى هذه الوحدة؟" ، "لماذا نستخدم هذا الإطار؟ هل يستحق النفقات العامة استخدامنا؟" ، "هل يمكننا تنفيذها بطريقة بسيطة؟". الرمز الصغير والخفيف عادة ما يكون أكثر كفاءة وسريعة.
جربه
نحن نعمل بجد لجعل تطبيقات الهاتف المحمول لدينا بسرعة. جربها على منصات مثل تطبيقات iPhone و Android وإصدارات HTML5 المحمول لإعلامنا كيف نفعل.