我有一个在 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。