নোড.জেএস এবং সিপিইউ নিবিড় অনুরোধগুলি


215

আমি নোড.জেএস এইচটিটিপি সার্ভারের সাথে টিঙ্কারিং শুরু করেছি এবং সত্যিই সার্ভার সাইড জাভাস্ক্রিপ্ট লিখতে পছন্দ করি তবে কিছু আমার ওয়েব অ্যাপ্লিকেশনের জন্য নোড.জেএস ব্যবহার শুরু করা থেকে বিরত রাখে।

আমি পুরো async I / O ধারণাটি বুঝতে পারি তবে আমি প্রান্তের ক্ষেত্রে কিছুটা উদ্বিগ্ন যেখানে প্রসেসরিজ কোডটি খুব সিপিইউ নিবিড় যেমন চিত্রের হেরফের বা বড় ডেটা সেটগুলি বাছাই করা।

যেহেতু আমি এটি বুঝতে পেরেছি, সাধারণ ওয়েব পৃষ্ঠার অনুরোধগুলির জন্য যেমন ব্যবহারকারীদের তালিকা দেখা বা একটি ব্লগ পোস্ট দেখার জন্য সার্ভারটি খুব দ্রুত হবে। যাইহোক, আমি গ্রাফিক্স উত্পন্ন করে বা হাজারে চিত্রের আকার পরিবর্তন করে এমন খুব সিপিইউ নিবিড় কোড (উদাহরণস্বরূপ অ্যাডমিনের পিছনের প্রান্তে) লিখতে চাইলে অনুরোধটি খুব ধীর হবে (কয়েক সেকেন্ড)। যেহেতু এই কোডটি অ্যাসিঙ্ক নয়, তাই এই কয়েক সেকেন্ডের মধ্যে সার্ভারে আসা প্রতিটি অনুরোধগুলি আমার ধীর অনুরোধটি না করা পর্যন্ত অবরুদ্ধ করা হবে।

একটি পরামর্শ ছিল সিপিইউ নিবিড় কাজের জন্য ওয়েব ওয়ার্কার্সকে ব্যবহার করা। তবে আমি ভয় করি যে ওয়েব কর্মীরা ক্লিন কোড লিখতে কঠিন করে তুলবে কারণ এটি একটি পৃথক জেএস ফাইল যুক্ত করে কাজ করে। সিপিইউ নিবিড় কোড যদি কোনও বস্তুর পদ্ধতিতে থাকে? এটি সিপিইউ নিবিড় প্রতিটি পদ্ধতির জন্য একটি জেএস ফাইল লিখতে ব্যর্থ হয়।

অন্য একটি পরামর্শ ছিল একটি শিশু প্রক্রিয়া উত্সাহিত করা, কিন্তু এটি কোডটিকে আরও কম রক্ষণাবেক্ষণ করে তোলে।

এই (অনুভূত) বাধা অতিক্রম করার জন্য কোনও পরামর্শ? সিপিইউ ভারী কাজগুলি async কার্যকর করা হয়েছে তা নিশ্চিত করার সময় আপনি নোড.জেএস সহ ক্লিন অবজেক্ট ওরিয়েন্টেড কোড কীভাবে লিখবেন?


2
অলিভিয়ার, আপনি আমার মনে যে অনুরূপ প্রশ্নটি করেছিলেন (নোডে নতুন) এবং বিশেষত চিত্রগুলি প্রক্রিয়াকরণের বিষয়ে asked জাভাতে আমি একটি স্থির-থ্রেড এক্সিকিউটর সার্ভিস ব্যবহার করতে পারি এবং এটি সমস্ত আকার পরিবর্তনকারী চাকরিগুলি পাস করতে এবং সমস্ত সংযোগটি শেষ করার জন্য অপেক্ষা করতে পারি, নোডে, আমি কীভাবে কোনও বাহ্যিক মডিউলকে সীমাবদ্ধ রাখার কাজটি বন্ধ করতে পারি তা বুঝতে পারি না (আসুন আসুন বলুন) এক সাথে একযোগে অপারেশনের সর্বাধিক সংখ্যা 2। আপনি এটি করার একটি মার্জিত উপায় খুঁজে পেয়েছেন?
রিয়াদ কল্লা

