2017-09-18 6 views
0

으로 작성된 마이크로 서비스가 여러 개 있는데 Docker Swarm으로 실행 중입니다.Docker Swarm을 사용할 때 nodejs 마이크로 서비스를 정상적으로 종료합니다.

Kubernetes 또는 Swarm과 같은 컨테이너 오케스트레이션 도구는 즉시 서비스를 위아래로 확장 할 수 있으므로 Nodejs 서비스를 정상적으로 종료하여 미완료 된 실행 프로세스를 방지하는 데 대한 질문이 있습니다. 서비스을 확장 할 때 고정 표시기 떼 가 직원에게 SIGNINT를 보낼 수 있습니까, 각 작업자 프로세스에 SIGNINT 신호를 전송

  1. : 아래

    내가 생각할 수있는 흐름이다?
  2. 작업자

  3. 가 어떻게 실행중인 프로세스가 아래로 를 종료하기 전에 완료 될 때까지 기다립니다, 새로운 API 요청을 중지 할 수 있습니다 신호, 정리 또는 무료 모든 사용되는 리소스를 잡아하고 그 절차를 완료 할 책임이있다? 참조에서

    아래의 일부 코드 :

    process.on('SIGINT',() => { 
        const cleanUp =() => { 
        // How can I clean resources like DB connections using Sequelizer 
        } 
    
        server.close(() => { 
    
        cleanUp() 
        process.exit() 
        }) 
    
        // Force close server after 5secs, `Should I do this?` 
        setTimeout((e) => { 
        cleanUp() 
        process.exit(1) 
        }, 5000) 
    }) 
    

답변

1

난 당신이 설명 우아한 종료를 처리 할 수있는 라이브러리 (https://github.com/sebhildebrandt/http-graceful-shutdown를) 만들었습니다. Express와 Koa에서 잘 작동합니다.

또한 추가로 DB 물건 같은 물건을 정리 (약속을 반환해야합니다) 함수를 만들 수있는이 패키지 ... 여기에 몇 가지 예제 코드 사용 방법 :

const gracefulShutdown = require('http-graceful-shutdown'); 
... 
server = app.listen(...); 
... 

// your personal cleanup function - this one takes one second to complete 
function cleanup() { 
    return new Promise((resolve) => { 
    console.log('... in cleanup') 
    setTimeout(function() { 
     console.log('... cleanup finished'); 
     resolve(); 
    }, 1000)  
    }); 
} 

// this enables the graceful shutdown with advanced options 
gracefulShutdown(server, 
    { 
     signals: 'SIGINT SIGTERM', 
     timeout: 30000, 
     development: false, 
     onShutdown: cleanup, 
     finally: function() { 
      console.log('Server gracefulls shutted down.....') 
     } 
    } 
); 

개인적으로 증가 할 것 최종 타임 아웃은 5 초에서 높은 값 (10-30 초)까지입니다. 희망이 도움이됩니다.