如何让 2 个 JVM 相互通信

2022-08-31 12:53:32

我有以下情况:

我有2个JVM进程(实际上是2个单独运行的进程,而不是2个线程)在本地机器上运行。让我们称它们为 .javaProcessAProcessB

我希望他们彼此通信(交换数据)(例如 发送消息以执行某些操作)。ProcessAProcessB

现在,我通过编写一个临时文件来解决此问题,这些进程会定期扫描此文件以获取消息。我认为这个解决方案不是那么好。

有什么更好的选择来实现我想要的?


答案 1

IPC 的多种选择:

基于套接字的(基本)网络

  • 不一定很难,但是:
    • 可能很长,不多,
    • 可能会为 Bug 提供更多的表面,因为您编写了更多的代码。
  • 你可以依靠现有的框架,比如Netty

马绍尔群岛共和国

  • 从技术上讲,这也是网络通信,但这对你来说是透明的。

成熟的消息传递架构

  • 通常也基于RMI或网络通信构建,但支持复杂的对话和工作流程
  • 对于简单的东西来说可能太重了
  • 像ActiveMQJBoss Messaging这样的框架

Java Management Extensions (JMX)

  • 更多的是用于JVM管理和监控,但如果你主要想让一个进程查询另一个进程的数据,或者如果它们不是太复杂,可以帮助实现你想要的东西, 或者发送一些操作请求
  • 也适用于RMI(以及其他可能的协议)
  • 起初不是那么简单,但实际上使用起来相当简单

文件共享/文件锁定

  • 这就是你现在正在做的事情
  • 这是可行的,但有很多问题需要处理

信号

  • 您只需将信号发送到其他项目即可
  • 但是,它相当有限,需要您实现一个翻译层(尽管这是可行的,但是这是一个相当疯狂的想法,而不是任何严肃的想法。

如果没有更多细节,基于裸露网络的IPC方法似乎是最好的,因为它是:

  • 最具可扩展性(在向您的
  • 最轻量级(就应用的内存占用量而言)
  • 最简单(在设计方面)
  • 最具教育意义(在学习如何实施IPC方面)。(正如您在评论中提到的“套接字很难”,它确实不是,也应该是您工作的东西)

话虽如此,根据你的例子(简单地请求另一个进程来执行操作),JMX也可能对你来说足够好。


答案 2

我在github上添加了一个名为Mappedbus(http://github.com/caplogic/mappedbus)的库,它使两个(或更多)Java进程/ JVM能够通过交换消息进行通信。该库使用内存映射文件,并利用读取和添加和易失性读/写来同步不同的读取器和写入器。我使用此库测量了两个进程之间的吞吐量,达到4000万条消息/秒,读取/写入单个消息的平均延迟为25 ns。


推荐