繁体   English   中英

使用序列化在两个进程/应用程序之间进行对话(进程间通信)

[英]Using serialization to talk between two process/applications (Inter Process Communication)

最近我在面试中被问到以下问题:

有一个进程/应用程序 A 每 5 分钟不断地获取消息(假设)

要求是有一个进程/应用程序 B 需要从 A 传输消息。

但是进程/应用程序 A 应该确保消息实际上已被进程/应用程序 B 收到。

面试官想知道如何在 C# 中实现这一点。 我们可以在这里使用序列化吗?

根据我的理解,最好的方法是使用消息队列或管道机制。

任何涉及在进程之间发送消息(或者,通常,甚至在单个进程中的 AppDomains 之间)必须使用某种序列化,因为最终需要将数据映射到可以遍历进程空间的东西,以及“消息”顾名思义,就是序列化数据。 这种序列化可以是显式的,也可以是隐式的(自动的,可能是通过代理/存根层 - 尽管我不喜欢)。

实际上,进程/应用程序 A不能“确保”它已经交付,因为它不能强制第二个进程正在运行。 然而,它可能有某种回调确认消息。 事务性消息队列并非不合理,但这只能确保它被排队——它并不能确保它得到处理(永远)。 就个人而言,我会先看看套接字是否足够。

.NET 中 IPC 有一些可能的方法:

  1. .NET 4 中的内存映射文件
  2. .NET 远程处理
  3. 使用套接字和环回 (127.0.0.1)

最简单的一种是在 .NET 4.0 中使用内存映射文件。
您可以使用序列化或任何消息表示格式(例如 XML)进行消息传递。
这是关于 IPC 但如果你想确保请求是从哪里发送的(进程 B 或另一个进程),你必须使用签名机制。

序列化(简而言之)是创建消息的过程。 但是,如果您有兴趣确保消息到达其目的地(并以一致的状态执行),您应该询问通信协议 - 这是描述消息实际发送方式的内容。 例如,UDP 协议不保证交付,而 TCP 保证。

还值得一提的是,保证传递意味着可以保证系统 B 完整地接收消息,或者系统 A 将被告知传递失败(例如,当系统 B 关闭时)。 也就是说,一些消息队列也能保证传递——有一个超时,当队列中的按摩没有到达目的地时,消息将被标记为失败(例如,将其放入失败的消息队列)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM