本番環境で MemoryStore を使用する 質問する

本番環境で MemoryStore を使用する 質問する

今日、Node.js アプリケーションを初めて「プロダクション」モードで実行したところ、次の警告が表示されました。

Warning: connection.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and obviously only work within a single process.

実行する必要があるのは 1 つのプロセスだけですが、代わりに何を使用すればよいでしょうか。高速アクセスのためにセッションを RAM に常駐させたいです。また、Node アプリをシャットダウンするだけですべてのセッションを破棄できるようにしたいです。

この単純なタスクのためだけに、Redis、MongoDB、または別のデータベースをインストールするのはやりすぎのようです。また、実際には使用すべきではない MemoryStore が Node に含まれている理由もわかりません。

ベストアンサー1

さて、Connect の開発者と話し合った結果、さらに情報が得られました。ここでは、メモリ リークと考えられるものが 2 つあります。

  1. JSON 解析の問題は、最近のバージョンではすでに修正されています。
  2. ユーザーがアクセスしなかった場合、期限切れのセッションはクリーンアップされない(つまり、クリーンアップはアクセス時のみ)という事実

解決策はかなり単純なようです。少なくとも、これが私がやろうとしていることです。setInterval を使用して、期限切れのセッションを定期的にクリーンアップします。MemoryStore はリストを取得するための all() を提供し、get() を使用して強制的に読み取り、期限切れにすることができます。疑似コード:

function sessionCleanup() {
    sessionStore.all(function(err, sessions) {
        for (var i = 0; i < sessions.length; i++) {
            sessionStore.get(sessions[i], function() {} );
        }
    });
}

これで、setInterval() を介して sessionCleanup を定期的に呼び出すだけで、期限切れのセッションのガベージ コレクションが自動的に実行されます。メモリ リークは発生しなくなります。

おすすめ記事