2012-07-16 113 views
2

這個問題一直困擾着我幾個星期,但我太急於以明智的事後處理它。我終於向agog客戶提供了一個快速和骯髒的解決方案,以緩解他脆弱的神經(作爲結果,也是我的&)。我現在終於花時間用自由的頭腦來審視這個問題。混合異步/同步架構

基本上,我面臨的挑戰是儘可能快地處理同步數據(Time-Ordered Series)(< 5ms)。在嘗試了許多Rube-Goldberg風格的設計之後,比如有序的線程池和混合解決方案,其中包括平行工作者隊列和其他不可思議的牽強的想法,一個徹底的實踐工作臺證明,堅持一個普通的「舊單線程鏈處理是數據完整性和性能的最佳選擇。

但是,在應用程序底部的某個點,這會達到一定的限制。我需要以並行方式向不同的處理器廣播數據。而這正是我頭痛又開始的地方。 當我使數據中心(見下文)以異步方式(通過線程&二進制環形緩衝區)向處理器發送數據時,接收方以混亂的順序接收數據,並且數據順序被破壞。

因此,我正在尋找一種以並行方式向所有處理器發送數據的方式,並保持順序。我的另一個擔心是異步性:如果數據中心的SendEvent委託人以簡單的傳統方式(通過+=)通過進程的Receive方法訂閱,那麼這將如何表現?
首先,我不希望訂閱被稱爲「一個一個」。我相信有一種方法可以將其並行化。其次,最重要的是,我確實不希望處理器A鎖定整個鏈條,直到完成其工作。

所以這裏是人。長話短說,我想找到一種明智的方式來不斷等待數據處理,而不必等待處理器發送數據,但同時我需要每個數據處理器以有序的方式接收數據。這可能聽起來不兼容,但我確信有一個很簡單的方法來做到這一點(但我深深地陷入了這個問題,我非常困惑,這就是爲什麼我要求你的幫助,好人)

enter image description here

+0

我喜歡你的「平行工人隊列」的想法。具體而言,[阻塞隊列](http://stackoverflow.com/a/530228)允許數據在等待處理時排隊。 – 2012-07-16 15:33:32

+0

處理器位於單個(多核)系統還是分佈式計算機?需要預處理器還是後處理器或兩者兼容?什麼是.NET版本? – oleksii 2012-07-16 15:37:18

+0

什麼構成你的問題中的「秩序」? – Kit 2012-07-16 16:23:12

回答

1

如果你在談論中,你需要有序系列分發到所有處理器在同一臺機器上一臺機器,我會數據中心,與單線程的想法繼續,排隊連續N私人排隊(速度相對較快,所以我不擔心封鎖,而且您知道該物品已入隊到全部隊列中)。

這些專用隊列中的每一個都只允許來自一個處理器的唯一隊列。可能較慢的「數據集線器 - >處理器」將被並行調用,但不會阻塞整個鏈,因爲您會這樣做,因爲......然後,您可以配置1個處理器/隊列/線程(簡單管理)或1個隊列/ N個隊列/類似無狀態處理器(這將需要額外的下游工作來進行重新排序)。

在更分散的系統(例如多機)中,您通常會有類似的數據中心向消息「主題」發送消息,然後讓消息傳遞基礎結構發送給所有消費者。

0

這聽起來像你正在尋找Service Bus。在你的圖中,這將是數據中心。微軟提供了一個名爲MSMQ的服務,可以用於這樣的事情,我喜歡使用名爲NServiceBus的庫來簡化事情。

+1

我認爲OP將很難用消息隊列獲得小於5ms的響應時間。 – 2012-07-16 15:54:59

+0

真..錯過了那部分。儘管如此,架構仍然適用。 – 2012-07-16 16:03:55

+0

@SteveCzetty:別擔心,但幾年前我在一家大金融公司的MSMQ支持團隊負責時,幾乎陷入了沮喪。不是真正我生命中最好的紀念品:-)這個技術是一個殺死飛行恕我直言的錘​​擊。但我的意見是100%有偏見 – 2012-07-16 17:47:59

0

不知道它是否最適合,但zeromq可能適合你。你可以擁有所有內存(快速)的隊列,你可以扇出然後將消息壓縮成多種配置(我認爲它可以處理順序等)。我有沒有在項目中使用zeromq的經驗,但是,它確實有一些引人注目的功能,似乎很好的支持(包括許多客戶端語言,C#)。

The manual page有一個很好的介紹視頻,顯示該工具可以實現的功能。