我曾经参与过在ASP.NET上开发的Web应用程序项目。对于每个登录用户,都有一个对象(我们称之为 UserSessionObject )创建并存储在RAM中。对于给定用户的每个HTTP请求,匹配 UserSessoinObject 实例用于访问用户状态信息和与数据库的连接。所以,这个 UserSessionObject 非常重要。
这种设计带来了后来发现的几个问题:
1)由于 UserSessionObject 缓存在ASP.NET内存空间中,我们必须将负载均衡器配置为 粘性连接 。也就是说,单个会话中的HTTP请求将始终发送到后面的一个Web服务器。这限制了可扩展性和可维护性。
2)在每个HTTP请求中访问此 UserSessionObject 。为了保持一致性, UserSessionObject 有一个独占锁。在任何给定时间只能处理一个HTTP请求,因为它必须首先获得锁定。性能和响应时间受到影响。
现在,我想知道是否有更好的设计来处理这样的登录用户案例。 看来,Sharing-Nothing-Architecture有所帮助。这意味着每次都会从数据库中检索长用户信息。我担心这会损害表现。
长用户网络应用程序是否有任何设计模式? 感谢。
答案 0 :(得分:2)
将会话状态存储在数据库中,并将memcached放在它前面。
答案 1 :(得分:1)
StackOverflow和其他地方讨论的一种方法是签名cookie。一个cookie,其中包含您无法信任的信息,以及以只有您的服务器可以创建它的方式创建的哈希,因此您知道该信息是有效的。这是一种可扩展的方法来保存非高安全性信息,例如用户名。只要签名的cookie符合所有条件(您应该包含日期戳,以防止cookie被盗成为长期问题),您不必访问任何共享资源来确认用户已登录,并且您应该还要跟踪用户未经过身份验证的情况,因此他们无需访问通常的登录过程就无法访问更安全的信息。)