Кассандра, выбрасывающая исключение WriteTimeout без Thread.sleep - PullRequest
0 голосов
/ 15 января 2019

У меня есть пакетная работа, записывающая около 300 000 строк в кассандру. Я делю их на более мелкие партии, размер которых составляет 50 строк каждая.

Псевдокод ниже.

@Override
public void executeQuery(List<BatchStatement> batches) {
    List<ResultSetFuture> futures = List.of();
    for (BatchStatement batch: batches) {
        futures.add(session.executeAsync(batch));
    }

    for(ResultSetFuture rsf: futures) {
        rsf.getUninterruptibly();
        /* I have to add the following code to avoid WriteTimeoutException
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            logger.error("Thread.sleep", e);
        }
        */

    }
}

Я не знаю, почему без Thread.sleep он всегда дает исключение WriteTimeout. Как этого избежать?

1 Ответ

0 голосов
/ 15 января 2019

Используя пакетный оператор для данных (которые, скорее всего, принадлежат разным разделам), вы действительно перегружаете свою систему, потому что координирующему узлу необходимо отправлять запросы другим узлам и ждать ответа. Пакеты необходимо использовать только для конкретных случаев использования, а не так, как вы использовали их в реляционных базах данных - для ускорения выполнения. Эта документация описывает неправильное использование пакетов.

Отправка отдельных асинхронных запросов для каждой строки улучшит ситуацию, но вы должны позаботиться о том, чтобы вы не отправляли слишком много запросов одновременно (используя семафор) и увеличивая число запросов в полете на подключение через параметры пула .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...