2017-09-18 5 views
0

を使用しているとき、私はAMはDocker Swarmで実行しているNodejs Koaで書かれた複数のマイクロサービスを持っています。nodejsをシャットダウンmicroservice優雅ドッカースウォーム

KubernetesやSwarmのようなコンテナオーケストレーションツールは即座にサービスの規模を拡大/縮小できるため、未完成の実行プロセスを防ぐためにNodejsサービスを正常にシャットダウンすることに問題があります。以下は

は、私は考えることができる流れである:各ワーカー・プロセスにSIGNINT信号を送信

  1. サービスを縮小する際ドッキングウィンドウの群れ は、作業者にSIGNINTを送っていますか?
  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秒)になります。希望が役立ちます。

関連する問題