你要做的第一件事就是退一步,考慮一下這個應用程序的性能有多關鍵。你真的需要併發地處理消息嗎?這是關鍵任務嗎?或者你只是認爲你需要它嗎?你有沒有在你的服務上運行一個分析器來查找過程的真正瓶頸並優化它們?
我之所以這樣問,是因爲你提到你想8個併發procceses - 但是,如果你讓這個程序單線程的,這將大大降低複雜&研究與開發&測試時間......而且因爲只有你想要8,它似乎不值得...
其次,因爲你只能在同一個實體上進行併發消息 - 你多久會得到來自客戶端的併發請求來處理同一個實體?值得爲可能不經常出現的用例添加如此多的複雜層次嗎?
我會吻。我會通過WCF使用MSMQ,並將我的WCF服務保持爲單例。現在您擁有了強大的功能,訂購了MSMQ的可靠性,您現在可以滿足您的實際需求。然後,我會用高實際數據在高負載下測試它,然後運行分析器查找瓶頸如果我發現它太慢了。只有這樣,我纔會經歷構建更復雜的應用程序以管理僅針對特定用例的併發性的所有額外麻煩......
要考慮的一種設計是創建中央「門衛」或「服務總線」服務誰收到來自客戶端的所有消息,然後將這些消息傳遞給實際的工作服務。當他收到請求時,他會發現他的另一個客戶是否已經爲同一個實體發送了一條消息 - 如果是的話,他會將它發送給他發送另一條消息的同一個服務。通過這種方式,您可以同時爲給定的實體處理相同的消息,僅此而已......而且您可以輕鬆實現無縫擴展......但是,如果我絕對必須這樣做,並且通過分析和測試證明了這一點,而不是因爲'我們認爲我們需要它'(見YAGNI校長:))
你有多少個不同的實體(和實體類型)? – 2010-02-11 09:13:55
每天約5000個實體(超過100萬個實體)。音量&沒有。會很快加倍。該消息僅包含實體標識和操作類型以及每個操作的數據。約20種不同的操作類型。 – softveda 2010-02-20 23:59:51
也許有一個MessageReceiver將消息分派給線程池中的不同可用線程?如前所述,擁有由DateTimeReceived排序的XML序列化流將幫助您按時間順序執行,然後將此流傳遞給可用的線程。 – 2010-02-27 11:18:32