一尘不染

对于单主机Node.js生产应用程序,好的会话存储是什么?

node.js

我正在使用带有连接中间件的Node’s Express。Connect的内存会话存储不适合生产:

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是有意义的。

但是,生产中的单主机应用程序有什么好的解决方案?


阅读 300

收藏
2020-07-07

共1个答案

一尘不染

花了一天的时间对此进行调查。这是我发现的选项。每秒请求数是ab -n 100000 -c 1 http://127.0.0.1:9778/在我的本地计算机上执行的。

  • 无会话-快速(438 req / sec)
  • cookieSession:不需要外部服务,对速度的影响不大(311 req / sec)-最快,会话将随着cookie过期(由定制maxAge
  • connect-redis:需要redis服务器,对速度有较大影响(redis2go和redisgreen为4 req / sec)-比mongo快,会话将在一段时间后删除(由定制ttl
  • connect-mongo-需要mongodb服务器,对速度有较大影响(mongohq的速度为2 req / sec)-比redis慢,需要手动clear_interval设置清理会话

这是我用于cookieSession的coffeescript:

server.use express.cookieSession({
    secret: appConfig.site.salt
    cookie: maxAge: 1000*60*60
})

这是我用于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
})

这是我给蒙哥写的咖啡稿:

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
    })
})

当然,现在,远程redis和mongo数据库将比其本地等效数据库慢。
我只是无法让当地的同类设备正常工作,特别是考虑到与托管远程替代产品相比,我的安装和维护时间远远超过了我愿意投资的时间,我对其他人也是如此,因此为什么这些托管远程替代产品也是如此数据库服务首先存在!

2020-07-07