আমি কীভাবে নোড.জেএসকে ক্রাশ হওয়া থেকে রক্ষা করব? চেষ্টা করা কাজ করে না


157

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

উত্তর:


132

আপনি নোডের নিজস্ব ডকুমেন্টগুলিতে http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception এ পড়তে পারবেন বলে অন্যান্য উত্তরগুলি সত্যই উন্মাদ

যদি কেউ অন্য বর্ণিত উত্তর ব্যবহার করে থাকে তবে নোড ডক্সটি পড়ুন:

নোটটি uncaughtExceptionব্যতিক্রম পরিচালনার জন্য খুব অশোধিত প্রক্রিয়া এবং ভবিষ্যতে মুছে ফেলা হতে পারে

PM2

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

অ্যাপটি নিজেই ক্রাশ হওয়া থেকে রোধ করার জন্য এখন আমাদের সমাধানে ফিরে আসছি।

সুতরাং পরে যাওয়ার পরে অবশেষে নোড ডকুমেন্ট নিজেই যা বলেছিল তা নিয়ে এসেছি:

ব্যবহার করবেন না uncaughtException, ব্যবহার domainsসঙ্গে clusterপরিবর্তে। আপনি যদি ব্যবহার না করেন তবে uncaughtExceptionপ্রতিটি অপ্রয়োজনীয় ব্যতিক্রমের পরে আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন!

ক্লাস্টার সহ DOMAIN

আমরা আসলে যা করি তা হ'ল অনুরোধটির একটি ত্রুটি প্রতিক্রিয়া প্রেরণ করা যা ত্রুটিটিকে ট্রিগার করে, অন্যকে তাদের স্বাভাবিক সময় শেষ করে দেয় এবং সেই কর্মীর মধ্যে নতুন অনুরোধ শুনতে শোনায়।

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

ব্যবহার করে Domainএবং একাধিক কর্মী প্রক্রিয়া ব্যবহার করে আমাদের প্রোগ্রামকে পৃথক করার স্থিতিস্থাপকতার দ্বারা Clusterআমরা আরও সঠিকভাবে প্রতিক্রিয়া জানাতে পারি এবং আরও বৃহত্তর সুরক্ষা সহ ত্রুটিগুলি পরিচালনা করতে পারি।

var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;

if(cluster.isMaster) 
{
   cluster.fork();
   cluster.fork();

   cluster.on('disconnect', function(worker) 
   {
       console.error('disconnect!');
       cluster.fork();
   });
} 
else 
{
    var domain = require('domain');
    var server = require('http').createServer(function(req, res) 
    {
        var d = domain.create();
        d.on('error', function(er) 
        {
            //something unexpected occurred
            console.error('error', er.stack);
            try 
            {
               //make sure we close down within 30 seconds
               var killtimer = setTimeout(function() 
               {
                   process.exit(1);
               }, 30000);
               // But don't keep the process open just for that!
               killtimer.unref();
               //stop taking new requests.
               server.close();
               //Let the master know we're dead.  This will trigger a
               //'disconnect' in the cluster master, and then it will fork
               //a new worker.
               cluster.worker.disconnect();

               //send an error to the request that triggered the problem
               res.statusCode = 500;
               res.setHeader('content-type', 'text/plain');
               res.end('Oops, there was a problem!\n');
           } 
           catch (er2) 
           {
              //oh well, not much we can do at this point.
              console.error('Error sending 500!', er2.stack);
           }
       });
    //Because req and res were created before this domain existed,
    //we need to explicitly add them.
    d.add(req);
    d.add(res);
    //Now run the handler function in the domain.
    d.run(function() 
    {
        //You'd put your fancy application logic here.
        handleRequest(req, res);
    });
  });
  server.listen(PORT);
} 

যদিও Domainঅবনতি মুলতুবি রয়েছে এবং নোডের ডকুমেন্টেশনে উল্লিখিত হিসাবে নতুন প্রতিস্থাপন আসার সাথে সাথে তা সরানো হবে

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

তবে নতুন প্রতিস্থাপন চালু না করা পর্যন্ত ক্লাস্টারের সাথে ডোমেন হ'ল নোড ডকুমেন্টেশনের পরামর্শ দেয় এমন একমাত্র ভাল সমাধান।

গভীরতা বোঝার জন্য Domainএবং Clusterপড়ার জন্য

https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated)

