2013-05-12 57 views
0

在我的應用程序中,每個讀取文檔都可以有數千個讀取器。如何在Netty中處理讀取速度慢的讀者?

我需要能夠緩衝較慢的閱讀器,以便我可以繼續處理其他閱讀器,以便最大限度地使用磁盤和CPU。

這通常如何完成?我當然可以使用TCP發送緩衝區,但我認爲這些會很快填滿。

另一種策略是保留一個單獨的緩衝區,這個緩衝區只是ChannelBuffers的一個隊列,它將被綁定。

我認爲,如果任何這些緩衝區填充,我應該只是失敗的客戶端,因爲它不能夠快速讀取?

+0

到目前爲止我只是不停未決消息隊列,但是這似乎很討厭。此外,我有一個磁盤線程和一個網絡線程,理想情況下,我將有一種方法可以快速將消息傳遞給它們。我當然可以使用ConcurrentLinkedQueue,但它似乎只是tcp發送緩衝區的重複。所以我應該使用它。如果我需要它更大,我可以重新調整應用程序中的緩衝區大小。 – burtonator 2013-05-12 00:29:45

+0

最好先嚐試一些代碼,然後發佈代碼,如果你有其他問題或想找到更好的方法。 – Senjai 2013-05-12 00:31:04

+0

我同意,但我遇到的問題是不寫代碼,而是代碼的設計。 :) – burtonator 2013-05-12 00:36:07

回答

1

使用TCP發送緩衝區。這是首先填滿的東西。然後你開始獲得零長度的寫入。在這一點上,你應該做兩件事:

  1. 停止產生該連接的輸出。
  2. 註冊OP_WRITE的通道,當它觸發時重試上一次寫入。如果成功,取消註冊OP_WRITE並繼續正常。

在我看來,你也應該停止從通道讀取而它的狀態。如果它仍在生產的請求,並沒有消耗的反應,這是它的問題,不是你的。你沒有理由繼續製作它沒有閱讀的答案,也沒有理由浪費你的記憶力,直到閱讀它們爲止。

0

我需要能夠緩衝較慢的閱讀器,以便我可以繼續處理其他閱讀器,以便我可以最大限度地使用磁盤和CPU。

Netty爲你真正照顧這個。既然你是單線程的,你不能等待客戶端讀取任何東西,否則你會鎖定你的單線程而沒有任何反應。所以你可以寫信給你的ChannelBuffer,它不會阻塞,並且在你將它返回給netty之後它會在稍後發送它。因此,釋放線程以服務另一個客戶端,同時該另一個緩衝區正在發送或未發送到客戶端。所以如果一個讀者很慢,你最終會得到一個充滿但沒有被讀取的ChannelBuffer。

現在,如果事情是真的不是你有一個ChannelBuffer類型(或多個)客戶端讀取只是佔用空間,但你可以使用這個通知,如果事情的時間太長和清理:

http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/timeout/ReadTimeoutHandler.html

還有這樣太:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/timeout/IdleStateHandler.html