2011-06-17 39 views
2

我有一個接收流數據的套接字連接。每天的消息數量大約是150萬。收到消息後,我需要處理它們。由於消息號碼非常大。我是多線程的消息處理代碼。現在我有8個線程,8個消息隊列。套接字進程將消息依次放入這些隊列中。每個進程只需要在自己的隊列中處理消息。有關高性能流數據處理的問題

我現在的問題是我的隊列溢出。

我應該有更多的隊列嗎? 所有線程將使用同步方法寫入共享對象。更多的隊列會相互影響並使事情變得更糟?

我應該有更大的緩衝區? 這些似乎很安全,但我真的想更快地處理消息。

我應該改變我的設計嗎? 有什麼好的建議嗎?遵循的指南?

歡迎任何評論。

+4

知道要做什麼的關鍵是找出花費的時間:調度消息,處理消息並寫入共享對象的同步方法。如果大部分時間都花在處理消息上,那麼只有更多的線程才能工作。你能做一些分析嗎? – stefaanv 2011-06-17 11:40:21

回答

3

你爲什麼使用單獨的隊列?通常的分配工作方式是讓所有員工閱讀1個共享隊列。在Java中,您可以使用共享的BlockingQueue輕鬆完成此操作。這樣,作業可以更均勻地分發(如果工作繁忙,工作人員不會將作業從隊列中拉出)。在你的策略中,緩慢的工作隊列最終可能會積壓積壓。爲了防止隊列溢出,您可以在隊列中放置一個最大大小,然後當您的積壓過大時生產者會暫停。

你提到你希望整個事情變得更快。雖然上面的建議可能會或可能沒有幫助,但解決問題的唯一方法是在分析器下運行系統,並查看瓶頸(很多時候,這不是您認爲的)的位置。否則,您可以花費大量的時間來優化代碼,而這些代碼並不會最終幫助您。有很多好的免費的Java Profileer(netbeans,jvisualvm,eclipse)和C++(valgrind)。 Java的一個偉大的非自由的是yourkit java profiler。

0

處理完一條消息後,每個處理線程是否寫入共享對象?這可能會造成瓶頸。在寫入共享對象之前,嘗試在每個線程中累積一些臨時結果。