Web applications 管理分布式应用程序中的会话

Web applications 管理分布式应用程序中的会话,web-applications,session,distributed,Web Applications,Session,Distributed,我正在开发分布式web应用程序,我们决定将web模块与业务服务分离,以使其更具可扩展性 情况如下: 我们有一个保存web应用程序(控制器、JSP等)的服务器实例,还有许多带有业务服务的服务器实例。如果web应用程序需要任何数据,它会通过Hessian询问任何现有业务服务器,然后得到响应并显示数据 目前,我们根据登录用户从数据库中检索数据,这是无法更改的,因此每个服务器都应该知道请求哪个用户执行此任务 我的问题是: 您知道跨多个独立应用程序保持用户会话的解决方案吗 例如,其中一个解决方案是在每个请

我正在开发分布式web应用程序,我们决定将web模块与业务服务分离,以使其更具可扩展性

情况如下: 我们有一个保存web应用程序(控制器、JSP等)的服务器实例,还有许多带有业务服务的服务器实例。如果web应用程序需要任何数据,它会通过Hessian询问任何现有业务服务器,然后得到响应并显示数据

目前,我们根据登录用户从数据库中检索数据,这是无法更改的,因此每个服务器都应该知道请求哪个用户执行此任务

我的问题是: 您知道跨多个独立应用程序保持用户会话的解决方案吗

例如,其中一个解决方案是在每个请求中发送用户名,但这对我们来说不是一个好主意


非常感谢

解决此问题有两种方法:

1) 将所有会话信息存储在中央memcached服务器中


2) 使用会话感知负载平衡器,它将相同的用户定向到相同的节点。

使用分布式哈希表从任何服务器存储和检索会话。举个例子。它是开源的,超级简单;请参见下面的示例

Map<String, Session> mapSessions  = Hazelcast.getMap("sessions");
// session is created or updated so put it into the sessions map
mapSessions.put(sessionId, session);
// any server needing to access a session should just retrieve
// it from the map. 
// Map is distributed/shared so any JVM running Hazelcast can
// read the sessions.
Session session = mapSessions.get(sessionId);
Map-mapSessions=Hazelcast.getMap(“会话”);
//会话已创建或更新,因此请将其放入会话映射中
mapSessions.put(sessionId,session);
//任何需要访问会话的服务器都应该检索
//它从地图上消失了。
//Map是分布式/共享的,因此运行Hazelcast的任何JVM都可以
//阅读课时。
Session Session=mapSessions.get(sessionId);

Hazelcast是点对点的。只需包含一个jar并开始共享您的会话。

分布式Memcached服务器将是一个更好的选择,因为它可以优雅地管理存储。另一个替代解决方案是使用Redis,因为它比Memcached快得多,可以存储不同类型的数据,还可以用作数据库

谢谢大家。我找到了最好的解决办法。我们应该简单地添加用户名(或任何东西)作为http请求头,并在另一端检索它。使用Hessian非常简单,您应该只扩展HessianProxy并实现addRequestHeaders(URLConnection)方法。小心3)将所有会话存储在主复制数据库中,该数据库支持每个会话的多个副本。这样,您就可以进行故障切换。另外,请参阅我在这里提供的答案,它可能会给您一些启示:将会话存储在集中式数据库中不是更好吗?而不是存储在内存缓存或文件系统中?@Muhammadhan确信中央数据库会话存储是最简单的体系结构。它也是最慢的。会话数据是在每次页面加载时提取的,因此您会增加相当多的额外延迟和服务器负载……那么建议采用什么方法来提高速度呢。参考PHP(Apache),Node.js。只是快速提示/链接,我会自己做进一步的研究。