تجريف HTTP أسرع لكل طلب POST؟

0

أنا أكتب واجهة برمجة تطبيقات تُرجع مجموعة من عمليات إعادة التوجيه لأي صفحة معينة:

router.post('/trace', function(req,res){

    if(!req.body.link)
        return res.status(405).send(""); //error: no link provided!

    console.log("\tapi/trace()", req.body.link);

    var redirects = [];

    function exit(goodbye){
        if(goodbye)
            console.log(goodbye);
        res.status(200).send(JSON.stringify(redirects)); //end
    }

    function getRedirect(link){
        request({ url: link, followRedirect: false }, function (err, response, body) {
            if(err)
                exit(err); 
            else if(response.headers.location){
                redirects.push(response.headers.location);
                getRedirect(response.headers.location);
            }
            else
                exit(); //all done!
        });
    }

    getRedirect(req.body.link);

});

وهنا طلب المتصفح المقابل:

$.post('/api/trace', { link: l }, cb);     

ستجعل الصفحة حوالي 1000 طلب نشر بسرعة كبيرة ثم تنتظر وقتًا طويلاً جدًا لاستعادة كل طلب.

المشكلة هي أن الاستجابة للطلب التاسع بطيئة للغاية . يستغرق الطلب الفردي حوالي نصف ثانية ، ولكن لا أستطيع أن أقول أن الخادم السريع يعالج كل رابط بالتتابع. أريد خادم لجعل جميع الطلبات والاستجابة كما يتلقى استجابة.

هل أنا على صواب في افتراض أن موجه POST السريع يعمل بالعمليات بالتتابع؟ كيف أجعلها تفجر كل الطلبات وتمرر الردود كما تحصل عليها؟

1 إجابة

0

My question is why is it so slow / is POST an async process on a "out of the box" express server?

قد تتفاجأ عندما تكتشف أن هذه على الأرجح مشكلة متصفح أولاً ، وليست مشكلة node.js.

سيتضمن المتصفح عددًا أقصى من الطلبات المتزامنة سيسمح لـ Javascript ajax بالقيام بنفس المضيف الذي يختلف قليلاً من متصفح إلى آخر ، ولكنه يبلغ حوالي 6. لذلك ، إذا كنت تقدم 1000 طلب ، فعندها فقط يتم إرسال 6 في الوقت. والباقي في قائمة الانتظار في المتصفح في انتظار الانتهاء من الطلبات السابقة. لذا ، من المحتمل ألا يتلقى خادم العقدة 1000 طلب متزامن. يجب أن تكون قادرًا على تأكيد ذلك عن طريق تسجيل الطلبات الواردة في تطبيق node.js الخاص بك. من المحتمل أن ترى تأخيرًا طويلاً قبل أن يتلقى الطلب رقم 1000 (لأنه في قائمة الانتظار من قبل المتصفح).

فيما يلي عدد قليل من الطلبات المتشابهة لمضيف معين يدعمها كل متصفح (اعتبارًا من بضع سنوات): الحد الأقصى لاتصالات http المتوازية في المتصفح؟ .

توصيتي الأولى هي تجميع مجموعة من الطلبات التي يتم إجراؤها من العميل إلى الخادم (ربما 50 في المرة الواحدة) ثم إرسالها في طلب واحد. سيعطي هذا خادم node.js الخاص بك الكثير لمضغه ولن يعمل على تجاوز حد اتصال المتصفح لنفس المضيف.

أما بالنسبة لخادم node.js ، فيعتمد كثيرًا على ما تفعله. إذا كان معظم ما تفعله في خادم node.js هو مجرد شبكة وليس الكثير من المعالجة التي تتطلب دورات وحدة المعالجة المركزية ، فإن node.js فعال للغاية في التعامل مع الكثير والكثير من الطلبات المتزامنة. إذا بدأت في إشراك مجموعة من وحدة المعالجة المركزية (معالجة أو تحضير النتائج) ، فأنت تستفيد إما من إضافة عمليات عاملة أو استخدام تجميع node.js. في حالتك ، قد ترغب في استخدام العمليات المنفذة. يمكنك فحص حمل وحدة المعالجة المركزية (CPU) الخاصة بك عندما يقوم خادم node.js بمعالجة مجموعة من العمل ومعرفة ما إذا كانت وحدة المعالجة المركزية التي يستخدمها node.js قريبة من 100٪ أم لا. إذا لم يكن كذلك ، فلن تحتاج إلى المزيد من عمليات node.js. إذا كان الأمر كذلك ، فأنت بحاجة إلى نشر العمل على المزيد من عمليات node.js للتقدم بشكل أسرع.

في حالتك الخاصة ، يبدو أنك تقوم بالفعل بالربط الشبكي فقط لجمع 302 رد إعادة توجيه. يجب أن تكون عملية node.js الفردية قادرة على التعامل مع الكثير من تلك الطلبات بكفاءة عالية ، لذا من المحتمل أن تكون المشكلة هي أن عميلك يخنق المتصفح.


إذا كنت ترغب في إرسال الكثير من الطلبات إلى الخادم (حتى يتمكن من العمل على أكبر عدد ممكن من الإمكانات) ، ولكنك تريد الحصول على النتائج فور توفرها ، فهذا عمل أكثر قليلاً.

أحد الأنظمة التي يمكن أن تعمل هي فتح اتصال webSocket أو socket.io. يمكنك بعد ذلك إرسال مجموعة كبيرة من عناوين URL التي تريد أن يقوم الخادم بالتحقق منها في رسالة واحدة عبر اتصال socket.io. بعد ذلك ، عندما يحصل الخادم على نتيجة ، يمكنه إعادة إرسال كل نتيجة فردية (يتم وضع علامة عليها باستخدام عنوان URL الذي يتوافق معه). وبهذه الطريقة ، يمكنك إلى حد ما الحصول على أفضل ما في العالمين من خلال معالجة الخادم على قائمة طويلة من عناوين URL ، ولكن يمكنك إرسال ردود فردية بمجرد الحصول عليها.

ملاحظة ، ربما ستجد أن هناك حدًا أقصى لعدد طلبات http الصادرة التي قد ترغب في تشغيلها في نفس الوقت من خادم node.js أيضًا. في حين أن الإصدارات الحديثة من node.js لا تخنقك كما يفعل المتصفح ، فمن المحتمل أيضًا أنك لا تريد خادم node.js الخاص بك محاولة تشغيل 10000 طلب متزامن لأنك قد تستنفد نوعًا من تجمع موارد الشبكة. لذلك ، بمجرد تجاوز عنق الزجاجة الخاص بالعميل ، ستحتاج إلى اختبار الخادم الخاص بك على مستويات مختلفة من الطلبات المتزامنة المفتوحة لمعرفة أفضل أداء. هذا يهدف إلى تحسين أدائه ، ولكن أيضًا لحماية الخادم الخاص بك من محاولة التوسع المفرط في استخدامه لموارد الشبكة أو الذاكرة والدخول في حالات الخطأ.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام