Solaris上的Java / C ++高可用性和可扩展平台

时间:2008-09-09 05:52:24

标签: java c++ scalability solaris high-availability

我的应用程序是Solaris上的Java和C ++的混合体。代码的Java方面运行Web UI并在我们正在与之交谈的设备上建立状态,并且C ++代码实时处理从设备返回的数据。共享内存用于将设备状态和上下文信息从Java代码传递到C ++代码。 Java代码使用PostgreSQL数据库来保持其状态。

我们遇到了一些相当严重的性能瓶颈,而现在我们可以扩展的唯一方法就是增加内存和CPU数量。由于共享内存设计,我们被困在一个物理盒上。


这里真正受到了很大的打击是C ++代码。 Web界面相当轻松地用于配置设备;我们真正苦苦挣扎的是处理设备配置后提供的数据量。

我们从设备返回的每一段数据都有一个标识符,指向设备上下文,我们需要查看它。现在有一系列共享内存对象由Java / UI代码维护并由C ++代码引用,这就是瓶颈。由于该架构,我们无法将C ++数据处理移动到另一台机器上。我们需要能够扩展,以便不同的机器可以处理各种设备子集,但是我们失去了进行上下文查找的能力,这就是我要解决的问题:如何卸载真实的时间数据处理到其他框,同时仍然可以参考设备上下文。

我应该注意到我们无法控制设备本身使用的协议,并且情况不可能发生变化。


我们知道我们需要摆脱这种情况,以便能够通过向群集中添加更多计算机来扩展,并且我正处于确定如何执行此操作的早期阶段。

现在我正在将Terracotta视为扩展Java代码的一种方式,但我还没有找到如何扩展C ++来匹配的方法。

除了扩展性能之外,我们还需要考虑高可用性。应用程序需要几乎一直可用 - 不是绝对100%,这不符合成本效益,但我们需要做一个合理的工作来幸免于机器停运。

如果你必须承担我已经获得的任务,你会做什么?

编辑:基于@john channing提供的数据,我正在关注GigaSpaces和Gemstone。 Oracle Coherence和IBM ObjectGrid似乎只是java。

3 个答案:

答案 0 :(得分:5)

我要做的第一件事是构建一个系统模型来映射数据流,并尝试准确理解瓶颈所处的位置。如果您可以将系统建模为pipeline,那么您应该能够使用约束理论(大多数文献都是关于优化业务流程但同样适用于软件)来不断提高性能并消除瓶颈

接下来,我将收集一些能够准确描述系统性能的经验数据。这是一种陈词滥调,你无法管理你无法衡量的东西,但我看到很多人试图基于预感来优化软件系统并且惨遭失败。

然后我会使用Pareto Principle (80/20 rule)来选择能产生最大收益的少量事物,并只关注那些。

为了横向扩展Java应用程序,我广泛使用了Oracle Coherence。虽然有些人认为它是一个非常昂贵的distributed hashtable,但功能比这更丰富,例如,您可以从C++ code直接访问缓存中的数据。

水平扩展Java代码的其他替代方法是Giga SpacesIBM Object GridGemstone Gemfire

如果您的C ++代码是无状态的并且纯粹用于数字运算,那么您可以使用ICE Grid来分发流程,该{{3}}具有您正在使用的所有语言的绑定。

答案 1 :(得分:1)

你需要横向扩展和扩展。也许像message queue之类的东西可能是前端和嘎吱嘎吱之间的后端。

答案 2 :(得分:1)

Andrew,(除了作为管道建模等),测量事物很重要。您是否在代码上运行了一个分析器并获得了大部分时间花在哪里的指标?

对于数据库代码,它的更改频率如何?您是否正在考虑缓存?我假设您已经查看了数据上的索引等以加速Db?

您在前端有多少级别的流量?你在缓存网页吗? (说使用JMS类型的api来组件之间进行通信并不是很难。然后可以将Web页面组件放在一台机器上(或更多),然后将集成代码(c ++)放在另一台机器上,对于许多JMS产品通常都是原生的C ++ api,即ActiveMQ浮现在脑海中,但它确实有助于了解Web(JSP?),C ++,Database ops中有多少时间。

数据库是存储业务数据,还是用于在Java和C ++之间传递数据?你说你使用共享内存而不是JNI? APP目前存在多大程度的多线程?您会将代码描述为同步或异步吗?

Solaris代码与必须维护的设备之间是否存在物理关系(即,所有设备都使用c ++代码注册,或者可以指定)。即。如果您要在前端放置一个Web负载均衡器,并且今天只需要放两台机器就可以通过预先或提前初始化的盒子管理哪些设备?

HA的要求是什么?即。只是国家信息?是否可以通过聚类会话数据在Web层中完成HA?

数据库是否在另一台机器上运行?

数据库有多大?你有没有优化你的查询,即。尝试使用显式内部/外部联接有时有助于嵌套的子查询(sometmes)。 (再看看sql统计数据)。