【问题标题】:UDP for interprocess communicationsUDP 用于进程间通信
【发布时间】:2011-01-28 11:31:48
【问题描述】:

我必须在同一系统上运行的 java/c++/python 进程之间实现 IPC 机制(发送短消息)。一种实现方式是使用 TCP 协议的套接字。这需要保持连接和其他相关活动。 相反,我正在考虑使用不需要连接并且可以发送消息的 UDP 协议。 我的问题是,同一台机器上的 UDP(对于 IPC)是否仍然具有相同的缺点,它是否适用于跨机器通信(如不可靠的数据包传递、无序数据包。

【问题讨论】:

    标签: sockets udp ipc


    【解决方案1】:

    是的,仍然不现实。对于本地通信,请尝试使用命名管道或共享内存

    编辑:

    不知道您的应用程序的要求,您是否考虑过类似 MPI(尽管 Java 没有得到很好的支持......)或 Thrift 之类的东西? (http://thrift.apache.org/)

    【讨论】:

      【解决方案2】:

      本地 UDP 仍然不可靠,但主要优势是 UDP 多播。您可以拥有一个数据发布者和多个数据订阅者。内核负责为您将数据报的副本传递给每个订阅者。

      另一方面,Unix 本地数据报套接字需要可靠,但它们不支持多播。

      【讨论】:

      • 对不起,我不明白这一点。您是说 UDP 多播比普通 UDP 可靠吗?在环回接口上使用 UDP 多播来实现跨进程发布/订阅在机器边界内也是一个好主意。
      • 无论是单播、多播还是广播,UDP都是不可靠的。环回接口上的多播没有问题。
      • 您能否解释一下为什么 UDP 对于 IPC 不可靠。由于它永远不会离开主机系统,它不应该面临拥塞、误码等问题。那为什么它不可靠呢?
      • @Tahlil 因为发送/接收套接字内核缓冲区的大小是有限的。快速生产者或慢消费者可能会溢出缓冲区,内核将开始丢弃数据报。
      【解决方案3】:

      本地 UDP 比网络上的更不可靠,例如 50% 以上的丢包率不可靠。这是一个糟糕的选择,内核开发人员将质量归因于需求不足。

      我建议研究基于消息的中间件,最好使用与 BSD 套接字兼容的接口,以便于学习曲线。建议是 ZeroMQ,其中包括 C++、Java 和 Python 绑定。

      【讨论】:

      • 我之前评估过 Zeromq,它完全符合需求。但它需要额外的库依赖,包括 java ( jar ) 和 c++ ( lib )。我想使用 java 和 C++ 中现有的 API 来实现相同的目的。也想问一下UDP丢包的问题,​​有没有资料或者文章,让我更好的理解,为什么同机UDP通信不可靠
      • 没有什么可以处理 UDP 对不起,对于 ZeroMQ 和 Java,如果您不想要 JNI 库,您将不得不编写自己的本机版本。
      • @Steve-o 你能解释一下本地 UDP 比网络上更不可靠吗?除了网络上的障碍之外,Local 上还有哪些障碍?
      【解决方案4】:

      本地 UDP 仍然不可靠,有时会被防火墙阻止。我们在MsgConnect 产品中遇到了这个问题,该产品使用本地 UDP 进行线程间通信。 BTW MsgConnect 可以作为您的任务的一个选项,这样您就不需要处理套接字。不幸的是,没有 Python 绑定,但存在“本机”C++ 和 Java 实现。

      【讨论】:

        猜你喜欢
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多