Tech Sketch Bucket of Technical Chips by TIS Inc.

Node.jsのプロセスダウンを防ぐには

Pocket

この記事はeXcale Developer's Blogから移転されたものです。

eXcale開発チームの泉谷です。

今回はNode.jsでプロセスダウンを起こさない為に重要な例外処理について紹介します。

例外処理の重要性

Node.jsでは例外処理で捉えきれなかった例外が発生した場合、プロセスがダウンし、アプリケーションが終了してしまうことがあります。
これは我々が提供しているeXcale上でNode.jsのアプリケーションを稼働させる場合でも同様です。
そのため以下の様な例外処理を適切に実装する必要があります。

1.try〜catch

他言語の例外処理ではおなじみであるtry〜catch節がNode.jsでも使えるので、
例外がthrowされる可能性がある場所ではtry〜catch節を用います。

例1.try〜catch節

2.コールバック、イベントでエラーを捕捉する

Node.jsではコールバック関数の第一引数にerrを取ることが慣習となっています。
以下の例のようにコールバックでerrを受け取って、エラーが発生した場合に適切な処理をするようにします。

例2.コールバックによるエラー処理

また、Node.jsの非同期関数ではエラー発生時にerrorイベントを発生させるのが通例となっているので、以下の例のようにonメソッドを使ってエラーイベントが発生したときの処理を追加します。

例3.エラーイベントの捕捉

3.uncaughtExceptionをハンドリングする

Node.jsでは捉えきれなかった例外が最終的にuncaughtExceptionとして処理されます。
これをハンドリングすることで予期せぬ例外によってプロセスがダウンすることを防ぎます。

例4..uncaughtExceptionのハンドリング

例えば、Node.jsのwebアプリケーションフレームワークであるExpressでは、このコードをapp.jsに追加します。

※但し、uncaughtExceptionをハンドリングしてもアプリケーションは不安定な状態になるため、プロセスの再起動が推奨されています。

eXcale上でプロセスがダウンしてしまった場合

万一、eXcaleでプロセスがダウンした場合、そのアプリケーションにアクセスすると、図1のような画面が返ってきます。

図1. アプリに繋がらなくなった場合

このような場合、以下の方法で再デプロイをしてください。
1. git pushまたはファイルアップロード
2. バージョン管理画面からデプロイ

図2.バージョン管理画面

最後に

冒頭でも述べましたが、Node.jsアプリケーションでは他言語に比べ、例外処理の重要性が高くなっています。
eXcaleではアプリケーションプロセスのダウンを検知し、再起動するような仕組みは現段階では用意していません。
そのため、適切な例外処理を実装しプロセスダウンを防ぐようにしてください。

エンジニア採用中!私たちと一緒に働いてみませんか?