>웹 프론트엔드 >프런트엔드 Q&A >nodejs의 안정성을 향상시키는 방법

nodejs의 안정성을 향상시키는 방법

青灯夜游
青灯夜游원래의
2022-01-13 17:03:262347검색

nodejs의 안정성을 향상시키는 방법: 1. 좋은 코드 구조를 유지합니다. 2. 예외를 포착하기 위해 "try~catch"를 사용합니다. 3. 프로그램 예외를 처리하기 위해 도메인 모듈을 사용합니다. 5. 영원히 모듈을 사용하여 nodejs를 관리합니다.

nodejs의 안정성을 향상시키는 방법

이 튜토리얼의 운영 환경: windows7 시스템, nodejs 버전 12.19.0, DELL G3 컴퓨터.

nodejs 프로그램의 안정성과 견고성 향상

인터넷에서 nodejs 프로그램의 안정성에 대해 불만과 의문을 제기하는 게시물을 보았는데, 왜 그럴까요? 첫째, 아마도 이것은 JavaScript와 관련이 있을 것입니다. Node는 JavaScript로 구현되며 JavaScript는 "세계에서 가장 오해받는 언어"라고도 알려져 있습니다. 이 기사에서는 node가 javascript를 사용하여 구현하는 이유는 무엇입니까? 둘째, nodejs는 아직 초기 단계이고 공식 웹사이트에도 일부 모듈에서 이 모듈의 현재 상태가 표시되어 있습니다.

지난 이틀 동안 이 문제에 대해 고민하는 시간을 가졌습니다. 우리 프로그램의 첫 번째 기능은 독립적이어야 한다고 생각합니다. 하나의 기능이 비정상적이라면 다른 기능에 영향을 주어서는 안 되며, 전체 프로그램도 그렇지 않아야 합니다. 둘째, 프로그램이 충돌하더라도 자동으로 시작할 수 있는 프로그램이 있어야 합니다. 또한 문제를 쉽게 추적할 수 있도록 로그를 기록해야 합니다. nodejs의 안정성은 주로 다음과 같은 측면에서 향상될 수 있다고 생각합니다.

1) 좋은 코드 구조 유지:

우리는 노드가 단일 스레드, 비차단 IO, 기본적으로 비동기식이며 후속 처리를 처리한다는 것을 알고 있습니다. 중첩된 수준이 너무 많으면 필연적으로 코드 논리 구조에 혼란이 발생하고 유지 관리 및 업그레이드에 도움이 되지 않습니다. 비동기 프로세스 제어 모듈인 async를 사용하여 코드 논리를 명확하게 할 수 있습니다.

2) 잡히지 않은 오류를 처리하려면 process.on('uncaughtException', function(err){...});을 사용하세요.

3) try~catch를 사용하여 예외를 포착하세요.

이 방법은 문제의 일부만 해결할 수 있으며, 위에서 언급했듯이 노드는 단일 스레드, 비차단 IO이므로 기본값은 비동기식입니다. 콜백을 통해 후속 프로세스를 처리하려면 콜백에서 오류 오류를 try~catch에서 캡처할 수 없습니다. 콜백에서 오류를 캡처하는 방법은 무엇입니까? 도메인 모듈을 사용할 수 있습니다

4) 프로그램 예외를 처리하려면 도메인 모듈을 사용하세요

먼저 도메인에 대한 설명을 살펴보세요. 도메인은 EventEmitter 클래스의 하위 클래스입니다. 오류 이벤트를 수신하여 캡처된 오류를 처리합니다. 이는 여러 개의 서로 다른 IO 작업을 단일 그룹으로 처리하는 방법을 제공합니다. 도메인에 등록된 이벤트 트리거나 콜백이 'error' 이벤트를 트리거하거나 오류를 발생시키는 경우 도메인 객체에 알림이 전달됩니다. `process.on('uncaughtException')' 핸들러에서 이 오류의 컨텍스트를 직접 잃는 대신, 오류 코드가 수반되는 이 오류로 인해 프로그램이 즉시 종료되지는 않습니다.

도메인 모듈을 사용하는 방법은 무엇인가요? 예를 보세요:

serverDomain.run(function() {
  // 服务器在serverDomain的作用域内被创建
  http.createServer(function(req, res) {
    // req和res同样在serverDomain的作用域内被创建
    // 但是,我们想对于每一个请求使用一个不一样的域。
    // 所以我们首先创建一个域,然后将req和res添加到这个域上。
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
      } catch (er) {
        console.error('Error sending 500', er, req.url);
      }
    });
  }).listen(1337);    
});
```

설명: 먼저 도메인(domain.create())을 만든 다음 모니터링해야 하는 배포자를 도메인에 추가하고 마지막으로 모니터링할 수 있도록 오류 이벤트를 도메인에 바인딩합니다. .

또 다른 예를 보세요:

var d = domain.create();
d.on('error', function(er) {
  console.error('Caught error!', er);
});
d.run(function() {
  process.nextTick(function() {
    setTimeout(function() { // 模拟几个不同的异步的东西
      fs.open('non-existent file', 'r', function(er, fd) {
        if (er) throw er;
        // 继续。。。
      });
    }, 100);
  });
});

설명: 먼저 도메인을 만들고 오류 이벤트를 도메인에 바인딩한 다음 도메인 컨텍스트에서 실행할 수 있는 함수를 제공합니다.

콜백이 있으면 어떻게 되나요? 이렇게 사용하시면 됩니다

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

물론 이렇게도 사용하실 수 있습니다

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

이 함수는 domain.bind(콜백)과 거의 똑같습니다. 그러나 발생하는 오류를 잡는 것 외에도 이 함수에 첫 번째 인수로 전달된 Error 객체를 가로채기도 합니다.

5) log4js 모듈을 사용하여 로그 기록

Log4js는 매우 강력한 로그 관리 도구입니다. 이 github 프로젝트를 확인하세요: https://github.com/nomiddlename/log4js-node

6) nodejs를 관리하려면 Forever 모듈을 사용하세요

 Forever는 앱 애플리케이션을 시작하고 중지할 수 있는 명령줄 도구인 nodejs의 서버 측 관리를 위한 모듈입니다. Forever는 전적으로 명령줄 작업을 기반으로 합니다. Forever 프로세스의 관리하에 노드의 하위 프로세스가 생성되고, 파일이 업데이트되거나 프로세스가 완료되면 노드 하위 프로세스의 실행 상태가 모니터링됩니다. 중단되면 애플리케이션이 정상적으로 실행되는지 확인하기 위해 노드 서버가 자동으로 다시 시작됩니다. 사용하기 매우 쉽습니다.

이 프로젝트에 주목할 수 있습니다: https://github.com/nodejitsu/forever

그러나 영원히는 만병통치약이 아니며 다음과 같은 문제도 안고 있습니다.

  • 제한된 모니터링 및 로깅 기능
  • 프로세스 관리 구성에 대한 지원이 부족함
  • 클러스터를 지원하지 않음
  • 코드 베이스가 노후화됨(node.js를 업그레이드할 때 자주 실패함을 의미함)

첨부된 내용은 이 문서의 테스트 코드입니다: https://github .com/yupeng528/node-error

노드 관련 지식을 더 보려면 nodejs 튜토리얼을 방문하세요! !

위 내용은 nodejs의 안정성을 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.