2012-11-12 75 views
2

任務:需要使用可以在多個實例上運行的c#.net創建控制檯應用程序。 (爲了可擴展性)如何在C#中設計多實例應用程序?

現在,如果您創建一個簡單的應用程序,這很容易。我現在的問題是在我的應用程序中,我有一個全局變量。給你一個這個應用程序是什麼的想法。這是一個接收JSON消息的小程序(我使用RabbitMQ作爲消息傳遞部分)。它接收到的消息將存儲在全局變量中。現在,這使得很難在多個實例上運行應用程序。因爲如果您運行的應用程序不止一個實例,則可能是該消息會在其他應用程序上收到。這是因爲RabbitMQ的Round Robin行爲。 (創建Exchange或路由密鑰不是一個選項。)

我試過使用共享內存或MemoryMappedFile,但這也不起作用。

我想到的另一件事是使用數據庫。但我需要很好的設計才能做到這一點。 如果有人知道一個模式,一個例子或任何參考。讓我知道。

您的回覆非常感謝。

+0

您能否提供一些關於您的意圖的更多信息?你是否希望處理多個實例的消息?你想平行或不平行? – Dusan

+0

Hi @Dusan,更像是處理多個實例上的消息。 (在某種方式)。所以這裏是我用的RabbitMQ。我的應用程序正在使用隊列。如果您運行應用程序的多個實例,這意味着您的隊列中將有2個消費者。現在,當消息進入該隊列時。它會去你的第一個應用程序,當另一個消息進來時,它會去第二個應用程序。 (循環時尚)。現在可能是你在第二個應用程序上得到的那個消息是相同的消息,所以我需要一種方法來查看使用ID是否已經存在該消息。 –

+0

好吧,足夠清楚了...... – Dusan

回答

1

我會用MemoryMappedFiles,它們看起來是最簡單的方式來做到這一點(忽略數據庫)。 我不知道爲什麼沒有爲你做這項工作?

應用程序的每個實例都會在此文件中「註冊」自己並分配寫入數據的文件部分。 當您收到消息時,請檢查文件中存儲的其他實例的數據。

您可以對所有操作(實例註冊,寫入,讀取)使用Mutex - 它可以保證您擁有一致的數據圖像。

+0

嗨杜桑,我不認爲MemoryMappedFiles會爲我工作。即使我可以讓我的第一次嘗試工作,它仍然不會更好。因爲應用的另一個實例可能在另一臺機器上運行。 –

+0

嗨沉。在這種情況下,你將不得不使用某種共享資源。在我看來,數據庫將是無痛且最簡單的方法,因爲它們解決了併發訪問的問題。 – Dusan

+0

但是,如果您希望使用自定義解決方案,那麼在某些情況下,您將需要以正確的方式處理併發數據。 我建議你看看Petreson的算法作爲一個起點 - 它可能會以簡單易用的方式解決你的併發問題:http://en.wikipedia.org/wiki/Peterson%27s_algorithm – Dusan

1

如果內存映射文件真的不適合你,那麼稍微改變一下架構。擁有主控制檯應用程序(某種服務器),這可以根據需要產生其他控制檯應用程序(各種客戶端)。然後,他們可以使用Anonymous Pipes for Local Interprocess Communication(或任何其他進程間通信機制)來檢查服務器是否已處理該消息,如果不是,則將其添加到列表中或其他內容。

0

您所需要的架構是:

1控制器。這是負責從隊列中讀取消息並分配它。

1+ Handlers。根據您的負載,控制器將根據需要實例化一個或多個處理程序。處理程序應該有一個明確的開始/結束。意思是你執行一個,傳遞消息,並且一旦該消息被正確處理,它就完全退出。


或者,只要去購買Biztalk或類似的消息處理應用服務器。這就是這些東西的目的。

您最關心的是真正的可靠性問題;具體來說,知道消息實際上已經處理完畢。因此,您需要一個能夠在硬件故障(比如數據庫)中存活的存儲機制,控制器和處理程序之間的通信機制(可以是任何東西)以及假設長時間運行的進程進行響應的某種方式。可能是一個心跳的片斷,以確保其中一個處理程序不只是肚子痛。當然是一種重新處理信息的方式,可能是自動的,以防出現故障。最後,您需要一種方法來限制處理程序,以便您只能同時運行X號碼,以防止系統不堪重負。

總之,這不是一個「簡單」的應用程序,除非這些消息是可以被丟棄,忽略或以其他方式處理的。

相關問題