[英]Datastax Java Driver Custom Retry Policy
我编写了一个自定义重试策略类,我可以在其中传递没有重试驱动程序将执行 onWriteTimeout/onUnavilable/onReadTimeout。
public class CustomRetryPolicy implements RetryPolicy {
private static final Logger LOG = LoggerFactory.getLogger(CustomRetryPolicy.class);
@VisibleForTesting
public static final String RETRYING_ON_READ_TIMEOUT =
"[{}] Retrying on read timeout on same host (consistency: {}, required responses: {}, "
+ "received responses: {}, data retrieved: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_WRITE_TIMEOUT =
"[{}] Retrying on write timeout on same host (consistency: {}, write type: {}, "
+ "required acknowledgments: {}, received acknowledgments: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_UNAVAILABLE =
"[{}] Retrying on unavailable exception on next host (consistency: {}, "
+ "required replica: {}, alive replica: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_ABORTED =
"[{}] Retrying on aborted request on next host (retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_ERROR =
"[{}] Retrying on node error on next host (retries: {})";
private static final String LOG_PREFIX = "DATASTORE-CASSANDRA";
private final int readAttempts;
private final int writeAttempts;
private final int unavailableAttempts;
public CustomRetryPolicy(int readAttempts, int writeAttempts, int unavailableAttempts) {
this.readAttempts = readAttempts;
this.writeAttempts = writeAttempts;
this.unavailableAttempts = unavailableAttempts;
}
@Override
public RetryDecision onReadTimeout(Request request, ConsistencyLevel cl, int blockFor,
int received, boolean dataPresent, int retryCount) {
RetryDecision decision = (retryCount < readAttempts && received >= blockFor && !dataPresent)
? RetryDecision.RETRY_SAME
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_SAME && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_READ_TIMEOUT, LOG_PREFIX, cl, blockFor, received, false, retryCount);
}
return decision;
}
@Override
public RetryDecision onWriteTimeout(Request request, ConsistencyLevel cl, WriteType writeType,
int blockFor, int received, int retryCount) {
RetryDecision decision = (retryCount < writeAttempts && writeType == DefaultWriteType.BATCH_LOG)
? RetryDecision.RETRY_SAME
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_SAME && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_WRITE_TIMEOUT, LOG_PREFIX, cl, writeType, blockFor, received,
retryCount);
}
return decision;
}
@Override
public RetryDecision onUnavailable(Request request, ConsistencyLevel cl, int required, int alive,
int retryCount) {
RetryDecision decision =
(retryCount < unavailableAttempts) ? RetryDecision.RETRY_NEXT : RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_UNAVAILABLE, LOG_PREFIX, cl, required, alive, retryCount);
}
return decision;
}
@Override
public RetryDecision onRequestAborted(Request request, Throwable error, int retryCount) {
RetryDecision decision =
(error instanceof ClosedConnectionException || error instanceof HeartbeatException)
? RetryDecision.RETRY_NEXT
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_ABORTED, LOG_PREFIX, retryCount, error);
}
return decision;
}
@Override
public RetryDecision onErrorResponse(Request request, CoordinatorException error,
int retryCount) {
RetryDecision decision =
(error instanceof ReadFailureException || error instanceof WriteFailureException)
? RetryDecision.RETHROW
: RetryDecision.RETRY_NEXT;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_ERROR, LOG_PREFIX, retryCount, error);
}
return decision;
}
@Override
public void close() {
// Nothing to do
}
}
我正在使用 datastax java 驱动程序 4.6.0。 但问题是我不能用 CQLSessionBuilder 传递这个类的对象,这可以通过像
RetryPolicy rc = new CustomRetryPolicy(3, 3, 2);
Cluster cluster = Cluster.builder().addContactPoint("192.168.0.0").withRetryPolicy(rc).build();
在旧版本的驱动程序中。 我已经尝试过 DriverConfigLoader,但只有选项可以传递自定义类名。
你能建议吗。
如果您查看DefaultRetryPolicy 的实现和CustomRetryPolicy 的示例,您将看到两者都接收 2 个参数: DriverContext
类型的context
和带有配置文件名称的字符串。 然后您应该能够使用context
通过getConfig
调用获取DriverConfig
,然后在 config 上使用getProfile
来提取自定义策略所需的配置值 - 您可以将自己的配置值放入配置文件并在重试中使用它政策,是这样的:
datastax-java-driver {
advanced.retry-policy {
class = DefaultRetryPolicy
}
profiles {
custom-retries {
advanced.retry-policy {
class = CustomRetryPolicy
custom-policy {
read-attempts = 3
write-attempts = 2
...
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.