如何实现从一个进程到另一个进程的即发即弃消息传递?

Posted

技术标签:

【中文标题】如何实现从一个进程到另一个进程的即发即弃消息传递?【英文标题】:How to implement fire-and-forget messaging from one process to another? 【发布时间】:2015-04-28 08:02:04 【问题描述】:

点击一个按钮,一条简单的消息就会从一个进程发送到另一个进程,该消息只是一个带有字符串参数的简单命令,总共大约 50 个字符(绝对小于 1k),例如

DisplaySomeInfo("param1", "param2")

并满足以下条件:

必须简单(即没有成熟的消息传递系统) 必须在 Windows 上运行,应该在 Unix 上运行 下图显示了我的实际需求,但它应该适用于任何主要的编程语言/运行时 性能并不重要,对于这么简单的消息,整个发送/接收周期不应超过一毫秒 “保送”等不必要 发送者不关心接收者是否收到消息 - 或者是否有接收者首先 无需加密/认证/授权

在***中有一个很长的list of ways to do IPC,但最简单的似乎是非连接套接字选项。

有没有比简单地发送/接收 UDP 数据包(每个数据包一条消息,TTL=0)更好的方法(更容易实现/维护/调试,更多的未来证明......)来实现它,比如加上一个JSON(反)序列化器?

【问题讨论】:

看看0mq zeromq.org 【参考方案1】:

对于这些要求,简单地将 UDP 单播数据包发送到 localhost 上的某个端口似乎是理想的。唯一的问题是必须选择和固定端口号。但如果这不是问题,那么简单地发送和接收 UDP 数据包就非常简单,无需第三方库。

从 .Net 应用程序发送 UDP 数据包的简单示例:

public static void SendUdpPacket(int destinationPort, string payload)

    IPEndPoint endPoint =
      new IPEndPoint(IPAddress.Parse("127.0.0.1"), destinationPort);
    byte[] buffer = Encoding.UTF8.GetBytes(payload);
    Socket socket =
      new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    socket.SendTo(buffer, endPoint);
    socket.Close();

唯一悬而未决的问题是如何编码多个参数。但为此有无数种方法,许多语言都内置了 HTTP URL 编码。

【讨论】:

以上是关于如何实现从一个进程到另一个进程的即发即弃消息传递?的主要内容,如果未能解决你的问题,请参考以下文章

异步/等待有/无等待(即发即弃)

MEF插件架构上的“即发即弃”方法

演员模型不是一种反模式吗,因为即发即弃的风格迫使演员记住一个状态?

如何在 Python 中生成一个新的独立进程

Redis事件订阅和持久化存储

针对 C/C++ 远程消息队列的建议