خدمت خدمة التعرف على الوجه Look-A-Like آلاف المستخدمين في نفس الوقت.يعد التطوير على NodeJS هواية ، ولكن عندما يتعلق الأمر بالإنتاج للعديد من المستخدمين ، فهناك بعض الأشياء التي يجب عليك معرفتها لتجنب استجابة طويلة ومواطن الخلل.
كجزء من عملنا في MyHeritage ، قمنا بتطوير خدمة doppelgänger لـ Eurovision 2019 ، والتي ، من خلال تحميل صورة شخصية ، يمكنك معرفة أي من المتسابقين الأكثر تشابهاً لك.
بالإضافة إلى منطق التعرف على الوجوه ، كان للتطبيق مطلب واضح للغاية: كان عليه أن يخدم عشرات الآلاف من المستخدمين المتزامنين ، لأن يوروفيجن يشاهدها ملايين الأشخاص حول العالم.
بسرعة كبيرة ، أدركنا أن موازن التحميل الموجود أمام التطبيق الذي تم تكوينه باستخدام القياس التلقائي لا يكفي لتحمل الأخطاء. ساعدنا التالي كثيرًا:
- نأمل في الأفضل ، ولكن الاستعداد للأسوأ: قم بقياس عدد المستخدمين المتزامنين الذين سيتمكنون من تقديم طلبك في الوقت X (في حالة واحدة). على سبيل المثال ، في حالتنا ، أظهر الاختبار أنه يمكننا خدمة 200 مستخدم متزامن في كل مثيل EC2 لمدة 10 ثوانٍ ، لذلك عندما اكتشفنا أننا يجب أن نخدم 10000 مستخدم متزامن ، كان علينا فقط إعداد 50 خادمًا للموازن. للاختبار ، استخدمنا أداة ممتازة تسمى JMeter .
وساعد هذا البرنامج التعليمي إلى حد كبير في التحضير للقياسات. - تجنب الأقفال: عمليات الحظر (مثل
fs.readSync
) مغرية لأن الكود يبدو أكثر نظافة ، لكنه يقتل الأداء بشكل حرفي. استخدم عمليات async
/ await
بدلاً من ذلك ، لأنه أثناء التشغيل غير المتزامن ، ستتوفر وحدة المعالجة المركزية للمهام الأخرى (انظر حلقة الأحداث ).
قبل: const res = fs.readSync('file.txt');
const res = fs.readSync('file.txt');
بعد: const res = await fs.readAsync('file.txt');
- زيادة حد الذاكرة: يتم تكوين
Node
بشكل افتراضي إلى حد 1 غيغابايت. إذا كان بإمكان الخادم الوصول ، على سبيل المثال ، إلى 4 جيجابايت للتطبيق الخاص بك ، فسيتعين عليك تعيين الحد الأقصى الأقصى للذاكرة يدويًا باستخدام CLI مع العلم التالي: --max-old-space-size
--max-old-space-size
مثال: node --max-old-space-size=4096 server.js
- تأكد من استخدام جميع مراكز المعالج: افتراضيًا ، يتم تشغيل
Node
في نفس الخيط. إذا لم تقم بتكوين تكوين معين يعمل على تشغيل عدة مؤشرات ترابط ، فوفر المال عن طريق اختيار خادم به مركز واحد. - تقليل عدد المكالمات إلى التطبيق: تكوين HTTPS القسري وجميع عمليات إعادة التوجيه أعلى مستوى ممكن (على سبيل المثال ، على مستوى الوكيل). سيسمح هذا للتطبيق بعدم تشتيت انتباه الزائرين ، وبالتالي ، يكون الوصول إليه أكثر سهولة للطلبات المهمة حقًا.
- معالجة الأخطاء: استخدم التسجيل ، على سبيل المثال Logz.io/AWS CloudWatch لتتبع الأخطاء التي يمكن أن تؤدي إلى فشل التطبيق. لا تبلغ عن خدمات مثل Slack عن كل شيء ، لأن الرسائل عادة ما تكون جماعية ويمكن أن تسد القناة بسهولة. استخدمنا مكتبة ممتازة تسمى Winston لتسجيل الدخول في NodeJS.
في حالتنا ، أدت هذه النصائح إلى تحسين الإنتاجية بمقدار عشرة أضعاف وساعدت في الحفاظ على بيئة الإنتاج نظيفة حتى عندما تضطر إلى خدمة الآلاف من المستخدمين في نفس الوقت.
شكرا لك على القراءة