我有一些數據,必須被寫入Cassandra。最初,我認爲這會很簡單,只需爲ReadTimeout,WriteTimeout,Unavailable和RequestError設置一個RetryPolicy即可。但是,我看到的僅有兩項重試決策是tryNextHost
和retry
。永久重試所有主機重試策略?
retry
似乎永遠嘗試,但它一次又一次地嘗試同一個主機。即使節點乾淨地離開羣集並宣佈其離開(將其範圍的所有權移交給另一個節點),此重試策略似乎仍會繼續嘗試發送到同一主機。
tryNextHost
解決了這個問題,但它似乎只嘗試每個主機一次,然後放棄(讓異常冒泡)。
我需要一個通過主機輪換的重試策略(或者至少在乾淨地離開集羣時移動主機),但我可以設置爲永久重試。我研究過編寫自己的RetryDecision,但沒有公共構造函數,即使我解決了這個問題,但由於構造函數非常有限,我沒有找到解決此問題的方法。
我該如何重試永久和旋轉主機?
我會研究'LoadBalancingPolicy',看看我能想出什麼。該服務可以控制其採集速率,如果出現故障,最好停止處理直到人類可以調查,而不是在不寫信息的情況下繼續處理。另外,重試策略專門針對timouts和不可用設置,這兩者通常意味着羣集的問題,而不是請求本身的問題。 重試每個主機一次的問題是如果羣集不可訪問(網絡拆分)。我需要針對硬件故障(節點關閉)和羣集無法訪問提供保護。 –
我已經實現了一個自定義的'LoadBalancingPolicy',它返回一個重複調用'TokenAware'策略迭代器的無限迭代器(隨時用完)。我將在明天進行測試,如果有效,我會接受這個答案。 –