Вопрос по node.js – Использование MemoryStore в производстве

107

Сегодня я запустил свое приложение Node.js в & quot; production & quot; режим впервые и получил это предупреждение:

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

Мне нужно только запустить один процесс, но что я должен использовать вместо этого? Я хочу, чтобы мои сеансы находились в оперативной памяти для быстрого доступа. Я также хочу иметь возможность отказаться от всех сессий, просто выключив приложение Node.

Кажется излишним устанавливать Redis, MongoDB или другую базу данных только для этой простой задачи. Я также не понимаю, почему MemoryStore включен в Node, когда его не следует использовать?

Ваш Ответ

7   ответов
11

https://www.npmjs.com/package/session-memory-store

Принятый ответ может быть в порядке. Однако, так как этот вопрос находится высоко в списке результатов поиска, я решил включить его в случае, если он кому-нибудь поможет.

Error: User Rate Limit Exceeded
40

was] в значительной степени хак, а другие просто рекомендуют использовать базу данных, которая, я думаю, является излишней.

У меня была такая же проблема, и я заменил express-sessionпеченье-сессия.

Для этого просто установитеcookie-session:

npm install cookie-session

Тогда в вашемapp.jsнайти гдеexpress-session используется и заменить наcookie-session.

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

Возможно, вам придется изменить некоторые другие вещи, для меня это была простая сделка «обменяться бобсом-твой-дядя-не-навредить».

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcookie-sessionError: User Rate Limit Exceededexpress-sessionError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
5

го вы используетеэкспресс-сессия-Монго модуль.

Есть совет удалить устаревшие сеансы с опцией индексации:

var MongoStore = require('express-session-mongo');
app.use(express.session({ store: new MongoStore() }));

db.sessions.ensureIndex( { "lastAccess": 1 }, { expireAfterSeconds: 3600 } )

Поскольку устаревшие сеансы удаляются самой базой данных, сеанс Express не нуждается в том, чтобы самостоятельно выполнять очистку.

EDITПохоже, вам нужен собственный & quot; lastAccess & quot; поле. Когда вы получаете к нему доступ, вы обновляете это поле самостоятельно. Проверьте документацию MongoDBистекают-данные http://docs.mongodb.org/manual/tutorial/expire-data/

EDIT2:

Теперь становитсяdb.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

Моно-фоновый поток для проверки этого поля запускается каждые 60 секунд. Поэтому сроки удаления документа не точны.

23

потому что, если ваше приложение перезапускается (процесс умирает), вы потеряете все данные сеанса (которые находились в памяти этого процесса).

Если вы не хотите использовать базу данных, используйте вместо этого зашифрованное хранилище cookie.

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

77

после общения с разработчиками Connect я получил больше информации. Здесь есть две причины утечки памяти:

problem with JSON parsing which is already fixed in recent versions the fact that there is no cleanup of expired sessions if the users never access them (i.e. the only cleanup is on-access)

Решение кажется довольно простым, по крайней мере, это то, что я планирую сделать: использовать setInterval для периодической очистки истекших сеансов. MemoryStore предоставляет all () для получения списка, и мы можем использовать get () для принудительного чтения и, таким образом, для их истечения. Псевдо-код:

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

Теперь просто периодически вызывайте sessionCleanup через setInterval (), и у вас есть автоматическая сборка мусора для истекших сеансов. Нет больше утечек памяти.

Error: User Rate Limit Exceededapp.jsError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

у кого проблемы с Redis, попробуйте следующее - надеюсь, это поможет.

Я использую Redis для DEV и PROD и нацеливаюсь на Express v4. В Windows я использую облегченный набор инструментов MSOpenTech Redis v3.0, в противном случае я просто использую дополнение Heroku Redis. Чтобы заставить его работать через Node, не было слишком сложно - пока ...

var session = require('express-session');

. . .

var RedisStore = require('connect-redis')(session);

var redisClient = require('redis').createClient(process.env.REDIS_URL);

var redisOptions = { 
        client: redisClient, 
        no_ready_check: true,
        ttl: 600,
        logErrors: true
};

var redisSessionStore = new RedisStore(redisOptions);

app.use(session({
    store: redisSessionStore,
    secret: 'Some.Long.Series.of.Crazy.Words.and.Jumbled.letter.etc',
    resave: true,       
    saveUninitialized: true 
}));

Удачи!

пс. Я только перечитал исходный запрос и заметил это - извините!

It seems an overkill to install Redis, MongoDB or another database just for this simple task.

6

что консенсус вокруг Интернета заключается в том, что правильным способом было бы действительно использовать для этого БД, но если вы уверены, что не хотите этого делать, тогда подавьте предупреждение - предупреждение не является законом.

Тем не менее, поскольку вы и я оба согласны с тем, что утечка памяти является реальной проблемой, трудно оправдать утверждение, что redis является излишним, поскольку это решит вашу проблему.

I also don't understand why is MemoryStore included in Node when it should not really be used

это хороший момент, но я бы сказал, что узел сам по себе только недавно сталproduction ready, Некоторые люди не согласятся с мнением, что это вообще так.

Error: User Rate Limit Exceeded Milan Babuškov
Error: User Rate Limit Exceeded Milan Babuškov
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы