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

标签 java c++ scalability solaris high-availability

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

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


这里真正大的打击是 C++ 代码。 Web 界面很少用于配置设备;我们真正困难的地方在于处理设备在配置后传输的数据量。

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

我应该指出,我们无法控制设备本身使用的协议(protocol),而且情况不可能改变。


我们知道我们需要摆脱这一点,以便能够通过向集群中添加更多机器来进行横向扩展,而且我正处于研究我们将如何做到这一点的早期阶段。

现在我正在将 Terracotta 视为一种扩展 Java 代码的方法,但我还没有弄清楚如何扩展 C++ 以匹配。

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

如果你必须承担我交给的任务,你会怎么做?

编辑:根据@john channing 提供的数据,我正在查看 GigaSpaces 和 Gemstone。 Oracle Coherence 和 IBM ObjectGrid 似乎仅支持 java。

最佳答案

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

接下来,我将收集一些准确描述系统性能特征的硬性经验数据。无法衡量就无法管理是陈词滥调,但我看到很多人试图根据直觉来优化软件系统,但都惨遭失败。

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

为了水平扩展 Java 应用程序,我使用了 Oracle Coherence广泛地。尽管有些人认为它非常昂贵 distributed hashtable ,功能比这丰富得多,例如,您可以直接从 C++ code 访问缓存中的数据。 .

水平缩放 Java 代码的其他替代方法是 Giga Spaces , IBM Object GridGemstone Gemfire .

如果您的 C++ 代码是无状态的并且纯粹用于数字运算,您可以考虑使用 ICE Grid 来分配进程它具有您正在使用的所有语言的绑定(bind)。

关于java - Solaris 上 Java/C++ 的高可用性和可扩展平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266/

相关文章:

java - 如何给com.myproject.api下的所有 Controller 添加 "api"前缀?

c++ - 如何使用 binder 和 bind2nd 仿函数?

c++ - 在 Linux 上执行二进制文件时找不到与 CMake 链接的 OGRE 3D 共享库

c# - 在 WPF 应用程序 C# 中设置所有矩形的背景

内存中的 MongoDB 索引与分片

javascript - 表单数据未填充

java - BuildNumber 不是由 buildnumber-maven-plugin 生成的

java - 核心java基础知识

c++ - 从模板参数的子类推断函数模板参数

concurrency - 管理数据存储并发作为微服务规模