在Amazon AWS上使用Glassfish对无状态Java EE应用程序进行集群化



在分布式环境中部署无状态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集群服务只需重新选择新的主节点来管理消息传递,从而保证可用性。

3)我也使用EJB定时器服务。这在集群环境中如何工作呢?除了使用信用卡,我还需要做什么吗用于存储计时器的共享DB(而不是嵌入式Derby DB)?

如果您使用weblogic或Jboss ejb实现,则可以透明地对时间进行集群化。在这种情况下,我认为您不需要嵌入式数据库:框架可以直接处理:http://community.jboss.org/wiki/DeployingEJB3TimersInCluster。

最新更新