[英]Using serialization to talk between two process/applications (Inter Process Communication)
最近我在面試中被問到以下問題:
有一個進程/應用程序 A 每 5 分鍾不斷地獲取消息(假設)
要求是有一個進程/應用程序 B 需要從 A 傳輸消息。
但是進程/應用程序 A 應該確保消息實際上已被進程/應用程序 B 收到。
面試官想知道如何在 C# 中實現這一點。 我們可以在這里使用序列化嗎?
根據我的理解,最好的方法是使用消息隊列或管道機制。
任何涉及在進程之間發送消息(或者,通常,甚至在單個進程中的 AppDomains 之間)都必須使用某種序列化,因為最終需要將數據映射到可以遍歷進程空間的東西,以及“消息”顧名思義,就是序列化數據。 這種序列化可以是顯式的,也可以是隱式的(自動的,可能是通過代理/存根層 - 盡管我不喜歡)。
實際上,進程/應用程序 A不能“確保”它已經交付,因為它不能強制第二個進程正在運行。 然而,它可能有某種回調確認消息。 事務性消息隊列並非不合理,但這只能確保它被排隊——它並不能確保它得到處理(永遠)。 就個人而言,我會先看看套接字是否足夠。
.NET 中 IPC 有一些可能的方法:
最簡單的一種是在 .NET 4.0 中使用內存映射文件。
您可以使用序列化或任何消息表示格式(例如 XML)進行消息傳遞。
這是關於 IPC 但如果你想確保請求是從哪里發送的(進程 B 或另一個進程),你必須使用簽名機制。
序列化(簡而言之)是創建消息的過程。 但是,如果您有興趣確保消息到達其目的地(並以一致的狀態執行),您應該詢問通信協議 - 這是描述消息實際發送方式的內容。 例如,UDP 協議不保證交付,而 TCP 保證。
還值得一提的是,保證傳遞意味着可以保證系統 B 完整地接收消息,或者系統 A 將被告知傳遞失敗(例如,當系統 B 關閉時)。 也就是說,一些消息隊列也能保證傳遞——有一個超時,當隊列中的按摩沒有到達目的地時,消息將被標記為失敗(例如,將其放入失敗的消息隊列)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.