【发布时间】: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