https://nodejs.org/api/cluster.html

ক্লাস্টার এবং ডোমেনগুলি সম্পর্কে আমাদের এই বিস্ময়কর গভীরতার ব্যাখ্যা ভাগ করে নেওয়ার জন্য @ স্ট্যানলি লুওকে ধন্যবাদ

ক্লাস্টার এবং ডোমেনগুলি


9
সতর্কতার একটি শব্দ, ডোমেন অবমূল্যায়ন মুলতুবি রয়েছে: লিঙ্ক । নোড ডক্স থেকে প্রস্তাবিত পদ্ধতি হ'ল ক্লাস্টার: লিঙ্কটি ব্যবহার করা ।
পল

4
restart your application after every unhandled exception!যদি 2000 ব্যবহারকারী ভিডিও স্ট্রিমিংয়ের জন্য নোড ওয়েব সার্ভার ব্যবহার করে এবং 1 জন ব্যতিক্রম পেয়েছে তবে পুনরায় চালু করা সমস্ত অন্যান্য ব্যবহারকারীকে বাধা দেবে না?
বিকাশ বনসাল

2
@VikasBansal হ্যাঁ যে হবে নিশ্চয় ব্যবহারকারী এবং কেন এটি ব্যবহার করতে খারাপ যে সব বাধা uncaughtExceptionএবং ব্যবহারের Domainসঙ্গে Clusterপরিবর্তে তাই হয়, একজন ব্যবহারকারী একটি ব্যতিক্রম তাই কেবল থ্রেড ক্লাস্টার থেকে সরানো এবং তার জন্য নতুন এক তৈরি করা হয় মুখোমুখি পারেন। এবং আপনার নোড সার্ভারটিও আবার চালু করার দরকার নেই। অন্যদিকে আপনি যদি ব্যবহার করেন তবে আপনাকে uncaughtExceptionপ্রতিবার আপনার ব্যবহারকারীর যে কোনও সমস্যার মুখোমুখি হওয়াতে আপনার সার্ভারটি পুনরায় চালু করতে হবে। সুতরাং, ক্লাস্টার সহ ডোমেন ব্যবহার করুন।
এয়ারি

3
domainপুরোপুরি হ্রাস এবং অপসারণ করা হলে আমাদের কী করা উচিত ?
জাস

3
তাদের জন্য এই টিউটোরিয়াল যারা ধারণা বুঝতে পারছি না পাওয়া clusterএবং workers: sitepoint.com/...
স্ট্যানলি লুয়ো

81

আমি এই কোডটি আমার প্রয়োজনীয় বিবৃতি এবং বিশ্বব্যাপী ঘোষণার আওতায় রেখেছি:

process.on('uncaughtException', function (err) {
  console.error(err);
  console.log("Node NOT Exiting...");
});

আমার জন্য কাজ কর. আমি কেবল এটি সম্পর্কে পছন্দ করি না তা হ'ল আমি কেবল জিনিসটি ক্র্যাশ করতে দিলে আমি যতটা তথ্য পাই না।


45
সাবধানতার একটি শব্দ: এই পদ্ধতিটি দুর্দান্তভাবে কাজ করে, তবে মনে রাখবেন যে সমস্ত HTTP প্রতিক্রিয়াগুলি সঠিকভাবে শেষ করা দরকার। এর অর্থ হ'ল আপনি যদি এইচটিটিপি অনুরোধটি পরিচালনা করার সময় যদি কিছু অযোগ্য ব্যতিক্রম ঘটে থাকে তবে আপনাকে অবশ্যই http.ServerResponse অবজেক্টে end () কল করতে হবে। তবে আপনি বাস্তবায়ন এটি আপনার উপর নির্ভর করে। আপনি যদি এটি না করেন তবে ব্রাউজারটি হাল ছাড়ার আগে পর্যন্ত আবেদনটি স্থগিত থাকবে। যদি আপনার কাছে এই অনুরোধগুলির যথেষ্ট পরিমাণ থাকে তবে সার্ভারটির মেমরি শেষ হয়ে যাবে।
বিএমিনার

3
@ বিমিনার, আপনি কি আরও কার্যকর বাস্তবায়ন দিতে পারবেন? আমি এই সমস্যাটি লক্ষ্য করেছি (হ্যাং করার অনুরোধ) সুতরাং এটি ব্যবহার করে সার্ভার পুনরায় আরম্ভ foreverবা কিছু ব্যবহারের চেয়ে ভাল না ।
পিক্সেলফ্রেইক

