簡體   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