我在概念上想知道如何使用像Glassfish这样的Java EE容器在EJB级别(而不是Web会话复制)上进行负载均衡。根据我收集的信息,您的远程接口是一个代理,可将您的呼叫委派给您在环境中可能拥有的众多服务器之一。
如果事情失败,他们应该能够在另一台服务器上“完成”吗?我想了解这种负载均衡背后的基本理论,为什么它比在负载均衡器上运行具有会话亲和性的普通Web应用程序的一堆服务器更好?
答案 0 :(得分:7)
我在概念上想知道如何 负载均衡在EJB级别上运行 (不是网络会话复制) 像Glassfish这样的Java EE容器。 从我收集到的你的遥控器 interface是委托的代理 你打电话给许多服务器之一 可能在一个环境中。
你是对的。在Glassfish中,初始查找将尝试联系jndi.properties
文件中列出的服务器之一。然后,服务器知道群集中将用于循环的所有其他节点。远程引用(代理)将透明地为您执行此操作。理论上可以动态地从集群中添加/删除节点。请参阅Glassfish RMI-IIOP load balancing and fail-over。
如果事情失败了他们应该是 能够在另一台服务器上“完成”?一世 想要了解基本理论 在这种负载平衡的背后,为什么呢 比一堆服务器更好 运行一个普通的Web应用程序 负载均衡器上的会话亲和力?
如果bean是无状态的,您甚至不需要任何亲和力,并且可以在任何节点上处理请求。每个远程引用自身充当负载均衡器。
如果豆是有状态的,那就更有毛了。集群将尝试维护bean的2个副本。并且针对这两个副本发送请求。如果其中一个节点崩溃,集群将重新创建另一个副本,直到节点恢复为止 - 它确实类似于具有会话亲和性的HTTP会话复制。
但与Web服务器相反,bean是事务性组件。因此,如果发生异常,则回滚事务并使有状态bean失效,因为其状态可能不再一致。
正如Pascal所指出的那样,某种故障会有某种故障转移。我的节点不可用,请求可以重新路由到另一个节点。但是如果节点在处理时处理了请求失败,我不知道它是否可以在其他地方重新提交。
如果您想了解更多信息,建议您阅读Guide to GlassFish High Availability和Cluster Support in Glassfish。
答案 1 :(得分:6)
如果事情失败,他们应该能够在另一台服务器上“完成”吗?
故障转移(您指的是故障转移,而不是负载平衡)据我所知,不是规范的一部分。但是,大多数供应商都支持故障转移,并且可以对多个EJB容器进行群集以提供此功能。基本上,每个打开的事务的进度都会传输到备份服务器,如果主容器在事务仍处于打开状态时失败,则备份服务器可以接管,在某些情况下,它可能能够继续事务(例如,要声明为requires的WebLogic idempotent方法。通常,备份容器将回滚事务并通知客户端重试其原始请求。
我想了解这种负载均衡背后的基本理论,为什么它比在负载均衡器上运行具有会话亲和性的普通Web应用程序的一堆服务器更好?
这里混合了太多概念以提供答案。故障转移!=负载平衡,会话亲缘关系与故障转移无关(它只是意味着请求将发送到持有会话的服务器)。可以使用HTTP会话状态复制(内存中复制,数据库等)在Web层实现故障转移。你需要澄清这个问题。