6
এটি গভীরতর ব্যাখ্যা প্রয়োজন। আমি জানি এটি সফল হয়, কিন্তু যখনই কোনও ব্যতিক্রম ব্যতিক্রম ঘটে তখন আপনার সার্ভারকে ASAP পুনরায় বুট করা দরকার। সত্যই, 'অপ্রচলিত ধারণা' ইভেন্টের উদ্দেশ্য হ'ল এটি একটি সতর্কতা ইমেল প্রেরণের সুযোগ হিসাবে ব্যবহার করা, এবং তারপরে প্রক্রিয়া.এক্সিট (1) ব্যবহার করা; সার্ভার বন্ধ করতে। আপনি সার্ভার পুনরায় চালু করতে চিরকাল বা এর মতো কিছু ব্যবহার করতে পারেন। কোনও মুলতুবি এইচটিটিপি অনুরোধের সময়সীমা শেষ হবে এবং ব্যর্থ হবে। আপনার ব্যবহারকারীরা আপনাকে উন্মাদ করবে। তবে, এটি সেরা সমাধান তুমি কেন জিজ্ঞেস করছ? চেকআউট stackoverflow.com/questions/8114977/...
BMiner

3
অনাবৃত ত্রুটি থেকে আরও তথ্য পেতে, ব্যবহার করুন: কনসোল.ট্রেস (err.stack);
জেসি ডানলাপ

2
সতর্কতা: নোড ডকুমেন্টেশন বলছেন, কোন অনিশ্চিত পদ, আপনি যেমন এর পাগল বিপজ্জনক এই কাজ কখনোই করা উচিত: nodejs.org/api/process.html#process_event_uncaughtexception
জেরেমি লোগান

28

এখানে উল্লিখিত হিসাবে আপনি error.stackএকটি আরও সম্পূর্ণ ত্রুটি বার্তা সরবরাহ করতে পারেন যেমন লাইন নম্বর যা ত্রুটির কারণ হয়েছিল:

process.on('uncaughtException', function (error) {
   console.log(error.stack);
});

12

চেষ্টা supervisor

npm install supervisor
supervisor app.js

অথবা আপনি foreverপরিবর্তে ইনস্টল করতে পারেন ।

আপনার সার্ভারটি পুনরায় চালু করে ক্র্যাশ করলে এটি পুনরুদ্ধার করে।

forever কোডের মধ্যে ক্র্যাশ হয়ে যাওয়া যে কোনও প্রক্রিয়া রহমত করে পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।

foreverডক্স প্রস্থান / ত্রুটি প্রোগ্রামেটিক্যালি পরিচালনা কঠিন তথ্য নেই।


9
অবশ্যই এটি সমাধান হতে পারে না ... যে সময়টিতে সার্ভারটি ডাউন রয়েছে এটি নতুন আগত অনুরোধগুলিতে সাড়া দিতে পারে না। অ্যাপ্লিকেশন কোড থেকে একটি ব্যতিক্রম ছুঁড়ে ফেলা হতে পারে - সার্ভারকে 500 টি ত্রুটির সাথে সাড়া দেওয়া দরকার, কেবল ক্র্যাশ নয় এবং এটি পুনরায় আরম্ভ হওয়ার আশা করছে।
এন্ট কুটসেরা

20
হ্যাকার হিসাবে, কেউ বুঝতে পারে যে তাদের সার্ভারে একটি সাধারণ অনুরোধ প্রেরণ করা এবং একটি অনুরোধ পরামিতি মিস করা দরকার - যা জাভাস্ক্রিপ্টে একটি অপরিবর্তিত হয় যার ফলে নোড.জেএস ক্র্যাশ হয়। আপনার পরামর্শের সাথে আমি আপনার পুরো ক্লাস্টারটি বারবার হত্যা করতে পারি। উত্তরটি হ'ল অ্যাপ্লিকেশনটি কৌতূহলীভাবে ব্যর্থ করে তোলে - অর্থাত্ অব্যাহত ব্যতিক্রমটি পরিচালনা করুন এবং ক্র্যাশ করবেন না। যদি সার্ভারটি অনেক ভিওআইপি সেশন পরিচালনা করে? এটি ক্রাশ এবং দগ্ধ হওয়া এবং এটির সাথে উপস্থিত সমস্ত বিদ্যমান অধিবেশনের পক্ষে এটি গ্রহণযোগ্য নয়। আপনার ব্যবহারকারীরা শীঘ্রই চলে যাবেন।
এন্ট কুটসেরা

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

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

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

