2018年1月14日日曜日

【Node.js】クライアントからの接続が切れたリクエストはどうなるのっと

ブラウザでアクセスしたページの応答が遅かった場合、タブを閉じたりして接続を切るじゃないですか。その後のサーバ側の動作がふと気になったので調べてみました。

いわゆるLAMPスタックのように、1リクエストに1プロセスとか1スレッドを使うアーキテクチャの場合は簡単なんですよ。
プロセスやスレッドをぬっころすだけで全部終わるので。

Node.jsはシングルプロセス・シングルスレッドのイベント駆動だからいろんなリクエストのイベントハンドラやコールバック関数が混在(呼び出し待ち)しているわけで、その場合にうまく該当リクエストの関連イベントだけぬっころしているのかな、と。

準備

まずは簡単なWebサーバをつくってみる。
var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("( ಠ_ಠ)");
}).listen(3000);
そしてこれを5秒後に応答するように改造。
var http = require("http");

http.createServer(function(request, response) {
    console.log("begin");

    // 5秒後に応答 
    setTimeout(function() {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("( ಠ_ಠ)");

        console.log("end");
    }, 5000);
}).listen(3000);
これを実行して、http://127.0.0.1:3000/にアクセス。5秒後にブラウザに顔文字が表示されるのを確認。
そしてコンソール上では、アクセスしたときに"begin"、5秒後に"end"が表示されるのを確認。

手順

はい、ここからが本番です。

http://127.0.0.1:3000/にアクセスして、5秒経過する前に(ブラウザに顔文字が表示される前に)ブラウザを閉じたとき、コンソールの表示はどうなるのでしょうか。

ここから先はキミ自身の目で確かめてくれ! 

まとめ

やっぱりクライアントからのリクエストを切ってもサーバ側の処理までぬっころしてくれるわけではないので、重たい処理はサーバ側で走り続けます。気をつけましょう。

0 件のコメント:

コメントを投稿