![IDEAS 请求:实现会话限制的最佳方法](https://linux22.com/image/753506/IDEAS%20%E8%AF%B7%E6%B1%82%EF%BC%9A%E5%AE%9E%E7%8E%B0%E4%BC%9A%E8%AF%9D%E9%99%90%E5%88%B6%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95.png)
我正在为一个提供移动订阅服务的应用程序起草一份草案,要求一个帐户只能在一台设备上使用,如果该帐户登录到另一台设备,则第一个设备将被注销。开发人员给出了一些定期轮询的想法,但我需要一种聪明的方法来减少带宽,而不是定期轮询已登录用户的数据库。
问题是为了保持心跳通信,并在其他人登录时警告用户,并节省带宽,因为将有超过 10000 个设备定期查询。
我目前还不担心语言或代码,我正在寻找最佳方法/逻辑。提前感谢您的建议,K
答案1
这是一种方法。
在身份验证时,移动设备会收到一个随机安全令牌,该令牌不仅存储在数据库中的用户身上,而且还存储在内存缓存中(由所有服务器共享),将用户 ID 映射到令牌。
每次移动用户通信时,都会包含用户 ID 和安全令牌,并与缓存进行核对:如果令牌与缓存中的令牌不匹配,则检查数据库。如果令牌与数据库中的令牌不匹配,则拒绝通信,并显示一条消息,表明用户未在此设备上登录或在其他地方登录,并提供重新认证的选项。
如果用户明确注销,则可以将安全令牌设置为数据库中的特殊值,表示用户未登录,并从缓存中删除该条目。
内存缓存的大小约为 (登录用户数) * (用户 ID + 安全令牌长度 + 开销) * 2。对于 10,000 个用户,用于用户 ID 和安全令牌的 GUID 约为 10,000 * (16 + 16 + 8) * 2 = 800 kBytes。因此缓存大小不是问题。使用哈希链来允许删除哈希条目,或者查看那里的许多开源键值存储。
如果包含用户和会话令牌的“会话”表足够小,数据库可能会很好地缓存表本身,在这种情况下可能不需要会话缓存和额外的逻辑。
如果您对移动设备和服务器之间的通信频率有估计,请考虑运行实验来查看是否需要缓存。