我想构建一个考虑到可扩展性的应用程序,并使用 postgres RLS 进行用户授权
const sequelize = new Sequelize({
database: 'your_database',
username: 'your_username',
password: 'your_password',
host: 'your_host',
dialect: 'postgres',
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000,
},
});
export default sequelizeClient;
await sequelize.query(`SET ROLE ${userRole}`);
await sequelize.query('SET LOCAL jwt.claims.userId = :userId', {
replacements: { userId },
});
其中 userId 和 userRole 来自中间件中解析的 JWT 6. 然后继续执行该 API 的所有 SQL 查询,该 sql 角色和局部变量将在 RLS 策略中使用来授权或拒绝该操作
此类 API 的示例代码:
async function getUserData(userId, userRole) {
try {
await sequelize.query(`SET ROLE ${userRole}`);
await sequelize.query('SET LOCAL jwt.claims.userId = :userId', {
replacements: { userId },
});
// Perform your Sequelize operations
const userData = await User.findByPk(userId, { raw: true });
return userData;
} catch (err) {
console.log('ERROR: ', err);
}
}
现在我的问题如下:
我知道supabase做了类似的事情,但我想要自己的后端服务器,但如果有一种方法可以利用supabase提供的supervisor来实现类似的功能,也请建议。
此外,如果有更好、更可靠的方法来处理这个问题,请提出建议。谢谢你
根据我对源代码的理解:
当您使用sequelize.query发出请求时:
1 从连接池中获取连接
执行2个查询
3 个连接被释放回池中
如果达到 useCount,则 3 个连接将被破坏 请参阅 options.pool.maxUses
3b 连接可供进一步使用 请参阅 sequelize-pool/blob/master/src/Pool.ts#L455
基于此:
SET LOCAL 变量是否有可能干扰两个不同用户同时进行的 API 调用?
不可以,一旦连接被获取,在释放之前就无法获取。然而,如果您不清理它,进一步的连接使用可能会重复使用您设置的本地。
sequelize 会确保后续查询(设置本地、角色和用户查找查询)将在连接池中的同一个连接中执行吗?
不可以,除非以成本价使用事务,但它会阻止释放您的连接,直到提交为止。这可能会降低应用程序的整体性能,并导致创建更多连接,从而影响数据库性能。
当一个 API 正在处理时,来自不同 API 的两个不同 API 查询最终能否使用相同的连接?
我猜与第一点相同
Sequelize 是否为每个单独的查询请求连接池中的连接?
是的