9

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

4

3 回答 3

5

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

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

然后我会使用帕累托原则(80/20 规则)来选择能够产生最大收益的少数事情,并只关注那些。

为了横向扩展 Java 应用程序,我广泛使用了Oracle Coherence。虽然有些人认为它是一个非常昂贵的分布式哈希表,但功能比这要丰富得多,例如,您可以直接从C++ 代码访问缓存中的数据。

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

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

于 2008-09-09T09:00:54.337 回答
1

您需要横向和向外扩展。也许像消息队列这样的东西可能是前端和处理之间的后端。

于 2008-09-09T06:05:04.523 回答
1

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

对于数据库代码,它多久更改一次?你现在在看缓存吗?我假设您已经查看了数据上的索引等以加快 Db 速度?

您在前端的流量是多少?你在缓存网页吗?(不难说使用JMS类型的api在组件之间进行通信。然后您可以将Web Page组件放在一台(或多台)机器上,然后将集成代码(c ++)放在另一台机器上,对于许多JMS产品通常有本地 C++ api,即 ActiveMQ 浮现在脑海中),但它确实有助于了解 Web(JSP ?)、C++、数据库操作中有多少时间。

数据库是存储业务数据,还是也用于在 Java 和 C++ 之间传递数据?您说您使用的是共享内存而不是 JNI 吗?APP中目前存在什么级别的多线程?您会将代码描述为本质上是同步的还是异步的?

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

什么是 HA 要求?IE。只是状态信息?HA 可以通过集群会话数据仅在 Web 层完成吗?

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

数据库有多大?您是否优化了查询,即。尝试使用显式内部/外部连接有时有助于与嵌套子查询(sometmes)。(再次查看 sql 统计信息)。

于 2008-09-09T12:29:07.923 回答