126 votes

Utilisation de MemoryStore en production

Aujourd'hui, j'ai lancé mon application Node.js en mode "production" pour la première fois et j'ai reçu cet avertissement :

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

Je n'ai besoin d'exécuter qu'un seul processus, mais que dois-je utiliser à la place ? Je veux que mes sessions résident dans la mémoire vive pour un accès rapide. Je veux également pouvoir supprimer toutes les sessions en fermant simplement l'application Node.

Il semble exagéré d'installer Redis, MongoDB ou une autre base de données pour cette simple tâche. Je ne comprends pas non plus pourquoi MemoryStore est inclus dans Node alors qu'il ne devrait pas être utilisé.

82voto

Milan Babuškov Points 20423

Ok, après avoir parlé aux développeurs de Connect, j'ai obtenu plus d'informations. Il y a deux choses considérées comme des fuites de mémoire ici :

  1. problème avec l'analyse JSON qui est déjà corrigé dans les versions récentes
  2. le fait qu'il n'y a pas de nettoyage des sessions expirées si les utilisateurs n'y accèdent jamais (c'est-à-dire que le seul nettoyage se fait lors de l'accès)

La solution semble être assez simple, du moins c'est ce que je prévois de faire : utiliser setInterval pour nettoyer périodiquement les sessions expirées. MemoryStore fournit all() pour obtenir la liste, et nous pouvons utiliser get() pour forcer la lecture et ainsi les faire expirer. Pseudo-code :

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

Il suffit maintenant d'appeler sessionCleanup périodiquement via setInterval() pour obtenir un ramassage automatique des sessions expirées. Plus de fuites de mémoire.

49voto

igneosaur Points 770

La réponse acceptée à cette question est donc [edit : était] plutôt un hack, et les autres recommandent simplement d'utiliser une base de données, ce qui est à mon avis exagéré.

J'ai eu le même problème et j'ai remplacé express-session par cookie-session .

Pour ce faire, il suffit d'installer cookie-session :

npm install cookie-session

Ensuite, dans votre app.js , trouver où express-session est utilisé et le remplacer par cookie-session .

app.use(require('cookie-session')({
    // Cookie config, take a look at the docs...
}));

Il se peut que vous deviez changer d'autres choses, mais pour moi, il s'agissait d'un simple échange d'os à ronger avec votre oncle, ce qui n'a pas fait de mal.

30voto

alessioalex Points 27001

MemoryStore est réservé au mode de développement (rapide), car si votre application redémarre (le processus meurt), vous perdrez toutes les données de session (qui se trouvaient dans la mémoire de ce processus).

Si vous ne souhaitez pas utiliser une base de données, utilisez plutôt un stockage crypté des cookies.

http://www.senchalabs.org/connect/cookieSession.html

12voto

Dovev Hefetz Points 121

Ce module a été conçu pour traiter le problème des fuites de mémoire. https://www.npmjs.com/package/session-memory-store

La réponse acceptée peut être satisfaisante. Toutefois, étant donné que cette question figure en bonne place dans la liste des résultats de recherche, je me suis dit que j'allais l'inclure au cas où elle aiderait quelqu'un d'autre.

8voto

Kristian Points 7423

Je pense que le consensus sur le web est que la bonne solution serait d'utiliser une base de données pour cela, mais si vous êtes sûr de ne pas vouloir le faire, supprimez l'avertissement - l'avertissement n'a pas force de loi.

Cependant, puisque vous et moi sommes d'accord pour dire que la fuite de mémoire est un vrai problème, il est difficile de justifier le fait que redis est exagéré, puisqu'il résoudrait votre problème.

Je ne comprends pas non plus pourquoi MemoryStore est dans alors qu'il ne devrait pas être utilisé

C'est une excellente remarque - mais à cela je répondrai que le nœud lui-même n'est devenu que récemment un élément important de l'économie. prêt pour la production . Certaines personnes ne sont pas du tout d'accord avec l'idée que c'est le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X