1k এইচটিটিপি অনুরোধের সমান্তরাল ট্রিগারিং আটকে যাবে


10

আপনি যখন 1k-2k বহির্গামী এইচটিটিপি অনুরোধগুলি ট্রিগার করেন তখন প্রশ্নটি আসলে কী হয়? আমি দেখতে পাচ্ছি যে এটি 500 টি সংযোগের সাহায্যে সহজেই সমস্ত সংযোগ সমাধান করবে তবে সংযোগগুলি উন্মুক্ত থাকায় নোড অ্যাপ্লিকেশনটি আটকে থাকবে বলে মনে হচ্ছে সেখান থেকে এগিয়ে যাওয়া সমস্যার কারণ হতে পারে। স্থানীয় সার্ভার + উদাহরণ গুগল এবং অন্যান্য মক সার্ভারের সাথে পরীক্ষিত।

কিছু ভিন্ন সার্ভারের শেষ পয়েন্টগুলির সাথে আমি কারণটি পেয়েছি: ECONNRESET পড়ুন যা ঠিক আছে সার্ভারটি অনুরোধটি পরিচালনা করতে পারে নি এবং একটি ত্রুটি ছুঁড়ে ফেলতে পারে। 1k-2k অনুরোধ পরিসরে প্রোগ্রামটি কেবল স্তব্ধ হয়ে যাবে। আপনি যখন ওপেন সংযোগগুলি পরীক্ষা করেন তখন আপনি lsof -r 2 -i -aদেখতে পেতেন যে কয়েকটি এক্স পরিমাণ সংযোগ রয়েছে যা সেখানে স্থির থাকে 0t0 TCP 192.168.0.20:54831->lk-in-f100.1e100.net:https (ESTABLISHED)। আপনি যখন অনুরোধগুলিতে টাইমআউট সেটিং যুক্ত করবেন তখন এগুলি সম্ভবত টাইমআউট ত্রুটির সাথে শেষ হয়ে যাবে, তবে অন্যথায় কেন সংযোগটি চিরতরে রাখা হবে এবং মূল প্রোগ্রামটি কিছু লিম্বো অবস্থায় শেষ হবে?

উদাহরণ কোড:

import fetch from 'node-fetch';

(async () => {
  const promises = Array(1000).fill(1).map(async (_value, index) => {
    const url = 'https://google.com';
    const response = await fetch(url, {
      // timeout: 15e3,
      // headers: { Connection: 'keep-alive' }
    });
    if (response.statusText !== 'OK') {
      console.log('No ok received', index);
    }
    return response;
  })

  try {
    await Promise.all(promises);
  } catch (e) {
    console.error(e);
  }
  console.log('Done');
})();

1
আপনি কি npx envinfoআমার বিজয় 10 / nodev10.16.0 স্ক্রিপ্টে আপনার উদাহরণটি চালিয়ে ফলাফলটি পোস্ট করতে পারবেন 8432.805ms এ শেষ হবে
Łukasz Szewczak

আমি ওএস এক্স এবং আলপাইন লিনাক্সে (ডকার পাত্রে) উদাহরণটি চালিয়েছি এবং একই ফলাফলে পৌঁছেছি।
রিস্তো নভিক

আমার স্থানীয় ম্যাক স্ক্রিপ্টটি 7156.797ms এ চালায়। আপনি কি নিশ্চিত যে কোনও ফায়ারওয়ালগুলি অনুরোধগুলি অবরুদ্ধ করছে?
জন

লোকাল মেশিন ফায়ারওয়াল ব্যবহার না করে পরীক্ষিত, তবে এটি কি আমার স্থানীয় রাউটার / নেটওয়ার্কের সাথে সমস্যা হতে পারে? আমি গুগল ক্লাউড বা হিরোকুতে অনুরূপ পরীক্ষা চালানোর চেষ্টা করব।
রিস্তো নভিক

উত্তর:


3

নিশ্চিত হয়ে কী হচ্ছে তা বুঝতে, আপনার স্ক্রিপ্টে আমার কিছু সংশোধন করা দরকার, তবে এখানে রয়েছে।

প্রথমত, আপনি কীভাবে nodeএবং কীভাবে এটি event loopকাজ করে তা আপনি জানতে পারেন তবে আমাকে একটি দ্রুত পুনরুদ্ধার করতে দিন। আপনি যখন কোনও স্ক্রিপ্ট nodeরান করেন , রানটাইম প্রথমে এর সিঙ্ক্রোনাস অংশটি চালান তারপরে সময়সূচীটি নির্ধারণ করে promisesএবং timersপরবর্তী লুপগুলিতে চালিত হওয়ার জন্য এবং যখন সেগুলি সমাধান করা হয় তা পরীক্ষা করা হয়, অন্য লুপে কলব্যাকগুলি চালান। এই সাধারণ বক্তব্যটি এটি খুব ভালভাবে ব্যাখ্যা করেছে, @ স্টেফেনগ্রাইডারকে কৃতিত্ব:


const pendingTimers = [];
const pendingOSTasks = [];
const pendingOperations = [];

// New timers, tasks, operations are recorded from myFile running
myFile.runContents();

function shouldContinue() {
  // Check one: Any pending setTimeout, setInterval, setImmediate?
  // Check two: Any pending OS tasks? (Like server listening to port)
  // Check three: Any pending long running operations? (Like fs module)
  return (
    pendingTimers.length || pendingOSTasks.length || pendingOperations.length
  );
}