উত্তর:


55

আপনার যা দরকার তা হল টাস্কের সারি! আপনার দীর্ঘকালীন চলমান কার্যগুলি ওয়েব-সার্ভারের বাইরে সরিয়ে নেওয়া খুব ভাল। প্রতিটি কাজকে "পৃথক" জেএস ফাইলের মধ্যে রাখলে মডুলারালিটি এবং কোড পুনরায় ব্যবহারের প্রচার হয়। এটি আপনাকে কীভাবে আপনার প্রোগ্রামটিকে এমনভাবে কাঠামোবদ্ধ করার বিষয়ে চিন্তা করতে বাধ্য করে যা দীর্ঘমেয়াদে ডিবাগ করা এবং বজায় রাখা সহজ করে তোলে। একটি টাস্ক কাতারের আরেকটি সুবিধা হ'ল শ্রমিকরা ভিন্ন ভাষায় লেখা যায়। শুধু একটি কাজ পপ করুন, কাজ করুন, এবং প্রতিক্রিয়া ফিরে লিখুন।

এই https://github.com/resque/resque এর মতো কিছু

তারা এটি কেন তৈরি করেছে সে সম্পর্কে এখানে গিথুব থেকে একটি নিবন্ধ দেওয়া হয়েছে http://github.com/blog/542-introducing-resque


35
নোড ওয়ার্ল্ডে বিশেষত ভিত্তি করে তৈরি প্রশ্নে আপনি কেন রুবি লাইব্রেরিগুলির সাথে সংযোগ করছেন?
জোনাথন ডুমাইন

1
@ জোনাথনডুমাইন এটি একটি কার্য সারিটির একটি ভাল বাস্তবায়ন। রুবি কোডটি র‌্যাড করুন এবং জাভাস্ক্রিপ্টে এটি আবার লিখুন। লাভ!
সাইমন স্টেন্ডার বোয়েসেন

2
আমি এর জন্য গিয়ারম্যানের একটি বড় অনুরাগী, গিয়ারম্যান কর্মীরা নতুন কাজের জন্য একটি গিয়ারম্যান সার্ভারটি পোল করেন না - নতুন চাকরি তাত্ক্ষণিকভাবে শ্রমিকদের দিকে ঠেলে দেওয়া হয়। খুব প্রতিক্রিয়াশীল
ক্যাসি ফ্লাইন

1
প্রকৃতপক্ষে, কেউ এটিকে নোডের জগতে রেখেছেন
FrontierP

@ পেসারিয়র, আপনি কেন বলছেন? আপনি কি প্রস্তাব করেন?
luis.espinal

289

এটি ওয়েব সার্ভারের সংজ্ঞা সম্পর্কে ভুল বোঝাবুঝি - এটি কেবল ক্লায়েন্টদের সাথে "আলাপ" করার জন্য ব্যবহার করা উচিত। ভারী লোড টাস্কগুলি স্বতন্ত্র প্রোগ্রামগুলিতে অর্পণ করা উচিত (অবশ্যই এটি জেএসেও লেখা যেতে পারে)।
আপনি সম্ভবত বলবেন যে এটি নোংরা, তবে আমি আপনাকে আশ্বস্ত করি যে একটি ওয়েব সার্ভার প্রক্রিয়া চিত্রগুলির আকার পরিবর্তন করতে আটকা পড়েছে কেবল খারাপ (এমনকি এটি অ্যাপাচি বলতে দেবে, যখন এটি অন্যান্য অনুসন্ধানগুলিকে অবরুদ্ধ করে না)। তবুও, কোড অপ্রয়োজনীয়তা এড়াতে আপনি একটি সাধারণ লাইব্রেরি ব্যবহার করতে পারেন।

সম্পাদনা: আমি একটি উপমা নিয়ে এসেছি; ওয়েব অ্যাপ্লিকেশনটি একটি রেস্তোঁরা হিসাবে হওয়া উচিত। আপনার ওয়েটার (ওয়েব সার্ভার) এবং কুক (কর্মী) রয়েছে। ওয়েটাররা ক্লায়েন্টদের সাথে যোগাযোগ করে এবং সাধারণ কাজগুলি করে যেমন মেনু সরবরাহ করা বা কোনও থালা নিরামিষ হয় কিনা তা বোঝানো। অন্যদিকে তারা রান্নাঘরে আরও শক্ত কাজ অর্পণ করে। কারণ ওয়েটাররা কেবলমাত্র সাধারণ কাজগুলি করে যা তারা দ্রুত সাড়া দেয় এবং রান্নাবানীরা তাদের কাজটিতে মনোনিবেশ করতে পারে।

