我正在开发一个需要与C应用程序通信的Java应用程序.C应用程序使用共享内存和mmap进行通信,我需要Java应用程序才能访问相同的内存.
我的第一次尝试涉及使用JNI调用从共享内存中检索数据,但每次JNI调用的开销都会导致性能下降,因此我想要一种方法来获取Java中的内存并在Java端进行数据检索.
我的想法是我需要做以下事情:
这是最好的方法吗?另外,我不确定如何实际创建FileChannel以指向正确的内存位置.
我正在寻找允许一个进程进入休眠状态并允许其他进程唤醒它的最低延迟 IPC.
我正在寻找最低延迟的方法.到目前为止一些可行的方法
还有其他更好的想法?
任何特定于Linux的解决方案都可以.
我目前正在使用Java和C++应用程序之间的IPC共享内存,但寻找更方便的替代方案.
有人可以建议一个性能和速度相同的更好的方法吗?
谢谢!
我们一直在分析和分析我们的应用程序,以尽可能减少延迟.我们的应用程序由3个独立的Java进程组成,它们都运行在同一台服务器上,它们通过TCP/IP套接字相互传递消息.
我们将第一个组件的处理时间缩短到25μs,但我们发现TCP/IP套接字(在本地主机上)写入下一个组件总是需要大约50μs.我们看到另一个异常行为,因为接受连接的组件可以写得更快(即<50μs).目前,除套接字通信外,所有组件的运行时间均小于100μs.
不是TCP/IP专家,我不知道可以做些什么来加快这个速度.Unix Domain Sockets会更快吗?MemoryMappedFiles?什么其他机制可能是一种更快的方式将数据从一个Java进程传递到另一个Java进程?
更新6/21/2011我们创建了2个基准测试应用程序,一个用Java编写,一个用C++编写,用于更紧密地比较TCP/IP并进行比较.Java应用程序使用NIO(阻塞模式),而C++使用Boost ASIO tcp库.结果或多或少相当,C++应用程序比Java快约4μs(但在其中一项测试中,Java胜过C++).此外,两个版本的每条消息的时间都有很多变化.
我认为我们同意共享内存实现最快的基本结论.(虽然我们也想评估Informatica产品,只要它符合预算.)
一些背景,在得到真正的问题之前:
我正在开发一个由几个不同模块组成的后端应用程序.目前,每个模块都是一个命令行java应用程序,它是"按需"运行的(稍后会详细介绍).
每个模块都是一个"步骤",是一个更大的过程的一部分,您可以将其视为数据流; 第一步从外部源收集数据文件并将其推送/加载到某些SQL数据库表中; 然后根据不同的条件和事件(时间,数据库中存在数据,通过Web服务/ Web界面完成的消息和详细说明),从(1个或多个)DB表中获取数据,处理它们,并将它们写在不同的表格上.步骤在三个不同的服务器上运行,并从三个不同的DB读取数据,但只能在一个DB中写入.目的是汇总数据,计算指标和统计数据.
目前,每个模块都是定期执行的(从第一个模块的几分钟/小时,到链中最后一个模块的几天,需要聚合更多数据,因此等待"更长时间"从它们可用),使用的cronjob.运行一个模块(当前是一个java控制台应用程序),它会检查数据库中给定日期时间窗口中新的未处理信息,并完成其工作.
问题:它有效,但是......我需要扩展和维护它,这种方法开始显示其局限性.
为了解决第二个问题,我将介绍"部分"或"增量"计算:只要我有一组相关信息,我就会处理它.然后,当一些其他链接信息到达时,我计算差异并相应地更新数据,但我还需要通知其他(从属)模块.
 -  1)哪种方法最好? -  2)相关:哪些是"通知"其他模块(在我的情况下是java可执行文件)相关数据可用的最佳方式?
我可以看到三种方式:
编辑:我确信基于队列的方法是要走的路,我为完整性添加了"table + polling"选项,但现在我明白这只是一种分心(显然,每个人都会回答"是的,使用队列,民意调查是邪恶的" - 这是正确的!".因此,让我重新解释一下这个问题: 使用像Redis这样的pub/sub的键值存储使用MQ的优点/缺点是什么?
编辑:特别是,在可能的情况下,它意味着:在某些MQ和/或键值存储中是否有一种机制可以让我发布带有"时间"的消息?比如"在1天内交付"?显然,持久性和"几乎一次"交付保证
编辑:这是我最关心的一点:我想"排队"自己根据队列中的消息激活"模块",类似于MSMQ激活.这是个好主意吗?Java世界中有什么东西可以实现它,我应该自己实现它(通过MQ还是通过Redis),还是应该将每个模块作为守护进程运行?(即使某些计算通常是在突发中发生,两小时处理然后是两天的空转?)
注意:我不能使用重型容器/ EJB(No Glassfish或类似产品)
编辑:骆驼对我来说似乎有点太重了.无论是在资源还是开发的复杂性方面,我都在寻找一些非常轻松的东西
我想问一下是否有人可以建议我在同一台机器上的两个进程之间传输大量数据的最快方法,一个用Java构建,另一个用C++构建
我必须在Internet上构建一个具有客户端 - 服务器架构的业务应用程序,其结构类似于this->
Java客户端应用---(Java套接字)-----> Java Servlet ----> C++业务逻辑.
它需要高度可移植,因为我们事先不能说客户端的目标环境,所以根据我的说法,java将是它的最佳选择.它将通过java套接字与java服务器进行交互.servelet应该与用C++构建的业务逻辑交互.
我将使用java仅用于通信部分,所有其余的业务逻辑将在C++中使用.
我是Java的业余程序员,在C++方面有很好的经验.
任何建议都会受到欢迎..
java ×5
ipc ×4
c++ ×2
linux ×2
dataflow ×1
interprocess ×1
low-latency ×1
memory ×1
redis ×1
tcp ×1