2016-02-22 29 views
0

我有一些數據,必須被寫入Cassandra。最初,我認爲這會很簡單,只需爲ReadTimeout,WriteTimeout,Unavailable和RequestError設置一個RetryPolicy即可。但是,我看到的僅有兩項重試決策是tryNextHostretry永久重試所有主機重試策略?

retry似乎永遠嘗試,但它一次又一次地嘗試同一個主機。即使節點乾淨地離開羣集並宣佈其離開(將其範圍的所有權移交給另一個節點),此重試策略似乎仍會繼續嘗試發送到同一主機。

tryNextHost解決了這個問題,但它似乎只嘗試每個主機一次,然後放棄(讓異常冒泡)。

我需要一個通過主機輪換的重試策略(或者至少在乾淨地離開集羣時移動主機),但我可以設置爲永久重試。我研究過編寫自己的RetryDecision,但沒有公共構造函數,即使我解決了這個問題,但由於構造函數非常有限,我沒有找到解決此問題的方法。

我該如何重試永久旋轉主機?

回答

2

RetryPolicy單獨不允許你這樣做。涉及的其他組件是LoadBalancingPolicy,它確定將嘗試哪些主機(換句話說,它生成重複調用tryNextHost調用將迭代的序列)。

所以我想你可以寫一個自定義負載平衡策略,返回無限迭代器。但坦率地說,這是非常不尋常的,你應該考慮可能會永久循環的請求的含義。

+0

我會研究'LoadBalancingPolicy',看看我能想出什麼。該服務可以控制其採集速率,如果出現故障,最好停止處理直到人類可以調查,而不是在不寫信息的情況下繼續處理。另外,重試策略專門針對timouts和不可用設置,這兩者通常意味着羣集的問題,而不是請求本身的問題。 重試每個主機一次的問題是如果羣集不可訪問(網絡拆分)。我需要針對硬件故障(節點關閉)和羣集無法訪問提供保護。 –

+0

我已經實現了一個自定義的'LoadBalancingPolicy',它返回一個重複調用'TokenAware'策略迭代器的無限迭代器(隨時用完)。我將在明天進行測試,如果有效,我會接受這個答案。 –