0

我正在从 ES5.6 升级到 ES7。过去,我们克隆了 ES5 存储库并添加了自定义代码以使用指数退避重试。

public void doRetryWithExponentialBackoff(BasicCallback mainAttempt, ExceptionHandlingCallback onFailure) {
        int failure = 0;
        int maxFailure = 6;
        while (true) {
            try {
                mainAttempt.execute();
                return;
            } catch (RuntimeException mainException) {
                try {
                    failure += 1;
                    if (failure <= maxFailure) {
                        Thread.sleep(((int) Math.pow(2, failure)) * 1000);
                    } else {
                        onFailure.execute(mainException);
                        return;
                    }
                } catch (InterruptedException interruptedException) {
                    throw new RuntimeException(interruptedException);
                }
            }
        }
    }

然而,我们不想再做一次,但同时我在 ES7 中找不到任何这样的功能。您对实施重试策略有何建议?

我也在利用Pumba混沌测试和应用程序 ES 相关的测试失败了。例如,如果我终止 ES 容器,或者在响应时间中添加延迟,那么应用程序就会崩溃。通过指数退避,我也打算处理这些情况。

编辑:我正在使用 spring 数据框架来访问 ES7

4

1 回答 1

1

由于 ES 只是一个搜索引擎,不能期望它在服务器端提供重试功能。提供这样的支持可能会妨碍 ES 保持以预期方式运行的能力。

话虽如此,向 ES 客户端添加此类支持应该是可能的,因为执行重试的责任在于您的应用程序,并且 ES 引擎可以保持大规模运行并为所有传入请求提供服务。这正是 AWS 开发工具包客户端默认执行的操作。而且我的印象是,上面提供的代码是尝试在 ES 客户端之上创建一个包装器,IMO 也可以。

于 2021-07-06T22:45:07.170 回答