等待 ElasticSearch 启动 运行

Wait for ElasticSearch to be up and running

我有一个 C# WebAPI 项目,我正在使用 NEST 连接到本地 ElasticSearch 数据库。 WebAPI 和 ElasticSearch 运行 作为两个独立的 Windows 服务。我注意到的一个问题是 ES 服务必须先启动,然后再启动 WebAPI,否则 WebAPI 可能无法尝试初始化不可用的数据库。

通过在 Windows 服务选项中强制执行依赖关系,问题已部分解决,因此 Windows 将首先启动 ES,然后是 WebAPI。这个问题并没有完全消失,因为 ES 可能需要很长时间才能真正准备好,而且 WebAPI 服务可能无论如何都会失败。

是否有任何 option/timeout/retry 我可以在 NEST 库上设置为在向数据库发出第一个请求之前等待?我是否需要自己动手编写重试循环代码?

没有内置的东西可以解决这个问题,但您可以使用 Polly 之类的东西及其重试策略来解决您的问题。

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

这将不断尝试 运行 代码,每次尝试之间等待 1 秒,直到它完成而不引发异常。显然,您可以将重试之间的时间更改为在您的场景中有意义的任何时间。通过吞下异常并重试直到它启动,这基本上可以解决 Elasticsearch 集群无法立即可用的问题。

Polly 还提供了其他策略供您使用。例如,您可能想要使用断路器,这样它最终会退出并在一段时间内停止进一步的尝试,如果服务出现问题或类似问题,从而阻止它继续工作。您应该阅读 Polly 自述文件并了解您的不同选择。总之,您只需要一些方法来捕获异常并重试。