集群JVM

时间:2010-07-02 15:04:44

标签: java jvm cluster-computing

我遇到需要在同步应用程序中引发异步行为的情况。

详细说明,有一个单片c ++应用程序可以同步生成复杂衍生产品的定价。这个c ++应用程序附带了一个java包装器,我的应用程序使用它来与它进行交互。

当前设计

My APP <------> Java Wrapper <---> C++ application

由于从java包装器到c ++的调用是同步的,我想通过拥有这些java包装器的集群来创建异步行为。

我会有一个“Master Wrapper”,它将决定(以循环方式或基于群集中的某些实时信息)哪个包装器获取请求。

未来设计

                                    <---> Java Wrapper <---> C++ application
My APP <------> Java Master Wrapper <---> Java Wrapper <---> C++ application
                                    <---> Java Wrapper <---> C++ application

你们中的任何人都有建造这类东西的经验吗? 任何建议,教程链接,代码等都是最有帮助的。

干杯

仅供参考,我简要地看了一下兵马俑,它看起来像我需要的但是它不是一个选项(不是我公司批准的产品)。

3 个答案:

答案 0 :(得分:1)

如果'Java Master Wrapper'和'My App'在同一个JVM中,您可以让Java Master Wrapper将定价结果存入My APP线程消耗的共享数据结构中。如果我的APP是不同的进程/ JVM,您可以使用JMS来分发结果。 ActiveMQ是一个JMS提供者。

答案 1 :(得分:1)

C ++应用程序是作为JNI库函数集调用还是作为进程?您可以简单地考虑生成C ++的子进程(给它一个main())并在单个JVM中的多个线程中使用它的输出。在协调多个JVM的过程中,C ++程序可能在单独的进程中有更好的机会。

答案 2 :(得分:0)

看起来你不是在寻找群集,而是寻找一个游泳池。

如果包装器在与主线程相同的JVM中可执行,则任务只是重用任何可用的thread pool / worker实现。您甚至可以反编译包装器以查看其main()方法实际调用的类,并尝试在应用程序中重现它。这对于CORBA应用程序是否正常工作。

如果每个包装器必须位于不同的JVM中,最简单的方法是分配线程池(再次),其中每个线程都在监视它自己的Process对象实例,将请求写入stdin,从stdout读取响应。

当然,每个连接的线程不是最有效的设计,所以当你使它工作时,当一个小的线程池(甚至一个线程)监视更大的包装器池时,你实际上可能会移动到一个模型使用选择器处理实例。