নোড.জেএস এখানে একক তবে খুব প্রতিভাবান ওয়েটার হতে পারে যা একসাথে অনেকগুলি অনুরোধ প্রক্রিয়াকরণ করতে পারে এবং অ্যাপাচি বোবা ওয়েটারদের একটি দল যারা কেবল একটি অনুরোধ প্রক্রিয়া করে। যদি এই একটি নোড.জেএস ওয়েটার রান্না করা শুরু করে, তবে এটি তাত্ক্ষণিক বিপর্যয় হবে। তবুও, রান্নাঘর এমনকি রান্নাঘরের বিশৃঙ্খলা এবং দায়বদ্ধতার ক্রমহ্রাসমান হ্রাসের কথা উল্লেখ না করেও অ্যাপাচি ওয়েটারদের সরবরাহ করতে পারে exha


6
ঠিক আছে, এমন পরিবেশে যেখানে ওয়েব সার্ভারগুলি বহু-থ্রেডযুক্ত বা মাল্টি-প্রক্রিয়াযুক্ত এবং একাধিক একসাথে অনুরোধ পরিচালনা করতে পারে, একক অনুরোধে কয়েক সেকেন্ড ব্যয় করা খুব সাধারণ বিষয়। মানুষ তা আশা করতে এসেছে। আমি বলব যে ভুল বোঝাবুঝি হ'ল নোড.জেএস একটি "নিয়মিত" ওয়েব সার্ভার। নোড.জেএস ব্যবহার করে আপনাকে আপনার প্রোগ্রামিং মডেলটি কিছুটা সামঞ্জস্য করতে হবে এবং এর মধ্যে কিছু দীর্ঘমেয়াদী কর্মীকে "দীর্ঘকালীন" কাজ চালিয়ে যাওয়া অন্তর্ভুক্ত রয়েছে।
থিলো

13
প্রতিটি অনুরোধের জন্য শিশু প্রক্রিয়া উত্সাহিত করবেন না (যা নোড.জেএস এর উদ্দেশ্যকে পরাস্ত করে)। শুধুমাত্র আপনার ভারী অনুরোধগুলির ভিতরে থেকে কর্মীদের স্পন করুন। বা আপনার ভারী ব্যাকগ্রাউন্ডের কাজটি নোড.জেএস ব্যতীত অন্য কোনও জায়গায় নিয়ে যান
থিলো

47
ভাল উপমা, এমবিকিউ!
ল্যান্স ফিশার

6
হা, আমি সত্যিই এটি পছন্দ। "নোড.জেএস: খারাপ অভ্যাসগুলি খারাপভাবে কাজ করে"
ইথান

7
@mbq আমি উপমা পছন্দ করি তবে এটি কিছু কাজ করতে পারে। Traditionalতিহ্যবাহী মাল্টিথ্রেডেড মডেল এমন একজন ব্যক্তি যাঁরা ওয়েটার এবং রান্না উভয়ই হন। অর্ডার নেওয়া হয়ে গেলে, সেই ব্যক্তিকে অন্য অর্ডার পরিচালনা করতে সক্ষম হওয়ার আগে ফিরে গিয়ে খাবার রান্না করতে হবে। নোড.জেএস মডেলটির ওয়েটার হিসাবে নোড এবং রান্নার জন্য ওয়েব ওয়ার্কার্স রয়েছে। কর্মীরা আরও সময় নিবিড় কাজ পরিচালনা করার সময় ওয়েটাররা অনুরোধগুলি আনার / সমাধানের কাজ পরিচালনা করে। আপনার যদি বৃহত্তর স্কেল প্রয়োজন হয় তবে আপনি কেবলমাত্র মূল সার্ভারকে নোড ক্লাস্টার তৈরি করুন এবং মিলটি থ্রেড প্রসেসিংয়ের জন্য নির্মিত অন্যান্য সার্ভারগুলিতে সিপিইউ নিবিড় কাজগুলি বিপরীত করুন।
ইভান প্লেস

