Datastax Cassandra java 带分页的语句的驱动程序 RetryPolicy
Datastax Cassandra java driver RetryPolicy for Statement with paging
我是 运行 一个获取数百万行(5.000.000 左右)行的查询。我的节点似乎很忙,因为协调器 returns 出现 com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)
异常。 (我真的不知道节点是否忙或其他事情正在发生)。
到目前为止,我已经尝试在每个 Cassandra 节点中设置更高的 read_request_timeout_in_millis,并执行这样的查询
new SimpleStatement("SELECT * FROM where date = ? ",param1)
.setFetchSize(pageSize).setConsistencyLevel(ConsistencyLevel.ONE)
.setReadTimeoutMillis(ONE_DAY_IN_MILLIS);
ResultSet resultSet = this.session.execute(statement);
但是还是抛出异常。我的下一步是尝试自定义 RetryPolicy,但是 有人能告诉我 readTimeout 重试是会再次执行整个查询还是会从失败的当前页面重试?
我正在尝试这样的事情:
@Override
public RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
if (dataRetrieved) {
return RetryDecision.ignore();
} else if (nbRetry < readRetries) {
LOGGER.info("Retry attemp {} out of {} ",nbRetry,readRetries);
return RetryDecision.retry(cl);
} else {
return RetryDecision.rethrow();
}
}
其中 readReatries 是我将尝试获取数据的重试次数。
当您在查询驱动程序上使用提取大小时,永远不会预先发出整个查询。即使您没有指定获取大小,驱动程序也会使用 5000 作为获取大小,以防止内存中包含许多对象。正在发生的事情是,通过发出带有限制的查询来获取结果块,当您迭代结果时,当您到达块驱动程序的末尾时,将发出对以下结果数量的查询,依此类推。总而言之,如果结果数大于提取大小,则将从驱动程序向集群发出多个查询。可以在 official datastax driver page.
上看到漂亮的序列图以及其他解释
也就是说 RetryPolicy
适用于单个语句,并且对获取大小一无所知,因此该语句将重试您定义的次数(意味着只有该块会在超时时重试)。
我是 运行 一个获取数百万行(5.000.000 左右)行的查询。我的节点似乎很忙,因为协调器 returns 出现 com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)
异常。 (我真的不知道节点是否忙或其他事情正在发生)。
到目前为止,我已经尝试在每个 Cassandra 节点中设置更高的 read_request_timeout_in_millis,并执行这样的查询
new SimpleStatement("SELECT * FROM where date = ? ",param1)
.setFetchSize(pageSize).setConsistencyLevel(ConsistencyLevel.ONE)
.setReadTimeoutMillis(ONE_DAY_IN_MILLIS);
ResultSet resultSet = this.session.execute(statement);
但是还是抛出异常。我的下一步是尝试自定义 RetryPolicy,但是 有人能告诉我 readTimeout 重试是会再次执行整个查询还是会从失败的当前页面重试?
我正在尝试这样的事情:
@Override
public RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
if (dataRetrieved) {
return RetryDecision.ignore();
} else if (nbRetry < readRetries) {
LOGGER.info("Retry attemp {} out of {} ",nbRetry,readRetries);
return RetryDecision.retry(cl);
} else {
return RetryDecision.rethrow();
}
}
其中 readReatries 是我将尝试获取数据的重试次数。
当您在查询驱动程序上使用提取大小时,永远不会预先发出整个查询。即使您没有指定获取大小,驱动程序也会使用 5000 作为获取大小,以防止内存中包含许多对象。正在发生的事情是,通过发出带有限制的查询来获取结果块,当您迭代结果时,当您到达块驱动程序的末尾时,将发出对以下结果数量的查询,依此类推。总而言之,如果结果数大于提取大小,则将从驱动程序向集群发出多个查询。可以在 official datastax driver page.
上看到漂亮的序列图以及其他解释也就是说 RetryPolicy
适用于单个语句,并且对获取大小一无所知,因此该语句将重试您定义的次数(意味着只有该块会在超时时重试)。