1

私のアプリケーションでは、すべてのソケットを追跡するオブジェクトを作成しています。

私はそれを次のように宣言します:

var sockets = {};

次に、新しいソケットが作成されたら、ソケットをsocketsオブジェクトに追加します。

sockets[socket.name] = socket;

これは、アプリケーションのロジックに必要です。そして、それは完璧に機能します。

私が抱えている問題はsockets、サーバーが時々再起動するため、(バックアップ目的で) オブジェクトをファイルに保存したいときです。再起動が発生した場合にアクティブなソケットが失われることは望ましくありません。

次のようなファイルに保存しようとしました:

    var outputFilenameee = 'sockets.json';

    fs.writeFile(outputFilenameee, JSON.stringify(sockets), function(err) {
        if(err) {
          console.log(err);
        } else {
          console.log("sockets saved in " + outputFilenameee);
        }           

    });

しかし、私はこのエラーが発生しています:

TypeError: 循環構造を JSON に変換しています

以下は、次の console.log ですsockets

{ '217.208.204.18:63695': 
   { domain: null,
     _events: { data: [Function], end: [Function] },
     _maxListeners: 10,
     _handle: 
      { writeQueueSize: 0,
        owner: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 0,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     errorEmitted: false,
     bytesRead: 125,
     _bytesDispatched: 0,
     allowHalfOpen: false,
     writable: true,
     readable: true,
     server: 
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _connections: 1,
        connections: [Getter/Setter],
        allowHalfOpen: false,
        _handle: [Object],
        _connectionKey: '4:0.0.0.0:8080' },
     _peername: { address: '217.208.204.18', family: 'IPv4', port: 63695 },
     name: '217.208.204.18:63695' } }

これをファイルに保存するにはどうすればよいですか?

4

1 に答える 1

1

再起動が発生した場合にアクティブなソケットが失われたくない

申し訳ありませんが、オペレーティング システムのプロセス モデルを考えると、これは避けられません。ネットワーク ソケット、開いているファイル、メモリなどを含むプロセスのリソースは、プロセスの終了時に OS によって解放され、回収されます。

このようなことを実現するには、別のロード バランサーまたはクラスター マネージャーを使用して、1 つのクラスター ノード/ワーカーの再起動中に raw ソケットを維持する必要があります。node.js クラスター モジュールを調査することをお勧めしますが、ソケットをディスクに書き込もうとした場合、このレベルでの OS の理解にはいくつかのギャップがあり、冒険する前にもう少し勉強する必要があるかもしれません。通常のアプリケーション ロジックの外側。

于 2013-09-02T07:42:52.137 に答える