繁体   English   中英

在.Net和Java之间共享数据(而不是对象)的最快(以性能为导向)方式

[英]Fastest(performance-wise) way to share data(not objects) between .Net & Java

我知道至少有一个帖子里面有这样的字。 但这与该帖子不完全相同。 我正在尝试在.NET和Java应用程序之间“共享”数据。 我不关心对象,但如果你愿意的话,我只是简单的字符串。

我有一个.NET应用程序捕获实时数据和一个Java应用程序,它具有分析和处理这些数据的能力。 我正在寻找方法来重用这个相同的Java应用程序而无需在.NET中完全编码。

我的问题是数据是“相当”的实时(.NET),因此必须是分析(Java)。 我可以忍受微秒延迟,但我负担不起一秒延迟。 Web服务,队列(如在消息队列中),RDBMS是我能想到的一些选项。 有没有更好的方法?

或者有没有人为我上面提到的解决方案中选择其中一个获得一些真实的性能数字? 并且刚刚开始:RDBMS对于并发(连接正在进行)插入/更新/读取并不“好”,至少在粗略的DBMS方式方面是这样。 (死锁?)

什么是“对象”,如果不是描述“数据”的机制? 但我离题了 - 我怀疑我会看两者之间的TCP套接字。 如果数据非常基础,那么很好 - 只需直接写入流; 如果有任何复杂性,可能使用类似“协议缓冲区”的东西来提供一种简单的方法来读取/写入密集数据到流,而无需自己写每个字节。

我认为微秒延迟对这里的任何方法都是一个挑战......毫秒延迟会有多少?

为了完整性:

另一种可能是使用命名管道 ,它应该非常快,我想(作为一个我只能想象的java人),.NET本身支持它们。 不好的一面是,在Windows上,您必须编写JNI扩展或使用像JNA这样的库在Java的Win32 API中进行搜索。

听起来像本地插座可以做。 延迟应该在低ms或更低。

根据您的程序,您可能会从@Cowan回答“ 任何Java共享内存概念 ”的报告中获得一些建议,他的答案是: Java中共享内存的任何概念

总结:他说你可以在同一台机器上的两个进程之间使用内存映射文件。 理论上这可以在.NET和java之间起作用,假设.NET有一些内存映射文件支持。

不同的机器通过向套接字发送消息来相互通信。 请查看以下链接。

现实世界中的套接字编程

这里提供的答案很棒。 可能感兴趣的一个想法,但可能要求更多麻烦而不是它的价值是在一个进程中加载​​两个VM(JVM和CLR都可以在本机Windows应用程序中加载)并让他们访问本机代码。 Java通过JNI和.Net通过映射函数到它们允许的本机代码。

您还可以利用本机队列信号量在数据更新时唤醒一侧或另一侧的线程。

虽然JNI转换是费用,但它们可能仍然比本机本地套接字实现更快。

您的Java应用程序目前是如何部署的? 听起来我觉得你愿意对它做一些修改,所以我假设你有权访问源代码。

我知道这有点儿,但你可以在J#编译器中编译Java应用程序,以便你的.NET应用程序具有本机访问权限吗?

您可以通过IKVM将已编译的Java应用程序转换为.NET。 之后,您可以更改.NET应用程序的逻辑,这样它就不会将数据传输到Java应用程序,而只是调用用Java编写和编译的用Java编写的数据处理代码。

有许多JMS服务器支持.NET和Java客户端。 这些可以在毫秒内执行消息。

但是,您可能想尝试像Hessian RPC或Protobuf RPC这样的RPC解决方案。 这些可以实现更低的延迟,并且可以在平台之间提供直接调用的外观。 这些也支持.NET和Java。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM