Cassandra DriverTimeoutException при использовании нумерации страницJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Cassandra DriverTimeoutException при использовании нумерации страниц

Сообщение Anonymous »

У меня есть приложение, которое читает из 4 таблиц Cassandra, 4 таблицы находятся в разных кластерах, и я делаю 4 сеанса через Java-драйвер datastax

Код: Выделить всё

        
com.datastax.oss
java-driver-core
4.17.0

Я выполняю выборку одной строки (точечные запросы) в первой таблице и использую нумерацию страниц в трех других таблицах. Результат запроса, сделанного ко второй таблице, используется в запросе к 3-й и 4-й таблицам.
Первичный ключ таблицы 4 — (id, store)
store — это кластеризация key и id — ключ раздела.
Из таблицы 3 получена группа хранилищ.
Детали сеанса Cassandra для 4-го кластера — < /p>

Код: Выделить всё

DriverConfigLoader.programmaticBuilder()
.withLong(DefaultDriverOption.REQUEST_PAGE_SIZE, 1000)
.withLong(DefaultDriverOption.CONNECTION_POOL_LOCAL_SIZE, 4)
.withLong(DefaultDriverOption.CONNECTION_MAX_REQUESTS, 8192)
.withBoolean(DefaultDriverOption.SOCKET_KEEP_ALIVE, true)
.withBoolean(DefaultDriverOption.SOCKET_REUSE_ADDRESS, true)
.withBoolean(DefaultDriverOption.METADATA_SCHEMA_ENABLED, false)
.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(30))
.withString(DefaultDriverOption.REQUEST_CONSISTENCY, DefaultConsistencyLevel.LOCAL_ONE.toString())
.build();
Код 4-й таблицы выглядит так:

Код: Выделить всё

return cqlSession.executeAsync(ps.bind(id))
.thenCompose(rs -> {
Map finalMap = new HashMap();
return processRows(rs, finalMap, listedStores, limoEligStartTime);
})
.exceptionally(ex -> {

// do something, record metrics
return Collections.emptyMap();
`           });
функцияprocessRows выглядит так

Код: Выделить всё

private CompletionStage processRows(AsyncResultSet rs, Map finalMap, Set thirdTableResult, long resultGetTime) {
METRICS.recordExecutionTime("LimoEligibilityQueryTime", System.currentTimeMillis() - resultGetTime);
Iterable iterable = rs.currentPage();
for (Row row : iterable) {
try {
if (row != null) {
// do something
} else {
//record metrics for row not found
}
} catch (IOException ex) {
//record exception
}
}
if (rs.hasMorePages()) {

return rs.fetchNextPage()
.thenCompose(asyncRs -> processRows(rs, finalMap, thirdTableResult, limoEligRowsProcessingCompletionTime))
.exceptionally(ex -> {

// record exception
return Collections.emptyMap();
});
} else {
return CompletableFuture.completedFuture(finalMap);
}
}
Это возвращает следующее исключение:

Код: Выделить всё

Exception occurred in table future - java.util.concurrent.CompletionException: com.datastax.oss.driver.api.core.DriverTimeoutException: 
Я пробовал настроить размер страницы, но это не помогло. Таблицы 3 и 4 запрашиваются параллельно. И я использую нумерацию страниц в таблице 2,3,4.
В таблице 4 я сталкиваюсь с проблемами с запросами.
Может ли быть возможно, что Возможно, истекло время ожидания драйвера, поскольку запрос к двум разным кластерам выполняется одновременно?
Попробовал следующее, но ничего не помогло
Настроить размер страницы — со 100 до 1000
Увеличить количество соединений на хост — 4
Максимальный запрос на соединение — от 2048 до 8192
Когда я использую выборку одной строки из таблицы 4, используя результаты таблицы 3 (из В таблице 3 получена куча хранилищ), запрос работает совершенно нормально, и я не получаю никаких исключений, но это увеличивает пропускную способность чтения в кластере cassandra (а это не то, что нам нужно)

Подробнее здесь: https://stackoverflow.com/questions/788 ... pagination
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»