Nil*_*ils 69 connect node.js express
我正在使用Node的Express w/Connect中间件.Connect的内存会话存储不适合生产:
Run Code Online (Sandbox Code Playgroud)Warning: connection.session() MemoryStore is not designed for a production environment, as it will leak memory, and obviously only work within a single process.
对于更大的部署,mongo或redis是有意义的.
但对于生产中的单主机应用程序,什么是一个很好的解决方案?
bal*_*ton 84
花了一天时间调查这个.以下是我发现的选项.请求/秒通过ab -n 100000 -c 1 http://127.0.0.1:9778/
我的本地计算机执行.
maxAge
)ttl
)clear_interval
设置为清理会话这是我用于cookieSession的coffeescript:
server.use express.cookieSession({
secret: appConfig.site.salt
cookie: maxAge: 1000*60*60
})
Run Code Online (Sandbox Code Playgroud)
这是我用于redis的coffeescript:
RedisSessionStore ?= require('connect-redis')(express)
redisSessionStore ?= new RedisSessionStore(
host: appConfig.databaseRedis.host
port: appConfig.databaseRedis.port
db: appConfig.databaseRedis.username
pass: appConfig.databaseRedis.password
no_ready_check: true
ttl: 60*60 # hour
)
server.use express.session({
secret: appConfig.site.salt
cookie: maxAge: 1000*60*60
store: redisSessionStore
})
Run Code Online (Sandbox Code Playgroud)
这是我对mongo的coffeescript:
server.use express.session({
secret: appConfig.site.salt
cookie:
maxAge: 100*60*60
store: new MongoSessionStore({
db: appConfig.database.name
host: appConfig.database.host
port: appConfig.database.port
username: appConfig.database.username
password: appConfig.database.password
auto_reconnect: appConfig.database.serverOptions.auto_reconnect
clear_interval: 60*60 # hour
})
})
Run Code Online (Sandbox Code Playgroud)
当然,远程redis和mongo数据库将比它们的本地数据库慢.我只是无法让当地的等价物工作,特别是考虑到我的安装和维护时间远远超过我与托管远程替代品相比我愿意投资的东西,我觉得其他人也是如此,因此为什么这些托管远程数据库服务首先存在!
对于本地数据库benhmarks,请参阅@ Mustafa的答案.
很高兴有人编辑这个答案,将他们的本地数据库基准添加到组合中.
Mus*_*afa 70
由于接受的答案仅连接到远程主机,因此很明显它总是比localhost慢.即使它是您家中的下一台计算机,从该计算机读取也需要几毫秒,但本地内存只需几纳秒.您应该使用本地安装的服务器来比较它们.
以下是我本地电脑的结果:你看,在高负荷下,redis几乎和内存一样快.您可以克隆这些测试代码可用的仓库:https://github.com/mustafaakin/express-session-store-benchmark
Concurrency: 1
none 4484.86 [#/sec]
memory 2144.15 [#/sec]
redis 1891.96 [#/sec]
mongo 710.85 [#/sec]
Concurrency: 10
none 5737.21 [#/sec]
memory 3336.45 [#/sec]
redis 3164.84 [#/sec]
mongo 1783.65 [#/sec]
Concurrency: 100
none 5500.41 [#/sec]
memory 3274.33 [#/sec]
redis 3269.49 [#/sec]
mongo 2416.72 [#/sec]
Concurrency: 500
none 5008.14 [#/sec]
memory 3137.93 [#/sec]
redis 3122.37 [#/sec]
mongo 2258.21 [#/sec]
Run Code Online (Sandbox Code Playgroud)
会话使用的页面是非常简单的页面;
app.get("/", function(req,res){
if ( req.session && req.session.no){
req.session.no = req.session.no + 1;
} else {
req.session.no = 1;
}
res.send("No: " + req.session.no);
});
Run Code Online (Sandbox Code Playgroud)
Redis商店配置:
app.use(express.session({
store: new RedisStore({
host: 'localhost',
port: 6379,
db: 2,
}),
secret: 'hello'
}));
Run Code Online (Sandbox Code Playgroud)
Mongo商店配置:
app.use(express.cookieParser());
app.use(express.session({
store: new MongoStore({
url: 'mongodb://localhost/test-session'
}),
secret: 'hello'
}));
Run Code Online (Sandbox Code Playgroud)
另一个好的选择是memcached.如果memcached重新启动,会话状态将丢失,但实际上从来没有任何理由这样做.即使重新启动应用服务器,也可以使缓存始终保持运行.对会话数据的访问几乎是即时的,并且memcached将以您提供的任何(适当的)内存量愉快地运行.我从来没有见过memcached崩溃(在Linux上).
https://github.com/elbart/node-memcache
关于memcached的一般注意事项:
这些都不应该是会话存储的问题; 只是使用广义缓存.
我使用connect-mongo使用MongoDB会话存储.
使用安装npm install connect-mongo
并替换现有的MemoryStore
app.use(express.session({ store: new MongoStore({ db: 'some-database' }) }));
它自动管理会话的数据库端.
即使是本地开发,我仍然会使用Redis.这很有用,因为它甚至在您重新启动Node应用程序时也存储了会话,保持您的浏览器会话登录.默认情况下Redis将会话保存在内存中,与connect的内存存储器配置相同(我只是在屏幕上运行它)如果您只在配置中使用不同的数据库或会话值,我的节点应用程序可以支持多个应用程序.
归档时间: |
|
查看次数: |
43488 次 |
最近记录: |