JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsでエージェント(Agent)を作成する方法を徹底解説

Node.jsでは、new Agent() メソッドを使ってエージェント(Agent)のインスタンスを作成できます。http.request() メソッドは、'http' モジュールが提供する globalAgent を利用するほか、独自の http.Agent インスタンスを作成して指定することも可能です。

HTTP通信を効率化したい場合や、接続の再利用(Keep-Alive)によるパフォーマンス向上を実現したい場合には、カスタムエージェントの活用が非常に有効です。本記事では、基本的な使い方から実践的な例まで詳しく解説します。

構文

new Agent({options})

パラメータ

上記の関数は、以下のパラメータを受け取ることができます。

  • options ― エージェント作成時に設定できる構成オプションです。指定できる主なフィールドは次のとおりです。

    • keepAlive ― 処理中のリクエストがない場合でもソケットを保持し、TCP接続を再確立することなく将来のリクエストに再利用できるようにするオプションです。接続を閉じる場合は「close」イベントを利用します。デフォルト値:false

    • keepAliveMsecskeepAlivetrue に設定した際に、TCP Keep-Aliveパケット送信までの初期遅延時間を定義します。デフォルト値:1000

    • maxSockets ― ホストごとに許容されるソケットの最大数を定義します。デフォルト値:Infinity(無制限)

    • maxTotalSockets ― すべてのホスト合計で許容されるソケットの総数を定義します。上限に達するまで、各リクエストは新しいソケットを使用します。デフォルト値:Infinity(無制限)

    • maxFreeSockets ― 空き(フリー)状態で開いたままにしておけるソケットの最大数を定義します。デフォルト値:256

    • scheduling ― 次に使用する空きソケットを選択する際のスケジューリング方式を指定します。「fifo」(先入れ先出し)または「lifo」(後入れ先出し)のいずれかを選択できます。

    • timeout ― ソケットのタイムアウト時間をミリ秒単位で表します。

基本の使用例

まずは標準の http.Agent を使った基本的なエージェント作成の例を見てみましょう。「agent.js」という名前のファイルを作成し、以下のコードスニペットをコピーしてください。その後、次のコマンドでコードを実行できます。

node agent.js

agent.js

// 新しいAgentの作成を示すNode.jsプログラム

// httpモジュールのインポート
const http = require('http');

// 新しいエージェントを作成
var agent = new http.Agent({});

// エージェント用のオプションを定義
const aliveAgent = new http.Agent({
    keepAlive: true, maxSockets: 5,
});

// aliveAgentとの接続を作成
var aliveConnection = aliveAgent.createConnection;

// 新しい接続を作成
var connection = agent.createConnection;

// 接続情報を出力
console.log('Succesfully created connection with agent: ',
connection.toString);
console.log('Succesfully created connection with alive agent: ',
aliveConnection.toString);

出力結果

C:\home\node>> node agent.js
Succesfully created connection with agent: function toString() { [native code] }
Succesfully created connection with alive agent: function toString() { [native code] }

agentkeepaliveモジュールを使った応用例

「agentkeepalive」モジュールを使用すると、ソケットやエージェントを作成する際により柔軟な制御が可能になります。このモジュールは、標準の http.Agent を拡張したもので、フリーソケットの自動タイムアウトなど、より細かなチューニング機能を提供します。以下の例でその使い方を確認してみましょう。

インストール

npm install agentkeepalive --save

プログラムコード

// agentkeepaliveモジュールの利用を示すNode.jsプログラム

// httpモジュールのインポート
const http = require('http');
// agentkeepaliveモジュールのインポート
const Agent = require('agentkeepalive');

// 新しいKeep-Aliveエージェントを作成
const keepAliveAgent = new Agent({});

// リクエストオプションを設定
const options = {
    host: 'tutorialspoint.com',
    port: 80,
    path: '/',
    method: 'GET',
    agent: keepAliveAgent,
};

// HTTPサーバーへリクエストを送信
const req = http.request(options, (res) => {
    // レスポンスから受け取ったステータスコードやヘッダー情報を出力
    console.log("StatusCode: ", res.statusCode);
    console.log("Headers: ", res.headers);
});

// エージェントのオプションを出力
console.log("Agent Options: ", req.agent.options);
req.end();

出力結果

C:\home\node>> node agent.js
Agent Options: { socketActiveTTL: 0,
    timeout: 30000,
    freeSocketTimeout: 15000,
    keepAlive: true,
    path: null }
StatusCode: 403
Headers: { date: 'Sun, 25 Apr 2021 08:21:14 GMT',
    server: 'Apache',
    'x-frame-options': 'SAMEORIGIN',
    'last-modified': 'Thu, 16 Oct 2014 13:20:58 GMT',
    etag: '"1321-5058a1e728280"',
    'accept-ranges': 'bytes',
    'content-length': '4897',
    'x-xss-protection': '1; mode=block',
    vary: 'User-Agent',
    'keep-alive': 'timeout=5, max=100',
    connection: 'Keep-Alive',
    'content-type': 'text/html; charset=UTF-8' }

このように、agentkeepalive モジュールを使うことで、freeSocketTimeoutsocketActiveTTL といった追加オプションが利用可能になり、接続管理をより精密に制御できます。高負荷なアプリケーションでは、Keep-Aliveを適切に活用することでTCP接続の確立コストを削減し、全体的なレスポンス性能を向上させることが期待できます。

  1. JavaScriptで実装するプリム法:最小全域木を求めるアルゴリズムの基本と実装例

    プリム法(Prims Algorithm)とはプリム法は、重み付き無向グラフから最小全域木(MST: Minimum Spanning Tree)を求めるための貪欲法(グリーディアルゴリズム)です。グラフ内のすべての頂点を含み、かつ辺の重みの合計が最小になるような辺の部分集合(木)を見つけ出します。アルゴリズムは、任意の開始頂点から木の構築を始め、1ステップごとに「木に属する頂点」と「木に属さない頂点」をつなぐ辺の中から、最もコスト(重み)の小さいものを1本追加していくことで動作します。プリム法の動作の流れ以下の図を使って、プリム法がどのように動作するのかを順番に見ていきましょう。ステップ1:

  2. Node.jsアプリにexpress-rate-limitを導入してレート制限(Rate Limiting)を実装する方法

    近年、WebサイトをDoS攻撃やDDoS攻撃から守るために、レート制限(Rate Limiting)の重要性がますます高まっています。レート制限とは、特定のIPアドレスからのリクエスト回数に上限を設けることで、不正なリクエストやブルートフォース攻撃などの悪意あるアクセスからシステムを保護する仕組みです。Node.jsのWebフレームワーク「Express」では、npmパッケージのexpress-rate-limitを使うことで、ユーザーごとのリクエスト数を簡単に制限できます。本記事では、その導入手順と基本的な使い方を解説します。express-rate-limitモジュールのインストールまず、