在分布式环境中部署无状态Java EE 6应用程序以实现高可用性和可伸缩性的最佳方法是什么?我的申请没有状态。因此,我不需要复制任何会话状态(HTTP会话、EJB有状态bean等)
具体来说,我想知道以下情况:
- 我是否需要Glassfish 3.1的集群功能(假设我不需要复制会话状态)?
- 我大量使用JMS队列和消息驱动bean。如何设置JMS以使其在集群环境中工作?
- 我还使用EJB计时器服务。这在集群环境中如何工作呢?除了使用共享DB存储计时器(而不是嵌入式Derby DB)之外,我还需要做什么吗?
我计划使用Amazon AWS (RDS多AZ部署,弹性负载均衡,EC2)。
我处于类似的情况,我目前正在发现GF集群能为我做什么/不能做什么。
Re 1)我是否需要Glassfish 3.1的聚类功能
由于ejb是无状态的,因此不需要GF集群来进行会话/状态复制(如您自己所说)。你可以设置多个独立的实例,并将你的应用单独部署到它们。然而,即使在无状态应用程序中,我也发现GF集群的好处非常值得—从管理的角度来看。
GF集群将确保配置自动应用于所有实例。JNDI是自动复制的。应用程序将自动部署。只需一个命令就可以扩展并添加一个额外的实例——不久之后,您的集群就可以扩展,新的实例也可以配置、部署、启动并准备就绪。对我来说,这是一个管理天堂,并且有足够的理由在我有超过1个实例时使用GF集群!
需要考虑的一件事(我目前正在努力解决这个问题)可能是分布式/协调的L2缓存,以防您的应用程序正在与数据库通信。
Re 2)…如何设置JMS以使其在集群环境中工作?
我不太明白你的问题…如果希望在GF之外拥有一个高可用性的消息代理,则需要对其进行相应的设置并由您自己进行管理。例如,ActiveMQ有几种设置集群/HA/横向扩展的方法。如果使用gf提供的OpenMQ,那么设置gf集群还提供了一个集群消息代理。开箱即用但是代理聚类本身就是一个主题,不可低估。您可能需要考虑持久化和共享消息存储等—无论使用外部代理还是gf提供的集群代理。
如果JMS是应用程序中不可或缺的一部分,我建议对代理给予适当的关注。我可能不会使用gf代理,而是使用单独的代理-集群(关注点分离;例如,你可以独立升级GF/broker)。
Re 3) EJB定时器服务…除了使用共享DB存储计时器外,我还需要做什么?
如果您需要定时器在您的(appserver-)实例组中只自动触发一次,我相信您确实需要GF集群(当然还有共享DB)。否则我不明白,每个实例如何知道它是否应该触发。然而,这很容易测试…
tl;博士
- 使用GF集群来节省管理工作
- 使用外部的、易于理解的高可用性消息代理
- 为EJB计时器使用共享DB
我对你们各自观点的看法
1)会话复制是集群管理的一部分,它不是创建集群服务器环境的目的。从集群中获得的好处是:- 改善可伸缩性 <
- 高可用性/gh>
- 更大的灵活性集群的副作用是增加基础设施的复杂性,增加设计和代码需求等。因此,如果您正在考虑集群,那么您的决定应该由您希望应用程序具有多大的可扩展性,可用性和灵活性等因素驱动。
2)你可以使用Apache ActiveMQ和你的glassfish服务器使你的JMS在集群环境中工作。
3)我认为共享DB就足够了如果您真的希望应用程序顺利运行,您可能需要一个工业级EJB框架....然而,你当然不局限于玻璃鱼。重要的是要记住EJB是一种规范,它不一定局限于任何一种实现!
1)我是否需要Glassfish 3.1的集群功能(假设我不需要复制会话状态)?
不,你绝对不需要。如果你的应用是无状态的,Glassfish就不需要了。
2)我大量使用JMS队列和消息驱动bean。如何设置JMS以使其在集群环境中工作?
JBoss是这里的一个选项。如果一个主节点宕机,JBOSS集群服务只需重新选择新的主节点来管理消息传递,从而保证可用性。
如果您使用weblogic或Jboss ejb实现,则可以透明地对时间进行集群化。在这种情况下,我认为您不需要嵌入式数据库:框架可以直接处理:http://community.jboss.org/wiki/DeployingEJB3TimersInCluster。3)我也使用EJB定时器服务。这在集群环境中如何工作呢?除了使用信用卡,我还需要做什么吗用于存储计时器的共享DB(而不是嵌入式Derby DB)?