最近我在面试中被问及以下内容:
有一个进程/应用程序A每隔5分钟(假设)不断获取消息
要求是有一个进程/应用程序B需要从A传输消息。
但是,流程/应用程序A应该确保消息实际上已经收到了流程/应用程序B.
面试官想知道如何在c#中实现这一点。我们可以在这里使用序列化吗?
从我的理解,可以做到的最好方法是使用Message Queue或PIPE Mechanism。
答案 0 :(得分:0)
在.NET中有一些可能的IPC方法:
最简单的是在.NET 4.0中使用内存映射文件 您可以使用序列化或任何消息表示格式,例如用于消息传递的XML 这是关于IPC的,但如果您想确保从(进程B或其他进程)发送请求的位置,您必须使用签名机制。
答案 1 :(得分:0)
任何涉及在进程之间发送消息的东西(或者,通常,甚至在单个进程中的AppDomains之间)都使用某种类型的序列化,因为最终数据需要映射到某个可以遍历进程空间,根据定义,“消息”是序列化数据。这个序列化可以是显式的或隐式的(自动的,可能是代理/存根层 - 虽然我不喜欢)。
实际上,流程/应用程序A 无法 “确保”已经交付,因为它无法强制执行第二个流程。但是,它可能会有某种回调确认消息。事务性消息队列不是不合理的,但这只能确保它排队 - 它不能确保它被处理(永远)。就个人而言,我先看看套接字是否足够。
答案 2 :(得分:0)
序列化(简而言之)是创建消息的过程。但是,如果您有兴趣确保消息到达目的地(并且处于一致状态),那么您应该询问通信协议 - 这就是描述消息实际发送方式的内容。例如,UDP协议不保证传送和TCP确实。
还值得一提的是,保证交付意味着保证系统B接收完整的消息,或者系统A将被告知交付失败(例如系统B关闭时)。也就是说,一些消息队列也保证了传递 - 当队列中的按摩没有到达目的地时,消息将被标记为失败(例如将其置于失败的消息队列中)。