2012-08-08 88 views
1

我們有很多通訊服務器發送數據包。我們希望將這些服務器程序中的這些數據包存儲在MSMQ中,直到更新程序處理它們。數據丟失一直是一個問題,我們希望不會丟失來自這些服務器程序的任何數據包,並希望獲得高效且高性能的解決方案。設計量大MSMQ

什麼是最好的設計方法?

回答

2

那麼,你需要做兩件基本的事情來開始。首先,您需要修改默認安裝,以將存儲位置移至鏡像的驅動器,和/或與該服務器上操作系統引導的驅動器不同。此外,您還需要確保有足夠的空間容納正在排隊的消息,具體取決於您正在考慮的音量。文章涵蓋了這一點。

其次,您需要使用交易和日記來確保可靠性。這既是一個編程和基礎設施問題,所以你可以先看this文章,然後跟隨一本關於如何正確編程MSMQ的通用指南。例如This是一個很好的起點,如果你從未使用過MSMQ,儘管它非常基本。如果您打算使用MSMQ作爲WCF的綁定/傳輸,那麼您的管道部分已經涵蓋了很多;只需配置您的服務即可處理您認爲您將看到的流量和流量。

+0

非常感謝您的設計理念。我想用WCF和MSMQ設置事務隊列和日誌隊列。我們有許多應用程序發送數據包。我的WCF客戶端應該配置爲偵聽來自這些應用程序的數據包的一個端口嗎?這會是一個開銷嗎?我想獲取數據包並將它們寫入隊列。體積再高(每天有數百萬個數據包)什麼是最好的方法?任何示例代碼我可以看看? WCF是否適合這個?謝謝 – user180175 2012-08-10 14:58:21

+0

這裏有一個信息_lot_,只要搜索谷歌'配置wcf msmq'就會產生一堆有用的文章。你如何去做這取決於你的具體情況;我建議儘可能多地閱讀,然後做出決定。你的音量似乎不會成爲問題。假設它們配置正確,WCF和MSMQ具有很高的性能。 – kprobst 2012-08-10 17:15:00

+0

謝謝。我會搜索並找出更多。 – user180175 2012-08-11 11:16:30

0

我們有很多通信服務器發送數據包。

當存儲'數據包'時,我建議將.NET對象寫入WCF,主要是因爲WCF可以透明地讀/寫MSMQ。這將更容易處理,但如果你的數據包是TCP/IP或二進制包,你需要打開'Ordering',以確保它們按照它們放置的順序進入隊列。

MSMQ也有會話,所以如果你想組合項目這是可能的。 WCF不做這個保證。您需要爲此編寫自定義代碼,但這只是爲特定會話中的每封郵件分配唯一標識的情況。

數據丟失一直關注的,我們想不失去這些服務器程序來的任何數據包

MSMQ可以持續的數據到磁盤上,因此如果一臺服務器出現故障,其隊列被保留。 MSMQ可以將隊列保存在內存中,這樣更有效,但崩潰/重新啓動不會保留隊列信息。

,並希望有一個有效的(良好的性能)

MSMQ是相當高性能的。磁盤的持久性有一個小的開銷,但只是由於磁盤寫入。如果性能包括多線程,則MSMQ不提供此功能,因爲隊列是順序的,所以必須按順序處理。但這是隊列技術的典型特徵。

MSMQ也有4MB最大郵件大小,因此請記住您想要通過網絡發送的內容。

唯一的另一件事是MSMQ不具有大規模可擴展性。其主要目標是保證交付。如果你發送了數據包百萬,他們會到達目的地,但是MSMQ確實具有將消息推送到其他機器的有限能力。它運行一個類似於ThreadPool的系統,因此如果這也是一個需求,它不會擴展。

我還通過寫入數據的基本示例向#msmq-wcf wiki添加了信息。