簡體   English   中英

尋找或建立進程間廣播通信信道

[英]Finding or building an inter-process broadcast communication channel

所以我們在產品中有這種不尋常的需求。 我們在本地主機上運行了許多進程,需要構建它們之間的通信方式。 困難在於......

  1. 沒有“服務器”或主進程
  2. 消息將廣播到所有偵聽節點
  3. 節點都是Windows進程,但可能是C ++或C#
  4. 節點將同時以32位和64位運行
  5. 任何節點都可以隨時跳入/跳出對話
  6. 異常終止的進程不應對其他節點產生負面影響
  7. 緩慢響應的進程也不應對其他節點產生負面影響
  8. 節點不需要“監聽”廣播消息

一些更重要的細節......

我們需要發送的“消息”本質上是微不足道的。 消息類型的名稱和單個字符串參數就足夠了。

通信不一定是安全的,不需要提供任何認證或訪問控制手段; 但是,我們希望通過Windows登錄會話對通信進行分組。 這里可能感興趣的是,非升級過程應該能夠與升高的過程相互作用,反之亦然。

我的第一個問題是:是否存在一個現有的開源庫?或者可以用來輕松實現這一目標的東西。 截至目前我還沒有找到任何東西:(

如果這個庫不存在那么......你會用什么技術來解決這個問題? 套接字,命名管道,內存映射文件,事件句柄? 似乎基於連接的傳輸(套接字/管道)在完全連接的圖形中是個壞主意,因為n個節點需要n(n-1)個連接。 使用事件句柄和某種形式的共享存儲似乎是目前最合理的解決方案......

更新

  • 它必須可靠且有保證嗎? 是的,沒有......讓我們說如果我正在傾聽,而且我在合理的時間內做出回應,那么我應該總是得到這個消息。

  • 什么是典型的郵件大小? 少於100個字節,包括消息標識符和參數。 這些都很小。

  • 我們在談論什么消息率? 低吞吐量是可以接受的,每秒10個會很多,平均使用率大約是每分鍾1個。

  • 涉及的流程數量是多少? 我希望它處理0到50之間,平均值在5到10之間。

我不知道已經存在的任何東西,但你應該能夠通過以下組合構建一些東西:

  • 內存映射文件
  • 活動
  • 互斥
  • 信號

這可以通過不需要“主”進程的方式構建,因為所有這些都可以創建為命名對象,然后由OS管理,直到最后一個客戶端使用它們時才銷毀。 基本思想是,第一個啟動過程創建所需的對象,然后所有其他進程連接到那些。 如果第一個進程關閉,則只要至少有一個其他進程正在維護它們的句柄,對象就會保留。

內存映射文件用於在進程之間共享內存。 互斥鎖提供同步以防止同時更新。 如果您想允許多個讀者或一個編寫器,您可以使用幾個互斥鎖和一個信號量來構建類似讀取器/寫入器鎖的東西(請參閱是否存在全局命名讀取器/寫入器鎖? )。 事件用於在發布新消息時通知所有人。

我揮手告訴了一些重要的技術細節。 例如,知道何時重置事件有點困難。 您可以讓每個應用程序輪詢更新。

但走這條路線將提供一種無連接的信息共享方式。 它不需要始終運行“服務器”進程。

為了實現,我建議用C ++實現它,讓C#程序通過P / Invoke調用它。 或者也許在C#中讓C ++應用程序通過COM interop調用它。 當然,這是假設您的C ++應用程序是本機而不是C ++ / CLI。

我從來沒有嘗試過這個,但理論上它應該有效。 正如我在評論中提到的,在loopback設備上使用UDP端口。 然后,所有進程都可以從/向此套接字讀取和寫入。 正如你所說,消息很小,所以應該適合每個數據包 - 可能你可以看看谷歌的協議緩沖區之類的東西來生成結構,或者只是將結構復制到數據包中發送,在另一端,轉換。 鑒於它全部在本地主機上,您沒有任何對齊,網絡訂單類型問題需要擔心。 要支持不同類型的消息,請確保可以檢查類型的公共標頭,以便您可以向后兼容。

2分錢小費...

你要找的是Mailslots!

請參閱CreateMailslot: http//msdn.microsoft.com/en-us/library/windows/desktop/aa365147( v = vs.85) .aspx

我認為一個更重要的考慮因素是性能,我們在談論什么消息率而不是。 進程? 無論哪種方式,您都依賴於允許通信需求的“主”,無論是自定義服務還是提供的系統(管道,消息隊列等)。

如果你不需要跟蹤和查詢過去的消息,我認為你應該考慮一個打開命名管道的死簡單服務 - 允許所有其他進程讀取或寫入它作為PipeClients。 如果我沒弄錯的話,它會檢查列表中的所有項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM