What is a good session store for a single-host Node.js production app?

后端 未结 8 1484
太阳男子
太阳男子 2020-11-29 15:38

I\'m using Node\'s Express w/ Connect middleware. Connect\'s memory session store isn\'t fit for production:

Warning: connection.session() Memo         


        
8条回答
  •  醉话见心
    2020-11-29 16:02

    Spent the day looking into this. Here are the options I've discovered. Requests/second are performed via ab -n 100000 -c 1 http://127.0.0.1:9778/ on my local machine.

    • no sessions - fast (438 req/sec)
    • cookieSession: requires no external service, minor speed impact (311 req/sec) - fastest, sessions will expire with the cookie (customised by maxAge)
    • connect-redis: requires redis server, large speed impact (4 req/sec with redis2go and redisgreen) - faster than mongo, sessions will be deleted after a while (customised by ttl)
    • connect-mongo - requires mongodb server, large speed impact (2 req/sec with mongohq) - slower than redis, requires manual clear_interval to be set to cleanup sessions

    Here is the coffeescript I used for cookieSession:

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

    Here is the coffeescript I use for redis:

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

    Here is my coffeescript for mongo:

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

    Now of course, the remote redis and mongo databases will be slower than their local equivalents. I just couldn't get the local equivalents working, especially considering the installation and maintenance time for me was far more than what I was willing to invest when compared with hosted remote alternatives, something I feel is true for others too hence why these hosted remote database services exist in the first place!

    For local database benhmarks, see @Mustafa's answer.

    Happy for someone to edit this answer to add their local database benchmarks to the mix.

提交回复
热议问题