High availability and scalable platform for Java/C++ on Solaris我有一个在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。 我要做的第一件事是构造一个系统模型以映射数据流并尝试准确地了解瓶颈所在。如果您可以将系统建模为管道,那么您应该能够使用约束理论(大多数文献都是关于优化业务流程,但它同样适用于软件)来不断提高性能并消除瓶颈。 接下来,我将收集一些准确的经验数据,这些数据可以准确地描述系统的性能。您无法管理无法衡量的事情是一种陈词滥调,但是我看到许多人试图基于预感来优化软件系统,但失败却惨痛。 然后,我将使用帕累托原理(80/20规则)来选择少数会产生最大收益的事物,而只关注那些收益。 为了水平扩展Java应用程序,我广泛使用了Oracle Coherence。尽管有些人认为它是一个非常昂贵的分布式哈希表,但是它的功能却比它丰富得多,例如,您可以直接从C ++代码访问缓存中的数据。 水平扩展Java代码的其他替代方法是Giga Spaces,IBM Object Grid或Gemstone Gemfire。 如果您的C ++代码是无状态的并且仅用于数字运算,则可以考虑使用ICE Grid分发该过程,该ICE Grid具有所使用的所有语言的绑定。 安德鲁(除了建模为管道等),衡量事物很重要。您是否对代码运行了探查器,并获得了大部分时间花在哪里的指标? 对于数据库代码,它多久更改一次?您正在看缓存吗?我假设您已经查看了数据上的索引等以加快Db的速度? 您前端的流量水平是多少?您是否在缓存网页? (使用JMS类型的api在组件之间进行通信并不难。您可以将Web Page组件放在一台(或更多)机器上,然后将集成代码(c ++)放在另一台机器上,对于许多JMS产品通常有本机C ++ api(例如ActiveMQ),但它确实有助于了解Web(JSP?),C ++和数据库操作的时间。 数据库是存储业务数据,还是还用于在Java和C ++之间传递数据?您说您正在使用共享内存而不是JNI? APP中当前存在什么级别的多线程?您将代码描述为本质上是同步的还是异步的? Solaris代码和必须维护的设备之间是否存在物理关系(即,所有设备都向c ++代码注册,还是可以指定)。即。如果您要在前端放置一个Web负载平衡器,并且今天只安装2台机器,那么哪个设备是由预先或预先初始化的盒子来管理的关系? 房委会有什么要求?即。只是状态信息?是否可以通过对会话数据进行群集来仅在Web层中完成HA? 数据库是否在另一台计算机上运行? 数据库有多大?您是否优化了查询,即。尝试使用显式内部/外部联接有时可以帮助解决嵌套子查询(sometmes)的问题。 (再次查看sql统计信息)。 您需要横向扩展。也许像消息队列之类的东西可能是前端和处理之间的后端。 |