2017-09-18 81 views
-1

我有一個C#WebAPI項目,我正在使用NEST連接到本地ElasticSearch數據庫。 WebAPI和ElasticSearch作爲兩個獨立的Windows服務運行。我注意到的一個問題是ES服務必須在WebAPI之前先啓動,否則WebAPI可能無法嘗試初始化不可用的數據庫。等待ElasticSearch啓動並運行

該問題已通過在Windows服務選項中實施依賴性部分解決,因此Windows將首先啓動ES,然後再啓動WebAPI。問題並沒有完全消失,因爲在實際準備之前ES可能需要很長時間,WebAPI服務可能會失敗。

是否有任何選項/超時/重試我可以在NEST庫上設置爲在發出第一個請求到數據庫之前等待?我是否需要去DIY並編寫我自己的重試循環?

+0

您是否已將WebAPI啓動類型配置爲'自動(延遲啓動)'? – mjwills

+0

是的,它也有一個依賴項集(標籤「服務屬性下的依賴關係」) –

+0

我正在要求一個API或NEST庫中的東西 –

回答

3

沒有什麼內置的解決方法,但你可能會使用像Polly這樣的重試策略來解決你的問題。

Policy 
    .Handle<YourNESTExceptionHere>() 
    .WaitAndRetryForever(retryAttempt => TimeSpan.FromSeconds(1)); 
    .Execute(() => 
    { 
     // code that raises the exception 
    }); 

這將不斷嘗試運行代碼,每次嘗試之間等待1秒,直到它完成而不引發異常。顯然,您可以將重試之間的時間更改爲您場景中有意義的內容。這將基本上繞過你的Elasticsearch集羣的問題,因爲它不能立即通過吞吐異常並且只是重試直到它結束。

還有其他政策Polly規定您也可以使用。例如,您可能需要使用斷路器,因此如果服務出現問題或者出現問題,它將最終退出並停止一段時間的進一步嘗試,從而阻止它繼續工作。你應該閱讀波莉的自述並理解你的不同選擇。總而言之,你只需要一些方法來捕捉異常並重試。