Java独立应用程序的可伸缩性和高可用性

时间:2009-02-18 14:12:50

标签: java spring scalability high-availability

我们目前正在Linux机器上运行Java集成应用程序。首先是应用程序的概述。

Java应用程序是一个独立的应用程序(未部署在任何Java EE应用程序服务器上,如OracleAS,WebLogic,JBOSS等)。 By Stand Alone我的意思是它不是桌面应用程序。但是它是从Main类的命令行运行的。用户根本不直接与此应用程序交互。使用API​​将消息转储到队列中,然后由我的应用程序读取,该应用程序一直24/7运行。我不认为这是一个桌面应用程序,因为用户没有与它直接交互。(不确定这是否是合格的正确推理)。

它使用Spring并连接到WebSphere MQ和Oracle数据库 我们使用Spring Listener(Spring Message Driven POJO)来监听WebSphere MQ上的队列。一旦队列中有消息,应用程序就会从MQ读取消息并将其转储(插入/更新)到数据库中。

现在的问题是:

  1. 我们如何横向扩展此应用程序?我的意思是只是放置更多的盒子并运行同一个应用程序的多个实例,这是一种可行的方法吗?
  2. 我们应该考虑从Spring MDP迁移到EJB MDB吗?从而在Application Server上部署它。这样做会有额外的好处吗?
  3. 有请求使应用程序高可用性(HA)?有哪些建议的方法或策略可用于制作独立的应用程序HA?

6 个答案:

答案 0 :(得分:3)

另一个选项是Terracotta,这个框架可以完全按照您的要求进行操作;同时在多台计算机上运行您的应用程序并平衡它们之间的负载。

答案 1 :(得分:2)

随着对数据的需求增加,任何应用程序的水平扩展最终都会遇到限制。这些限制由负载和服务器/数据库性能决定。在某些时候,如果需求和负载随着扩展而增加,那么服务器/数据库的数量也必须增加。根据所存储的数据,服务器/数据库必须被复制和同步,或者需要采用某种散列算法来跨多个服务器分割数据。随着您增加同步数据源的数量,复制/同步这些服务器的成本也会增加。这就是为什么散列方法可能更有吸引力,以最大限度地降低成本。

真正的高可用性解决方案实施起来非常昂贵。我已经看到了不同程度的HA,但根据定义,它意味着绝对最小或没有停机时间或丢失对数据源的访问权限。要实现这一目标,需要大量冗余硬件,网络和软件,这些硬件,网络和软件能够利用冗余硬件,而不会在其中一个数据源出现故障时失去获取数据的能力。硬件故障是不可避免的,它将发生,以及停电和其他随机性行为。根据HA数据的重要性,HA解决方案还需要多个独立电网上的多个数据中心。这显然是非常昂贵,所以这一切都取决于这些数据对最终用户的重要程度。

因此,HA是一种需要昂贵架构的极端场景。我发现大多数时候人们只对最小化停机时间感兴趣,并且根据数据源的大小,这可以通过添加数据源的热备份来相当低廉地实现。

答案 2 :(得分:2)

  1. 水平扩展消息驱动的应用程序很容易......大部分时间。您当然可以添加在同一队列上运行的另一个消息侦听器。但请注意,因为您可能对消息的排序有微妙的依赖性。它们现在可能不是问题,只有一个处理器,但有多个处理器可以确保消息在某些时候“无序”处理。
  2. EJB MDP不提供除Spring MDB之外的任何内容。坚持正在发挥作用。
  3. 水平扩展处理器是一个开始,但这需要更多的讨论。
  4. 对于HA,您需要澄清要求。对于基于队列的应用,“高可用性”是一个有趣的问题。如果您的应用程序停机几分钟,则消息会堆积在队列中。只要您可以恢复并运行您的应用程序,这些消息仍会得到处理,只是会有更多延迟。可能值得一提的是,“消息的最大可接受延迟是多少?”

    可能存在一些关于硬件故障,数据中心丢失等问题的组件。这些不会通过在同一位置进行水平扩展来解决。您需要在每个层复制所有组件:队列本身,处理器,后端数据库以及连接它们的所有网络硬件。

    这是一个昂贵的主张,因此值得一提的是,“HA情景和非HA情景之间的停机时间年化损失预期增量是多少?” ALE包含直接损失和法规或法律成本,因此它是捕获停机成本的好方法。

答案 3 :(得分:0)

“独立”==“桌面”吗?

用户如何与拥有消息驱动bean的控制器进行交互?

我对你的问题的看法:

  1. 您可以通过向侦听器池添加更多消息侦听器来扩展,因为每个侦听器都在自己的线程中运行。您应该将数据库连接池的大小与消息侦听器匹配,因此也必须增加。在添加更多服务器之前这样做。确保手头有足够的RAM。
  2. 我没有看到EJB MDB通过Spring MDB购买的内容。你一直在提到“app servers”。您是否特别指Java EE应用服务器,如WebLogic,WebSphere,JBOSS,Glassfish?因为如果你在Tomcat上部署Spring,我会认为Tomcat是这个对话中的“app server”。
  3. HA表示负载平衡和故障转移。您需要具有同步或热重新部署的数据库。与队列相同。 F5是负载均衡的绝佳硬件解决方案。如果你有一些人,我会和你的基础设施人员谈谈。

答案 4 :(得分:0)

0.1。在队列上创建更多侦听器可以扩展使用者数量。当消费者死亡时,剩下的消费者可以继续运行。注意:您的MQ和数据库也需要具有高可用性解决方案。

0.2。不确定应用程序服务器在您的情况下会有什么区别。也许您可以解释一下您打算使用哪些功能?

0.3。对于HA,请参阅我的答案。

答案 5 :(得分:0)

你试过制作多个盒子吗? 我想你可能会看到你的MQ的文档? 运行多个框可能需要在MQ中进行一些配置,但它将运行ISA