اختبار التحميل: كسر موقعك عن قصد
موقعك يعمل مع مستخدم واحد. هل ينفع مع 10000؟ كيفية استخدام k6 لمحاكاة الارتفاعات الهائلة في حركة المرور وتحديد الاختناقات قبل الجمعة السوداء.
نمط “كارثة النجاح”.
أخطر لحظة بالنسبة لشركة ناشئة ليست الفشل. إنه النجاح. تخيل هذا السيناريو: قمت بإطلاق حملة تسويقية جديدة. أو يمكنك الحصول على ميزة على TechCrunch. أو منشورًا مؤثرًا لديه 5 ملايين متابع حول منتجك. ارتفاع حركة المرور 100x بين عشية وضحاها. أنت على استعداد لكسب الملايين. وبعد ذلك… يتم تحميل الموقع باللون الأبيض. ** مهلة البوابة 504 **. خدمة 503 غير متاحة. تصل وحدة المعالجة المركزية لقاعدة البيانات الخاصة بك إلى 100%. تم استنفاد تجمع الاتصال الخاص بك. يقوم المستخدمون بتحديث الصفحة، مع إضافة المزيد من التحميل. النظام يدخل في دوامة الموت. أنت ذعر. تحاول ترقية قاعدة البيانات على AWS، لكن الأمر يستغرق 30 دقيقة لتطبيقها. وبحلول الوقت الذي يتم فيه عمل نسخة احتياطية للموقع، تكون حركة المرور قد اختفت. المستخدمون غاضبون. السمعة تضررت.
هذه كارثة النجاح. نجحت في التسويق وفشلت في الهندسة. اختبار التحميل يفرض حدوث هذا السيناريو في بيئة خاضعة للرقابة، قبل أيام أو أسابيع من الحدث الحقيقي. نحن نحاكي الحادث. نجد عنق الزجاجة. نحن نصلحه. نكرر.
لماذا يناقش Maison Code هذا الأمر
في Maison Code، نحن متخصصون في التجارة الإلكترونية “عالية الضغط”. عملاؤنا ليسوا مدونات نموذجية. إنها علامات تجارية تطرح أحذية رياضية محدودة الإصدار في الساعة 10:00 صباحًا. ينتقلون من 0 زائر إلى 50000 زائر في 3 ثوانٍ. لقد تعلمنا من خلال التجربة أن **قابلية التوسع ليست سحرًا؛ إنها الرياضيات **. إذا لم تقم باختبار نظامك بمعدل 10 أضعاف الحمل المتوقع، فلن يكون لديك نظام قوي؛ لديك صلاة. نكتب عن هذا لأننا نريد إنقاذ المؤسسين من حزن مشاهدة “اللحظة الكبيرة” الخاصة بهم تتحول إلى انقطاع عام.
الأداة: k6 (جرافانا)
لفترة طويلة، كان المعيار هو JMeter. لقد كانت قوية ولكنها مؤلمة (واجهة المستخدم الرسومية المستندة إلى XML). ثم أصبح الجراد (بايثون) شائعًا. لكن معيار الصناعة اليوم هو k6. لماذا ك6؟
- JavaScript: تتم كتابة الاختبارات بلغة JS/TS. المطورون مرتاحون لذلك.
- الأداء: المحرك مكتوب باللغة Go. يمكن لجهاز كمبيوتر محمول واحد محاكاة 30000 مستخدم متزامن.
- CI/CD: يتم تشغيله بسهولة في مسار GitHub Actions.
- المقاييس: تتكامل أصلاً مع Grafana/InfluxDB للحصول على تصور جميل في الوقت الفعلي.
التنفيذ: كتابة نص k6
دعونا نلقي نظرة على البرنامج النصي القوي لاختبار التحميل.
استيراد http من "k6/http"؛
استيراد {النوم، التحقق} من 'k6'؛
// التكوين: ملف تعريف التحميل
خيارات ثابت التصدير = {
المراحل: [
{ المدة: '30 ثانية'، الهدف: 20 }، // زيادة عدد المستخدمين إلى 20 مستخدمًا (الإحماء)
{ المدة: '1 م'، الهدف: 50 }، // زيادة ما يصل إلى 50 مستخدمًا (تحميل)
{ المدة: '2m'، الهدف: 50 }، // البقاء عند 50 مستخدمًا (الاستدامة)
{ المدة: '30 ثانية'، الهدف: 100 }، // ارتفاع إلى 100 مستخدم (الضغط)
{ المدة: '30 ثانية'، الهدف: 0 }، // المنحدر (التبريد)
]،
العتبات: {
// شروط الفشل
http_req_failed: ['معدل<0.01']، // يجب أن يكون معدل الخطأ <1%
http_req_duration: ['p95<500']، // 95% من الطلبات يجب أن تكون <500 مللي ثانية
},
};
وظيفة التصدير الافتراضية () {
const BASE_URL = 'https://staging.maisoncode.paris';
// 1. قم بزيارة الصفحة الرئيسية
const resHome = http.get(BASE_URL);
تحقق (ريسهوم، {
'حالة المنزل 200': (r) => r.status === 200,
"المنزل سريعًا": (r) => r.timings.duration < 200,
});
النوم(1); // يعتقد المستخدم...
// 2. البحث عن المنتج (وحدة المعالجة المركزية المكثفة)
const resSearch = http.get(`${BASE_URL}/api/search?q=shirt`);
تحقق (البحث، {
'حالة البحث 200': (r) => r.status === 200
});
النوم(2);
}
الأنواع الأربعة لاختبارات الأداء
افهم الفرق، وإلا ستختبر الشيء الخطأ.
-
اختبار الدخان:
- الهدف: التأكد من أن النظام يتعامل مع الحمل الحد الأدنى.
- تحميل: 1-5 مستخدمين افتراضيين (VUs).
- متى: بعد كل عملية نشر. “هل قمنا بكسر الخادم بالكامل؟”
-
اختبار التحميل:
- الهدف: التحقق من أن النظام يتعامل مع حركة المرور المتوقعة.
- التحميل: متوسط عدد الزيارات لموقع الإنتاج الخاص بك (على سبيل المثال، 50 وحدة افتراضية).
- متى: قبل الإصدارات الثانوية.
-
اختبار الإجهاد:
- الهدف: العثور على نقطة الانهيار.
- التحميل: قم بزيادة التحميل بلا حدود حتى يتعطل النظام.
- النتيجة: “يمكننا التعامل مع 2500 مستخدم. عند 2501، تتعطل قاعدة البيانات.”
- متى: قبل التغييرات المعمارية الكبرى.
-
اختبار النقع:
- الهدف: البحث عن تسربات الذاكرة.
- الحمل: حمل متوسط (سعة 80%) لمدة 24 ساعة.
- النتيجة: “آه، يتزايد استخدام الذاكرة بنسبة 1% كل ساعة. لدينا تسرب.”
تحديد الاختناقات
لقد وجدت نقطة الانهيار. والآن اسأل لماذا؟ نادرًا ما يكون “لماذا” هو الكود نفسه. عادة ما تكون البنية التحتية.
-
قاعدة البيانات (المشتبه به المعتاد):
- استنفاد الاتصال: “فادح: فتحات الاتصال المتبقية محجوزة لأدوار المستخدم المتميز غير المتماثلة”.
- الإصلاح: تجمع الاتصال (PgBouncer).
- تشبع وحدة المعالجة المركزية: استعلامات معقدة تقوم بفحص كامل للجدول.
- الإصلاح: الفهرسة. قراءة النسخ المتماثلة. استخدم Redis للتخزين المؤقت للاستعلامات الشائعة.
- استنفاد الاتصال: “فادح: فتحات الاتصال المتبقية محجوزة لأدوار المستخدم المتميز غير المتماثلة”.
-
** الجسور (واجهات برمجة التطبيقات) **:
- موقعك سريع، ولكن يمكنك الاتصال بـ Shipping API لحساب الأسعار.
- تنتهي مهلة واجهة برمجة تطبيقات الشحن تحت التحميل.
- طلباتك في قائمة الانتظار في انتظار واجهة برمجة تطبيقات الشحن.
- نفاد ذاكرة الوصول العشوائي (RAM) لخادمك.
- إصلاح: المهلات. قواطع الدائرة.
-
حلقة الحدث (Node.js):
- العقدة ذات ترابط واحد. إذا قمت بإجراء عمليات حسابية ثقيلة على وحدة المعالجة المركزية (التشفير وتغيير حجم الصورة) على الموضوع الرئيسي، فإنك تحظر جميع المستخدمين.
- الإصلاح: إلغاء التحميل على مؤشرات الترابط العاملة أو الوظائف بدون خادم.
دلالات النسب المئوية (ص٩٥، ص٩٩)
لا تحكم أبدًا على الأداء من خلال المتوسط. المتوسطات تخفي الأكاذيب.
- المستخدم أ: 100 مللي ثانية
- المستخدم ب: 100 مللي ثانية
- المستخدم ج: 10,000 مللي ثانية (10 ثوانٍ)
- المتوسط: ~3.4 ثانية. (يبدو بخير العش).
- ص99: 10ث. (مرعب).
p95 (النسبة المئوية 95) تعني: “تجاهل القيم المتطرفة الأبطأ بنسبة 5%. ما هي السرعة بالنسبة لأي شخص آخر؟” p99 (الشريحة المئوية 99) تعني: “تجربة أبطأ الطلبات بنسبة 1%.”
** لماذا يهم p99 **: في التجارة الإلكترونية، غالبًا ما يكون “أبطأ الطلبات” هم المستخدمون الذين لديهم أكبر عربات التسوق. مستخدم لديه عنصر واحد -> استعلام سريع. مستخدم لديه 50 عنصرًا -> استعلام بطيء. مستخدم p99 هو العميل ذو القيمة العالية. إذا تجاهلت p99، فأنت تقوم بتحسين متسوقي النوافذ وتتجاهل الحيتان.
الاختبار في الإنتاج؟
خطر. إن إجراء اختبار الإجهاد على الإنتاج أمر محفوف بالمخاطر.
- أنت تفسد التحليلات: سيعرض Google Analytics 10000 زيارة “روبوتية”، مما يؤدي إلى إتلاف بياناتك التسويقية.
- تتسبب في التكاليف: إذا كنت تستخدم Serverless/Vercel، فسوف تدفع مقابل 10 ملايين طلب أرسلتها للتو بشكل غير مرغوب فيه.
- تنبيهات الاحتيال: قد يحظرك Stripe بسبب أنماط الهجوم “اختبار البطاقة”.
القاعدة الذهبية: استخدم البيئة المرحلية لتكافؤ البيانات. يجب أن يكون التدريج * مطابقًا * لـ Prod (نفس حجم مثيل AWS، ونفس حجم قاعدة البيانات). إذا كان التدريج عبارة عن t2.micro صغير وProd هو m5.large ضخم، فإن نتائج الاختبار الخاصة بك لا معنى لها.
14. هندسة الفوضى (تحطيم الأشياء عمدًا)
افصل كابل قاعدة البيانات. ماذا يحدث؟ هل يتعطل الموقع؟ أم أنها تظهر نسخة مخبأة؟ نحن نستخدم Chaos Mesh أو البرامج النصية العامة Pumba لقتل الحاويات بشكل عشوائي أثناء اختبار التحميل. إذا ماتت نسخة طبق الأصل واحدة، فيجب إعادة توجيه Load Balancer على الفور. إذا مات Redis Cache، فيجب أن تتحمل قاعدة البيانات الحمل (أو تشتعل). إن معرفة ذلك قبل الساعة 9 صباحًا في يوم الإطلاق أمر لا يقدر بثمن.
15. اختبار التحميل على المتصفح (متصفح k6)
لا تعرض اختبارات البروتوكول (HTTP) JavaScript. إنهم لا يلتقطون “أخطاء الترطيب” أو “تأخر عرض التفاعل”. متصفح k6 يقوم بتدوير مثيلات Chrome الحقيقية بدون رأس. فهو يقيس CLS (إزاحة التخطيط التراكمي) وFID (تأخير الإدخال الأول) تحت التحميل. “الخادم سريع (200 مللي ثانية API)، لكن العميل بطيء (تنفيذ 3s JS) لأننا أرسلنا 5 ميجابايت من JSON.” فقط اختبار المتصفح يكشف عن هذا.
16. أتمتة اختبارات الحمل في CI/CD (إجراءات GitHub)
لا تقم بتشغيل k6 من الكمبيوتر المحمول الخاص بك. قم بتشغيله عند كل طلب سحب. نضيف سير عمل “load-test.yml”.
- نشر الفرع إلى عنوان URL المرحلي.
- قم بتشغيل k6 run smoke-test.js (تحقق من وجود 500 ثانية).
- في حالة الفشل، قم بحظر الدمج. وهذا يمنع “تراجعات الأداء”. “أضاف Junior Dev حلقة استعلام N+1. وقد اكتشفها الاختبار لأن زمن الوصول انتقل من 200 مللي ثانية إلى 2000 مللي ثانية.”
17. اختبار الارتفاع مقابل اختبار النقع
تعرف على الفرق. اختبار الارتفاع:
- يحاكي “Sneaker Drop” أو “Super Bowl Ad”.
- 0 -> 10000 مستخدم في 10 ثواني.
- الهدف: اختبار مشغلات القياس التلقائي (هل تعمل خوادم AWS بسرعة كافية؟). اختبار النقع:
- يحاكي “عطلة نهاية الأسبوع الجمعة السوداء”.
- حمل عالي لمدة 48 ساعة.
- الهدف: اختبار تسرب الموارد (الذاكرة، مساحة القرص، واصفات الملفات). أنت بحاجة إلى كليهما.
18. الاستنتاج
الأداء ليس “من الجميل أن يكون لديك”. إنها ميزة. قابلية التوسع ليست سحرية. إنها هندسة. اختبار الحمل هو نظام التحقق من صحة الهندسة الخاصة بك. لا تنتظر انقطاع التيار الكهربائي. اكسر المصباح بنفسك، بينما لديك مصباحًا احتياطيًا في جيبك.
الاستعداد للجمعة السوداء؟
لا تنتظر حتى نوفمبر. Maison Code يقدم خدمات “اختبار إجهاد البنية التحتية”. نحن نحاكي ارتفاع حركة المرور بمقدار 100 مرة، ونحدد الاختناقات لديك، وننفذ سياسات التوسع التلقائي التي تعمل.
اتصل بنا لحماية إيراداتك.
هل تتوقع ارتفاع حركة المرور؟
نقوم بإجراء اختبارات التحميل والإجهاد باستخدام k6 للتحقق من صحة سعة البنية التحتية والتحقق من سياسات القياس التلقائي. قم بتعيين مهندسينا المعماريين.