如何获取当前系统中的在线用户数 (并发用户数)
更多描述 一些 SaaS 系统基于 Pricing 的考虑,会限制团队人数及同时在线数,如何实现
Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 368
Author 回答者: shfshanyue
一些 SaaS 系统基于定价策略的考虑,会限制团队人数及同时在线数,如何实现?
通过 redis
的 zset
可实现并发用户数。
当一个用户请求任何接口时,实现一个 middleware,处理以下逻辑
// 当一个用户访问任何接口时,对该用户Id,写入 zset
await redis.zadd(
`Organization:${organizationId}:concurrent`,
Date.now(),
`User:${userId}`,
);
// 查询当前机构的并发数
// 通过查询一分钟内的活跃用户来确认并发数,如果超过则抛出特定异常
const activeUsers = await redis.zrangebyscore(
`Organization:${organizationId}:concurrent`,
Date.now() - 1000 * 60,
Date.now(),
);
// 查出并发数
const count = activeUsers.length;
// 删掉过期的用户
await redis.zrembyscore(
`Organization:${organizationId}:concurrent`,
Date.now() - 1000 * 60,
Date.now(),
);
总结
- 每当用户访问服务时,把该用户的 ID 写入优先级队列,权重为当前时间
- 根据权重(即时间)计算一分钟内该机构的用户数
- 删掉一分钟以上过期的用户