在分布式应用程序中管理会话

8

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

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

目前,我们根据已登录的用户从数据库检索数据,并且这不能更改,因此每个服务器都应该知道哪个用户要求执行工作。

我的问题是: 您知道如何在几个独立的应用程序之间保持用户会话的解决方案吗?

例如,其中一种解决方案可以是在每个请求中发送用户名,但对我们来说这不是一个很好的想法。

非常感谢


谢谢大家。我已经找到了最好的解决方案。我们只需要将用户名(或其他内容)作为HTTP请求头添加,并在另一端进行检索即可。使用Hessian非常简单,你只需要扩展HessianProxy并实现addRequestHeaders(URLConnection)方法。注意处理好这个问题。 - oyushche
3个回答

9

这个问题有两种解决方法:

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

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


1
  1. 将所有会话存储在支持每个会话多个副本的主-主复制数据库中。这样,您就会有故障转移。此外,请参阅我此处的先前答案,这可能会给您一些启示:https://dev59.com/CXVC5IYBdhLWcg3wjx5d#8443896
- Ztyx
把会话存储在集中式数据库中不是更好吗?而不是存储在内存缓存或文件系统中? - Nah
@MuhammadHannan 当然,中央数据库会话存储是最简单的架构。但它也是最慢的。会话数据在每个页面加载时都需要获取,因此会增加相当多的额外延迟和服务器负载... - BarsMonster
那么,有关于PHP(Apache)、Node.js加速的推荐方法是什么?只需要给一些快速提示/链接,我会自己进一步研究。 - Nah

4

使用分布式哈希表从任何服务器存储和检索会话。尝试例如Hazelcast的分布式哈希表。该开源工具非常简单易用,可以查看下面的示例。

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);
Hazelcast是点对点的。只需要包含单个JAR文件即可开始共享会话。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接