跨 c#、c++ 和可能更多语言的进程间发布/订阅模型

Posted

技术标签:

【中文标题】跨 c#、c++ 和可能更多语言的进程间发布/订阅模型【英文标题】:Interprocess pub/sub model across c#, c++ and possibly more languages 【发布时间】:2013-03-06 16:48:38 【问题描述】:

我想创建一个具有多个通信进程的系统。

主进程正在引发事件。将有不同的事件,每个事件都包含结构化数据。几个从属进程将订阅事件、接收数据并调用适当的处理程序。 关于我的情况有两个考虑。

    我不关心安全性,因为不会有第三方服务。 我担心性能。

人们建议在这种情况下使用像零 MQ 这样的消息队列。我对它应该实现的方式有点困惑。据我了解,ZeroMQ 只能发送\接收原始字符串数据。

我是否应该在发布者端将数据打包到字符串(例如 json 或 xml)中,在订阅者端手动解包数据并仅过滤必要的消息?

如果有更好的方法来解决我的问题,我会很高兴听到它。

【问题讨论】:

我在这方面没有太多的个人经验,但我听说过关于 Google 的 Protocol Buffers code.google.com/p/protobuf 的好消息,特别是在各种参与进程可能用不同语言编写的情况下 另请参阅此问题***.com/questions/475794/…,其中包括有关协议缓冲区的 .NET 实现的基准测试信息 谢谢,@KenKeenan 如果我理解正确的话,protobuffers 只是用不同语言序列化数据的常用方法。换句话说,我仍然必须使用 ZeroMq 并手动过滤所需的消息。我想知道这是否是做这项工作的正确方法 我相信你是对的:你仍然需要一些来回传递序列化消息的方法。同样,我对 ZeroMQ 本身没有任何经验,但我在 Java 中使用过专有的消息队列产品。消息队列的最大优点是它们是排队的——如果客户端没有永久连接,它们将存储消息。如果您不需要此功能,则可以使用原始 TCP 套接字。 【参考方案1】:

对于您描述的场景,我会使用消息传递提供程序。我看到的优点是

1) 不必编写代码来将消息传递给订阅者。那让我专注于我的业务逻辑和数据格式。我可以决定数据格式(XML/JSON/任何适合我的要求并被订阅者理解的格式)并发布消息。

2) 如果有需求,可以在不添加/修改任何代码的情况下增加订阅者的数量。

3) 订阅者可以移动到不同的机器上而不影响解决方案。

4) 订阅者也可以离线,主/发布者仍然可以发布消息。订阅者可以稍后加入并调用所需的处理程序。

【讨论】:

【参考方案2】:

这些是我看到的选项:

    如果只关心性能,而事件的持久性和持久性不是要求的一部分,则将数据打包在字节数组中的自定义协议结构中,并使用套接字进行进程间通信。但请注意 - 自定义字节数组结构在可扩展性和可维护性方面的成本很高。另一种选择是选择 JSON 作为数据交换格式,这种格式相对更具可读性。 如果事件数据的持久性和持久性是要求的一部分,那么就可以利用面向消息的中间件的好处。声明式同步等功能是 MOM 可以带来的其他一些好处。

【讨论】:

以上是关于跨 c#、c++ 和可能更多语言的进程间发布/订阅模型的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信包创建

快速发送进程间信号

什么是最简单的进程间通信方法 - 跨任何操作系统和语言

跨语言共享环境变量

c# 进程间的通信实现之一简单字符串收发

需要帮助设计进程间通信层