// Entire body executes in one 'tick'
while (shouldContinue()) {
  // 1) Node looks at pendingTimers and sees if any functions
  // are ready to be called.  setTimeout, setInterval
  // 2) Node looks at pendingOSTasks and pendingOperations
  // and calls relevant callbacks
  // 3) Pause execution. Continue when...
  //  - a new pendingOSTask is done
  //  - a new pendingOperation is done
  //  - a timer is about to complete
  // 4) Look at pendingTimers. Call any setImmediate
  // 5) Handle any 'close' events
}

// exit back to terminal

মনে রাখবেন যে ওএস কাজগুলি মুলতুবি না হওয়া পর্যন্ত ইভেন্টের লুপটি কখনই শেষ হবে না। অন্য কথায়, এইচটিটিপি অনুরোধগুলি মুলতুবি না হওয়া পর্যন্ত আপনার নোড কার্যকর করা কখনই শেষ হবে না।

আপনার ক্ষেত্রে এটি একটি asyncফাংশন চালায় , যেহেতু এটি সর্বদা কোনও প্রতিশ্রুতি ফিরিয়ে দেবে, এটি পরবর্তী লুপ পুনরাবৃত্তিতে এটি সম্পাদন করার সময়সূচী করবে। আপনার অ্যাসিঙ্ক ফাংশনে, আপনি সেই পুনরাবৃত্তিতে একবারে আরও 1000 প্রতিশ্রুতি (HTTP অনুরোধগুলি) নির্ধারণ করুন map। এরপরে, আপনি তখন সবার অপেক্ষায় রয়েছেন প্রোগ্রামটি শেষ করার সংকল্পবদ্ধ। এটি নিশ্চিতভাবে কাজ করবে, যদি না আপনার অনামী তীর ফাংশনটি mapকোনও ত্রুটি না ফেলে । যদি আপনার প্রতিশ্রুতিগুলির মধ্যে একটি ত্রুটি ছুঁড়ে ফেলে এবং আপনি এটি পরিচালনা করেন না, তবে কিছু প্রতিশ্রুতি তাদের কলব্যাক কখনও কল করে না প্রোগ্রামটি শেষ করার জন্য, কিন্তু প্রস্থান না করার জন্য , কারণ ইভেন্ট লুপ এটি সমাধান না হওয়া পর্যন্ত প্রস্থান করতে বাধা দেবে because কলব্যাক ছাড়াই সমস্ত কাজ যেমন এটিতে বলা আছেPromise.all ডক্স : প্রথম প্রতিশ্রুতি প্রত্যাখ্যান করার সাথে সাথে এটি প্রত্যাখ্যান করবে।

সুতরাং, আপনার অনটি ECONNRESETত্রুটিটি নোডের সাথে সম্পর্কিত নয়, আপনার নেটওয়ার্কের সাথে এমন একটি জিনিস যা ফিচারটিকে একটি ত্রুটি ছুঁড়ে ফেলতে এবং তারপরে ইভেন্টটির লুপটি শেষ হতে না পারে। এই সামান্য সংশোধন করে, আপনি সমস্ত অনুরোধগুলি অবিচ্ছিন্নভাবে সমাধান করা দেখতে সক্ষম হবেন:

const fetch = require("node-fetch");

(async () => {
  try {
    const promises = Array(1000)
      .fill(1)
      .map(async (_value, index) => {
        try {
          const url = "https://google.com/";
          const response = await fetch(url);
          console.log(index, response.statusText);
          return response;
        } catch (e) {
          console.error(index, e.message);
        }
      });
    await Promise.all(promises);
  } catch (e) {
    console.error(e);
  } finally {
    console.log("Done");
  }
})();

আরে, পেড্রো চেষ্টা করার জন্য ধন্যবাদ আপনাকে ধন্যবাদ। আমি সচেতন যে প্রথম প্রতিশ্রুতি প্রত্যাখ্যান প্রদর্শিত হবে যখন প্রতিশ্রুতি। সমস্ত প্রত্যাখ্যান করবে কিন্তু বেশিরভাগ ক্ষেত্রে প্রত্যাখ্যান করতে কোন ত্রুটি ছিল না যাতে পুরো জিনিসটি কেবল অলস হয়ে যায়।
রিস্তো নভিক

1
> ওএস কাজগুলি মুলতুবি না হওয়া পর্যন্ত ইভেন্টের লুপটি কখনই শেষ হবে না Rep অন্য কথায়, এইচটিটিপি অনুরোধগুলি মুলতুবি না হওয়া পর্যন্ত আপনার নোড কার্যকর করা কখনই শেষ হবে না। এটি একটি আকর্ষণীয় বিষয় বলে মনে হচ্ছে, ওএস টাস্কগুলি লিবুভের মাধ্যমে পরিচালিত হয়?
রিস্তো নভিক

আমার ধারণা লিবুভ অপারেশন সম্পর্কিত আরও কিছু জিনিস পরিচালনা করে (যে জিনিসগুলিতে সত্যিকার অর্থে মাল্টি-থ্রেডিং দরকার)। তবে আমি ভুল হতে পারি, আরও গভীরতার সাথে দেখার দরকার
পেড্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.