ソケットは何をすることをハングアップ?次に何が起こるのだろうか?

男の純粋な心は、人生は、甘さと喜びでいっぱいです。 - トルストイ

ソケットが表示され、サービスの圧力測定に最初のハングアップについて、後で最近のNode.jsサービスの移行K8Sコンテナ荘では、この問題を報告して解決し、発見されたことにより、CPU、メモリ、サイズの容器の検証後原因に制限されており、ここではソケットがハングアップして、解決策はどのようなどのような状況であるの下で何が起こったのかをまとめたものです。

著者について若い王の後に月90、Nodejs開発、共有、してください注意を払うのが好き認定、愛技術のムーのクラスのネットワーク、:Nodejsテクノロジ・スタックとオープンソースプロジェクトのGithub www.nodejs.red

ソケットハングアップとは何ですか

ここでも質問をするインタビューの質問として使用することができ、ソケットは何をハングアップされますか?

英語に翻訳ハングアップハングアップは、ソケット(リンク)がドロップされるようにも理解できるハングアップソケットを意味しています。あなたはこれである理由について考える必要があれば、おそらく多かれ少なかれが満たされる使用する言語、どんなには、単に知らないのか?例えば、Node.jsのシステムでは、サーバのデフォルトのタイムアウトは、要求がこの時間を超えた場合、クライアントが要求を返したい場合には、httpサーバは、この要求のリンクをシャットダウンします、(server.timeoutが見ることができる)2 2分であるのhttp提供ソケットは、「ハングアップ」されている、ソケットのエラーをハングアップ報告されることがわかりました。

質問を理解し、またはあなたが問題を再現する小さなデモから以下、練習したいし、そのアップ何ソケットハングについてもっと学ぶためのNode.js HTTP関連するソースコードと組み合わせていますか?この問題に関する議論があり、あなたは上記のすべてのスタックオーバーフローを見てお勧めもありstackoverflow.com/questions/1が...

再現ソケットハングアップ

サーバー

3秒後、HTTPサービス定義/タイムアウト遅延応答インタフェースの設定を開きます

const http = require('http');
const port = 3020;

const server = http.createServer((request, response) => {
    console.log('request url: ', request.url);

    if (request.url === '/timeout') {
        setTimeout(function() {
            response.end('OK!');
        }, 1000 * 60 * 3)
    }
}).listen(port);

console.log('server listening on port ', port);
复制代码

クライアント

const http = require('http');
const opts = {
  hostname: '127.0.0.1',
  port: 3020,
  path: '/timeout',
  method: 'GET',
};

http.get(opts, (res) => {
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    try {
      console.log(rawData);
    } catch (e) {
      console.error(e.message);
    }
  });
}).on('error', err => {
  console.error(err);
});
复制代码

サーバは次のエラーを報告します殺す直接2 2分程度のクライアントを再起動したりした後、サーバーを起動したら、対応するエラー・スタックを見ることができます

Error: socket hang up
    at connResetException (internal/errors.js:570:14)
    at Socket.socketOnEnd (_http_client.js:440:23)
    at Socket.emit (events.js:215:7)
    at endReadableNT (_stream_readable.js:1183:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'ECONNRESET'
}
复制代码

HTTPクライアントがこのエンドは、ソケットエラーをハングアップ報告されますなぜ、一見のNode.js HTTPクライアントサーバーのソースコードは何の応答を取得していないが原因は、その後、ソケットが終了したこと、(「ソケットハングでL440にconnResetExceptionの引き金になることがわかりますアップ「)エラー。

// https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L440

function socketOnEnd() {
  const socket = this;
  const req = this._httpMessage;
  const parser = this.parser;

  if (!req.res && !req.socket._hadError) {
    // If we don't have a response then we know that the socket
    // ended prematurely and we need to emit an error on the request.
    req.socket._hadError = true;
    req.emit('error', connResetException('socket hang up'));
  }
  if (parser) {
    parser.finish();
    freeParser(parser, req, socket);
  }
  socket.destroy();
}
复制代码

解決ハングアップソケット

1. httpサーバソケットのタイムアウトを設定します。

タイムアウト、ソケットは自動的に破棄される場合、サーバは、2分である場合、次のNode.jsのHTTPサーバのソースコードは、デフォルトのタイムアウトを参照して、着信0の場合、server.setTimeoutを呼び出してタイムアウト多数を調整することができ(ミリ秒)メソッドタイムアウトメカニズムオフ

// https://github.com/nodejs/node/blob/v12.x/lib/_http_server.js#L348
function Server(options, requestListener) {
  // ...

  this.timeout = kDefaultHttpServerTimeout; // 默认为 2 * 60 * 1000
  this.keepAliveTimeout = 5000;
  this.maxHeadersCount = null;
  this.headersTimeout = 40 * 1000; // 40 seconds
}
Object.setPrototypeOf(Server.prototype, net.Server.prototype);
Object.setPrototypeOf(Server, net.Server);


Server.prototype.setTimeout = function setTimeout(msecs, callback) {
  this.timeout = msecs;
  if (callback)
    this.on('timeout', callback);
  return this;
};
复制代码

修正されたコードを以下に示します。

const server = http.createServer((request, response) => {
    console.log('request url: ', request.url);

    if (request.url === '/timeout') {
        setTimeout(function() {
            response.end('OK!');
        }, 1000 * 60 * 3)
    }
}).listen(port);

server.setTimeout(0); // 设置超时时间
复制代码

あなたが設定されていない場合のsetTimeoutも、この誤り確率の多くに対応するサービスは、調査プロセスを起こっている非常に遅く、他の異常の問題である場合は、再試行を開始するために、キュー内のクライアントでhttpこの間違ったエンド・キャプチャのために行うことができます。

ECONNRESET VS ETIMEDOUT

ECONNRESETとETIMEDOUTの違いを教えて、ここで注意してください

ECONNRESETタイムアウト読み出される:サーバーは{「ECONNRESET」「コード」遅い発生正常に応答できなかった場合、 } 、例えばエラーソケットの例は、上述したハングアップ。

リンクのETIMEDOUTタイムアウトタイムアウトを確立し、リンク手段は、一例を要求する要求モジュール以下のクライアントとリモートサーバーで発生します。

const request = require('request');

request({
  url: 'http://127.0.0.1:3020/timeout',
  timeout: 5000,
}, (err, response, body) => {
  console.log(err, body);
});
复制代码

上記の例の後、約5秒の持続時間は{コード:「ETIMEDOUT」}報告されるエラーを以下のように、スタックです。

Error: ETIMEDOUT
    at Timeout._onTimeout (/Users/test/node_modules/request/request.js:677:15)
    at listOnTimeout (internal/timers.js:531:17)
    at processTimers (internal/timers.js:475:7) {
  code: 'ETIMEDOUT'
}
复制代码

おすすめ

転載: juejin.im/post/5de0ddbf51882523467752b8