我有一个C#WebAPI项目,我正在使用NEST连接到本地ElasticSearch数据库。 WebAPI和ElasticSearch作为两个单独的Windows服务运行。我注意到的一个问题是ES服务必须先在WebAPI之前启动,否则WebAPI可能无法尝试初始化不可用的数据库。
通过在Windows服务选项中强制执行依赖项已部分解决了该问题,因此Windows将首先启动ES,然后启动WebAPI。问题并没有完全消失,因为ES在实际准备之前可能需要很长时间,而且WebAPI服务可能无论如何都会失败。
是否有任何选项/超时/重试我可以在NEST库上设置为在向数据库发出第一个请求之前等待?我是否需要DIY并编写自己的重试循环?
答案 0 :(得分:3)
没有任何内置功能可以解决此问题,但您可以使用Polly之类的内容及其重试政策来解决您的问题。
Policy
.Handle<YourNESTExceptionHere>()
.WaitAndRetryForever(retryAttempt => TimeSpan.FromSeconds(1));
.Execute(() =>
{
// code that raises the exception
});
这将不断尝试运行代码,在每次尝试之间等待1秒,直到完成而不引发异常。显然,您可以将重试之间的时间更改为您的方案中有意义的时间。这将基本上绕过你的Elasticsearch集群的问题,不能通过吞下异常立即可用,只是重试直到它出现。
Polly提供的其他政策也可以使用。例如,您可能想要使用断路器,因此如果服务出现问题或导致其无法正常工作,它最终将退出并停止一段时间的进一步尝试。你应该阅读Polly自述文件,了解你的不同选择。无论长短,你只需要一些方法来捕捉异常并重试。