使用 elasticsearch 7 实现指数退避重试的最佳方法
Best way to implement retry with exponential backoff with elasticsearch 7
我正在从 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
由于ES只是一个搜索引擎,不能指望在服务端提供重试功能。提供此类支持会妨碍 ES 以预期方式保持运行的能力。
话虽如此,向 ES 客户端添加此类支持应该是可能的,因为执行重试的责任在于您的应用程序,并且 ES 引擎可以继续大规模运行并为所有传入请求提供服务。这正是 AWS 开发工具包客户端默认执行的操作。我的印象是上面提供的代码是在 ES 客户端之上创建包装器的尝试,IMO 也很好。
我正在从 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
由于ES只是一个搜索引擎,不能指望在服务端提供重试功能。提供此类支持会妨碍 ES 以预期方式保持运行的能力。
话虽如此,向 ES 客户端添加此类支持应该是可能的,因为执行重试的责任在于您的应用程序,并且 ES 引擎可以继续大规模运行并为所有传入请求提供服务。这正是 AWS 开发工具包客户端默认执行的操作。我的印象是上面提供的代码是在 ES 客户端之上创建包装器的尝试,IMO 也很好。