1

我们有 5 个平衡的 Web 服务器,其中包含各种网站。我想要实现的是确保一次登录。即同一用户帐户在任何给定时间都不能多次登录同一网站。

我正在考虑解决此问题的方法是在服务器之间共享会话,以便我可以控制将哪个会话分配给哪个帐户。然后我可以控制我的登录。如果用户登录并且已经为其用户帐户分配了一个会话,我可以使第一个会话到期或拒绝登录。

我不想失去平衡服务器的好处,因此不能选择使用单个 Sql Server 作为我的会话状态服务器,或者使用单个服务器来处理登录。

分布式会话(类似于Scaleout Software)是实现这一目标的正确方法吗?

还是有另一种机制来处理我完全不知道的单一登录?

4

1 回答 1

1

这里有两组问题:
1)在网络场场景中只允许一个连接的用户
2)检测用户注销

要解决第一个问题,唯一的解决方案是中央存储某种用户状态,使用中央服务器存储ASP.Net 会话或某种其他类型的集中式用户状态。这个中央存储可以是使用会话状态本机管理的 SQL Server(顺便说一句,Oracle 11 中的 Oracle 也可以支持会话存储)、AspState 服务或外部解决方案,如 ScaleOut(如你所说)或其开源替代 memcached (见https://sourceforge.net/projects/memcacheddotnet/)。或者,您可以设计一个简单的集中式 Web 服务,根据 SQL Server 数据库检查活动登录,这样您还可以快速创建有关登录用户等的报告工具。


在我看来,真正的问题在于第二部分,您需要维护网络世界中可用的不同“错误注销”场景(例如由于崩溃而关闭浏览器或在未注销的情况下关闭应用程序),为您的应用程序提供某种方式来优雅地与启用了旧会话的用户一起工作(正如您所说,只需使第一个会话到期即可)。

还要记住,使用像 SQL 服务器这样的状态服务器不会让你失去平衡的服务器,如果是拥有网络农场环境和共享会话的工作方式,唯一的问题在于性能(如果会话状态变大)和如果您还没有适当的许可证,则使用 SQL Server 所涉及的成本。

于 2008-09-30T07:55:00.880 回答