【问题标题】:Creating and maintaining a Redis session store replica in a nodejs expressjs app在 nodejs expressjs 应用程序中创建和维护 Redis 会话存储副本
【发布时间】:2021-11-08 07:17:16
【问题描述】:

差不多,我想知道如何在具有微服务架构的 Nodejs 应用程序中创建和维护 Redis 会话存储的副本。

短背景(有点)

我正在规划一个我将要开始工作的项目的架构,并决定使用 Redis 存储来存储用户会话。我正在尝试一个微服务架构,本质上,会有一个身份验证服务根据需要写入和读取会话存储。实例化商店通常是什么样的:

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

const redis = require('redis');
const redisStore = require('connect-redis')(session);
const redisClient = redis.createClient();

const { SESSION_OPTIONS } = require('./configs/session');

const app = express();


app.use(session({
    ...SESSION_OPTIONS,
    store: new redisStore({ host: 'localhost', port: 6379, client: redisClient })
}))

但是,在我的整个应用程序中,几乎所有用户操作都必须经过授权,这包括检查存储在会话中的用户凭据。通常,在我的单体项目中,它看起来像:

router.get('/someUserAction', ensureAuthorisation, (req, res) => {
    ...
})

ensureAuthorisation 是这样的函数:

ensureAuthorisation: (req, res, next) => {
    if(req.user.isAuthorised) {
            return next();
    }
    return res.status(401).json({success: false, msg: 'fail msg'});
}

因为几乎每个用户操作都需要授权,因此读取到 Redis 会话存储,我假设这对身份验证服务不利,因为它使用相同的存储但写入和读取频率较低。因此,我想创建一个单独的服务,authorisation 服务,它使用自己的 Redis 存储。授权服务的这个存储应该是身份验证服务存储的副本,相应地删除和更新会话。

我最初的想法是在两个存储之间进行某种形式的异步通信,身份验证存储向授权写入新会话...问题是,这是否可能,或者副本存储更多的是缓存吗?

这有点长,而且可能令人困惑,所以如果您需要进一步解释,请提出任何问题(请善待我,请大声笑)。任何帮助表示赞赏????

【问题讨论】:

    标签: node.js session redis microservices node-redis


    【解决方案1】:

    您可以继续使用单个 Redis,而不是为其他服务创建缓存。

    在哨兵模式下使用redis,授权服务写入主服务器并从副本中读取其他内容。

    【讨论】:

    • 如何使用 connect-redis 和 node redis 来实现。我阅读了您对哨兵模式的建议,这似乎是理想的解决方案,但似乎没有办法用我目前使用的方法来实现它。还有其他想法吗?谢谢。
    • npmjs.com/package/ioredis你可以试试这个,看起来很流行,支持哨兵模式
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2014-12-13
    • 2012-03-12
    • 1970-01-01
    • 2014-08-02
    • 2014-10-13
    • 2016-04-19
    • 2012-04-06
    相关资源
    最近更新 更多