【发布时间】:2011-01-28 11:31:48
【问题描述】:
我必须在同一系统上运行的 java/c++/python 进程之间实现 IPC 机制(发送短消息)。一种实现方式是使用 TCP 协议的套接字。这需要保持连接和其他相关活动。 相反,我正在考虑使用不需要连接并且可以发送消息的 UDP 协议。 我的问题是,同一台机器上的 UDP(对于 IPC)是否仍然具有相同的缺点,它是否适用于跨机器通信(如不可靠的数据包传递、无序数据包。
【问题讨论】:
我必须在同一系统上运行的 java/c++/python 进程之间实现 IPC 机制(发送短消息)。一种实现方式是使用 TCP 协议的套接字。这需要保持连接和其他相关活动。 相反,我正在考虑使用不需要连接并且可以发送消息的 UDP 协议。 我的问题是,同一台机器上的 UDP(对于 IPC)是否仍然具有相同的缺点,它是否适用于跨机器通信(如不可靠的数据包传递、无序数据包。
【问题讨论】:
是的,仍然不现实。对于本地通信,请尝试使用命名管道或共享内存
编辑:
不知道您的应用程序的要求,您是否考虑过类似 MPI(尽管 Java 没有得到很好的支持......)或 Thrift 之类的东西? (http://thrift.apache.org/)
【讨论】:
本地 UDP 仍然不可靠,但主要优势是 UDP 多播。您可以拥有一个数据发布者和多个数据订阅者。内核负责为您将数据报的副本传递给每个订阅者。
另一方面,Unix 本地数据报套接字需要可靠,但它们不支持多播。
【讨论】:
本地 UDP 比网络上的更不可靠,例如 50% 以上的丢包率不可靠。这是一个糟糕的选择,内核开发人员将质量归因于需求不足。
我建议研究基于消息的中间件,最好使用与 BSD 套接字兼容的接口,以便于学习曲线。建议是 ZeroMQ,其中包括 C++、Java 和 Python 绑定。
【讨论】:
本地 UDP 仍然不可靠,有时会被防火墙阻止。我们在MsgConnect 产品中遇到了这个问题,该产品使用本地 UDP 进行线程间通信。 BTW MsgConnect 可以作为您的任务的一个选项,这样您就不需要处理套接字。不幸的是,没有 Python 绑定,但存在“本机”C++ 和 Java 实现。
【讨论】: