两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?

Posted

技术标签:

【中文标题】两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?【英文标题】:Can ZeroMQ be used by two JVM processes to communicate on same machine? 【发布时间】:2014-03-06 01:38:19 【问题描述】:

我一直使用 ActiveMQ 或 RabbitMQ,但最近开始深入研究 ZeroMQ,因为它得到了关注。如果我阅读的内容是正确的,那么它似乎是消息代理以及进程间通信(IPC)的机制?

我的情况是,我有 2 个 Java 进程需要在同一台机器上相互通信。我不想使用共享文件方法,因为它们之间的对话/协议非常复杂,而且文件解决方案看起来很笨拙。

所以我打算开始使用 Netty 或 MINA 之类的东西来定义我自己的通信协议,并让它们通过端口进行对话,但后来我开始阅读有关 ZeroMQ 的内容想知道我是否可以用更少的工作完成同样的工作。

所以我问:ZeroMQ 是否可以用于 Java 进程之间的 IPC,如果可以,是否有具体的代码示例或文章解释了如何做到这一点?

【问题讨论】:

Zero 表示零经纪人。 ZeroMQ 用于基于消息的 IPC,他们的网站上有大量示例。 感谢@Peter Lawrey (+1) - 但如果你真的访问他们的网站,你会发现:(1) 大量非 Java 语言的示例,以及 (2) Java例如,所有这些都关注多个线程之间的通信在同一个 JVM 进程中,而不是在 2 个 JVM 进程之间...... 我在您的陈述中看不到任何与 @PeterLawrey 告诉您的单词相矛盾的内容。 沉默是让人头疼的问题,一开始怎么会有人怀疑这一点。 这里没有证据表明任何人不了解进程和线程之间的区别,也没有证据表明 ZeroMQ 仅限于单个 JVM。这里的结论跳跃符合奥林匹克标准。 【参考方案1】:

web site 的前三行告诉你所有你需要知道的事情。

分布式计算变得简单

 Ø  充当并发框架的套接字库。 Ø  跨inproc、IPC、TCP和多播传送消息。

我看不出有任何理由怀疑这在环回中不起作用,如果它不能,那将是非常奇怪的。

【讨论】:

【参考方案2】:

是的,zmq 可以用来连接两个 Java 进程。您可以将纯 Java 实现 JeroMq 或 ZeroMq 与 Java 客户端一起使用。 JeroMq 更容易安装,因为您只需要适当的依赖项。以下是监听器的简单示例:

import org.zeromq.ZMQ;

public class Subscriber 

    public static void main(String[] a)
        final ZMQ.Context ctx = ZMQ.context(1);
        final ZMQ.Socket sub = ctx.socket(ZMQ.SUB);
//        sub.connect("tcp://localhost:6001");
        sub.connect("ipc://001");
        sub.subscribe("".getBytes());

        while (true)
            String msg = sub.recvStr();
            System.out.println(msg);
        
    

对于出版商:

import org.zeromq.ZMQ;

public class Publisher 

    public static void main(String[] a) throws InterruptedException 
        final ZMQ.Context ctx = ZMQ.context(1);
        final ZMQ.Socket pub = ctx.socket(ZMQ.PUB);
        pub.bind("ipc://001");
//        pub.bind("tcp://*:6001");

        while (true)
            System.out.println("Publishing");
            pub.send("Test");
            Thread.sleep(1000);
        
    

IPC 和 TCP 都可以工作。

【讨论】:

以上是关于两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中,同一台机器上的两个进程进行通信的最佳方式是啥?

在同一个 apache spark 集群上提交两个应用程序会在同一个 JVM 或不同的 JVM 上生成驱动程序进程

最高效 - 性能方面 - 用于 JVM 间通信

ZeroMQ 和本地 FIFO

当多个java程序在同一台机器上运行时

两个 JVM 之间的共享内存