7

ট্র্যাচ-ক্যাচ ব্যবহার করা অনাবৃত ত্রুটিগুলি সমাধান করতে পারে তবে কিছু জটিল পরিস্থিতিতে এটি ঠিক কাজটি করবে না যেমন অ্যাসিঙ্ক ফাংশন ধরা। মনে রাখবেন যে নোডে, কোনও অ্যাসিঙ্ক ফাংশন কলগুলিতে একটি সম্ভাব্য অ্যাপ ক্রাশিং অপারেশন থাকতে পারে।

ব্যবহার uncaughtExceptionকরা একান্ত কার্যকরী তবে এটি অদক্ষ হিসাবে স্বীকৃত এবং নোডের ভবিষ্যতের সংস্করণগুলিতে মুছে ফেলার সম্ভাবনা রয়েছে, সুতরাং এটিতে বিশ্বাস করবেন না।

আদর্শ সমাধানটি ডোমেন ব্যবহার করা: http://nodejs.org/api/domain.html ml

আপনার অ্যাপ্লিকেশনটি চালু রয়েছে এবং আপনার সার্ভার ক্রাশ হয়েছে এমনটি নিশ্চিত করার জন্য, নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:

  1. কোর প্রতি একাধিক প্রক্রিয়া কাঁটাচামচ নোড ক্লাস্টার ব্যবহার করুন। সুতরাং যদি একটি প্রক্রিয়া মারা যায়, অন্য প্রক্রিয়াটি অটো বুট হবে। দেখুন: http://nodejs.org/api/cluster.html .h

  2. অ্যাসিঙ্ক অপারেশন ধরার জন্য ডোমেন ব্যবহার করে দেখুন চেষ্টা বা ক্যাচ না করে ব্যবহার করুন। আমি বলছি না যে ট্রাই-ক্যাচ বা অবহেলা খারাপ ধারণা!

  3. আপনার পরিষেবাগুলি নিরীক্ষণ করতে চিরতরে / সুপারভাইজার ব্যবহার করুন

  4. আপনার নোড অ্যাপটি চালাতে ডেমন যুক্ত করুন: http://upstart.ubuntu.com

আশাকরি এটা সাহায্য করবে!


4

Pm2 নোড মডিউলটি চেষ্টা করে দেখুন এটি অনেকটা সুসংগত এবং দুর্দান্ত ডকুমেন্টেশন রয়েছে। বিল্ট-ইন লোড ব্যালেন্সার সহ নোড.জেএস অ্যাপসের জন্য উত্পাদন প্রক্রিয়া পরিচালক। এই সমস্যার জন্য অনুগ্রহপূর্বক এড়ানো দয়া করে। https://github.com/Unitech/pm2


every প্রতি আবেদনহীন ব্যতিক্রমের পরে আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন! 2000 যদি 2000 ব্যবহারকারী ভিডিও স্ট্রিমিংয়ের জন্য নোড ওয়েব সার্ভার ব্যবহার করছেন এবং 1 জন ব্যবহারকারী একটি ব্যতিক্রম পেয়েছে তবে পুনরায় চালু করা সমস্ত অন্যান্য ব্যবহারকারীকে বাধা দেবে না?
বিকাশ বনসাল

আমি যখন পিএম 2 আবিষ্কার করলাম তখন আমি খুব খুশি হয়েছিলাম। সফটওয়্যারটির দুর্দান্ত অংশ
ম্লাদেন জঞ্জেটোভিচ

0

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

https://github.com/vacuumlabs/yacol

আপনি এটি করতে সাহায্য করতে পারেন। অতিরিক্ত কিছু লেখার সাথে আপনার কোডের চারপাশে দুর্দান্ত ডোমেন শব্দার্থক শব্দ থাকতে পারে!


0

স্বাচ্ছন্দ্যে দুর্দান্ত কাজ করে:

server.on('uncaughtException', function (req, res, route, err) {
  log.info('******* Begin Error *******\n%s\n*******\n%s\n******* End Error *******', route, err.stack);
  if (!res.headersSent) {
    return res.send(500, {ok: false});
  }
  res.write('\n');
  res.end();
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.