16

আপনি চান না যে আপনার সিপিইউ নিবিড় কোডটি অ্যাসিঙ্ক কার্যকর করতে পারে, আপনি চাইছেন এটি সমান্তরালে কার্যকর করা হোক । আপনাকে HTTP অনুরোধগুলি সরবরাহ করে এমন থ্রেড থেকে প্রসেসিংয়ের কাজটি সরিয়ে নেওয়া দরকার। এই সমস্যাটি সমাধান করার একমাত্র উপায়। নোডজেএসের সাথে উত্তরটি ক্লাস্টার মডিউল module, ভারী উত্তোলন করার জন্য শিশুদের প্রক্রিয়া তৈরি করতে। (আফাইক নোডের থ্রেড / ভাগ করা মেমরির কোনও ধারণা নেই; এটি প্রক্রিয়াগুলি বা কিছুই নয়)। আপনি কীভাবে আপনার অ্যাপ্লিকেশনটি গঠন করেন তার দুটি বিকল্প রয়েছে। আপনি 8 টি এইচটিটিপি সার্ভার তৈরি করে এবং সন্তানের প্রক্রিয়াগুলিতে একযোগে গণনা-নিবিড় কাজগুলি পরিচালনা করে 80/20 সমাধান পেতে পারেন। এটি করা মোটামুটি সহজ। আপনি এই লিঙ্কটিতে এটি পড়তে এক ঘন্টা সময় নিতে পারে। প্রকৃতপক্ষে, আপনি যদি সেই লিঙ্কের শীর্ষে উদাহরণ কোডটি ছিঁড়ে ফেলেন তবে আপনি নিজেই সেখানে 95% পথ পাবেন।

এটি গঠনের অন্যান্য উপায় হ'ল একটি কাজের সারি সেট আপ করা এবং কাতারে বড় গণনা কার্য পাঠানো। মনে রাখবেন যে আইপিসির সাথে কাজের সারির জন্য প্রচুর ওভারহেড যুক্ত রয়েছে, সুতরাং যখন কাজগুলি ওভারহেডের তুলনায় প্রশংসনীয়ভাবে বড় হয় তখন এটি কেবল কার্যকর হয়।

আমি অবাক হয়েছি যে এই উত্তরগুলির কোনওটিরও ক্লাস্টারের উল্লেখ নেই

পটভূমি: অ্যাসিঙ্ক্রোনাস কোড এমন কোড যা অন্য কোথাও না হওয়া পর্যন্ত স্থগিত হয়ে যায় , এই মুহুর্তে কোডটি ঘুম থেকে ওঠে এবং কার্যকর হয়। একটি খুব সাধারণ কেস যেখানে ধীরে ধীরে অন্য কোথাও ঘটতে হবে তা হ'ল I / O।

অ্যাসিক্রোনাস কোড কার্যকর না যদি এটি আপনার প্রসেসর যা কাজটি করার জন্য দায়বদ্ধ। "গণনা নিবিড়" কাজগুলির ক্ষেত্রে এটি অবশ্যই স্পষ্ট।

এখন, এটি মনে হতে পারে যে অ্যাসিক্রোনাস কোডটি কুলুঙ্গি তবে বাস্তবে এটি খুব সাধারণ। এটি কেবল সংখ্যক নিবিড় কাজের জন্য দরকারী না হয় happens

I / O এর জন্য অপেক্ষা করা এমন একটি প্যাটার্ন যা সর্বদা ওয়েব সার্ভারে ঘটে। আপনার ক্লাসে সংযুক্ত প্রতিটি ক্লায়েন্ট একটি সকেট পান। বেশিরভাগ সময় সকেট খালি থাকে। কোনও সকেট কিছু তথ্য না পাওয়া পর্যন্ত আপনি কিছু করতে চান না, আপনি যে মুহুর্তে অনুরোধটি পরিচালনা করতে চান। হুডের নীচে নোডের মতো একটি এইচটিটিপি সার্ভার হাজার হাজার খোলা সকেটের উপর নজর রাখতে ইভেন্ট ইভেন্ট লাইব্রেরি (লিভভ) ব্যবহার করছে। অপারেটিং সিস্টেমটি ওএসকে লিভভকে জানায়, এবং তারপরে নোডজেএস-কে যখন সকেটের কোনও একটি ডেটা পায় তখন নোডজেএস ইভেন্টটি কাতারে একটি ইভেন্ট রাখে এবং আপনার এইচটিপি কোড এই মুহুর্তে কিক্স করে এবং একের পর এক ইভেন্টগুলি পরিচালনা করে। সকেটের কিছু ডেটা না হওয়া পর্যন্ত ইভেন্টগুলি কাতারে উঠবে না, তাই ইভেন্টগুলি কখনই ডেটার জন্য অপেক্ষা করে না - এটি ইতিমধ্যে তাদের জন্য রয়েছে।

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


সঠিক উত্তর হওয়া উচিত .... সমাধান হিসাবে আপনি যেখানে 8 টি ক্লাস্টার রেখেছেন, আপনার 8 টি কোরের প্রয়োজন? বা একাধিক সার্ভার সহ ভারসাম্য লোড করুন।
মুহাম্মদ উমার

এছাড়াও একটি সারি স্থাপন, ২ য় সমাধান সম্পর্কে জানার ভাল উপায়। কিউ এর ধারণাটি খুব সহজ, তবে এটি প্রক্রিয়া এবং সারিগুলির মধ্যে মেসেজিং অংশ যা বিদেশী।
মুহাম্মদ উমার

সেটা ঠিক. আপনার কোনওরকমভাবে অন্য একটি কোরকে নিয়ে যাওয়া দরকার। তার জন্য, আপনার আরও একটি কোর প্রয়োজন।
মাসআঙ্ক

রে: সারি। ব্যবহারিক উত্তর হ'ল একটি কাজের সারি ব্যবহার করা। নোডের জন্য কিছু উপলব্ধ। আমি তাদের কোনওটিই ব্যবহার করি নি তাই আমি কোনও সুপারিশ করতে পারি না। কৌতূহলের উত্তর হ'ল কর্মী প্রক্রিয়া এবং সারি প্রক্রিয়াগুলি শেষ পর্যন্ত সকেটের মাধ্যমে যোগাযোগ করতে চলেছে।
মাসআঙ্ক

7

আপনি ব্যবহার করতে পারেন বেশ কয়েকটি পদ্ধতির।

@ টিম নোট হিসাবে, আপনি আপনার মূল পরিবেশন যুক্তিটির বাইরে বা সমান্তরাল হিসাবে একটি অ্যাসিনক্রোনাস টাস্ক তৈরি করতে পারেন। আপনার সঠিক প্রয়োজনীয়তার উপর নির্ভর করে, তবে ক্রোন এমনকি একটি সারি ব্যবস্থা হিসাবে কাজ করতে পারে।

ওয়েব ওয়ার্কাররা আপনার অ্যাসিঙ্ক প্রক্রিয়াগুলির জন্য কাজ করতে পারে তবে তারা বর্তমানে নোড.জেএস দ্বারা সমর্থিত নয় are সহায়তা প্রদানের জন্য বেশ কয়েকটি এক্সটেনশান রয়েছে, উদাহরণস্বরূপ: http://github.com/cramfor/node-worker

আপনি এখনও পাবেন "স্ট্যান্ডার্ড" প্রয়োজনীয় "প্রক্রিয়াটির মাধ্যমে মডিউল এবং কোডটি পুনরায় ব্যবহার করতে পারেন। আপনাকে কেবল এটি নিশ্চিত করতে হবে যে কর্মীদের প্রাথমিক প্রেরণ ফলাফল প্রক্রিয়া করার জন্য প্রয়োজনীয় সমস্ত তথ্য পাস করে।


0

ব্যবহার child_processএকটি সমাধান। তবে তৈরি প্রতিটি শিশু প্রক্রিয়া গোয়ের তুলনায় প্রচুর স্মৃতি গ্রহণ করতে পারেgoroutines

এছাড়াও আপনি যেমন কিউ ভিত্তিক সমাধান ব্যবহার করতে পারেন কূ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.