Cassandra не ждет, пока узлы будут доступны

#java #cassandra #datastax-java-driver

#java #кассандра #datastax-java-driver

Вопрос:

Я использую драйвер datastax для Java:

 @Dao
public interface MyDao {
    @Insert
    CompletableFuture<Void> save(MyEntity entity);
    ...
}

public class MyDaoTests {
    
    @Test
    public void myTest() {
    ...
    List<CompletableFuture<Void>> futureList = myEntityList.parallelStream()
             .map((myEntity) -> meterDataMapper.myDao().save(myEntity))
             .collect(Collectors.toList());
    CompletableFuture.allOf(futureList.toArray(CompletableFuture[]::new)).join();
    ...
   }
}
 

Когда я выполняю тест, я получаю эту ошибку:
java.util.concurrent.CompletionException: com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query

Есть ли способ настроить драйвер / сеанс на ожидание доступных узлов?

Дополнительная информация:

  • Размер моего теста составляет около 2500000 объектов ( myEntityList ).
  • Синхронные вставки работают нормально, но они слишком медленные.
  • Я хочу решить эту проблему с помощью картографа datastax-java-driver, основанного на аннотациях, как можно проще.
  • Версия драйвера: 4.9.0

Комментарии:

1. похоже, у вас есть проект spring boot, не могли бы вы поделиться им на github? и раньше у меня не было доступного исключения узла, и я решил его, настроив регулирование docs.datastax.com/en/developer/java-driver/4.9/manual/core /… пользуетесь ли вы им?

Ответ №1:

NoNodeAvailableException Возвращается, когда драйвер пометил все узлы как отключенные или не отвечающие, или когда точки контакта недействительны (в вашем случае это маловероятно).

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

Просмотрите журналы на узлах, чтобы узнать, почему они не отвечают. Если вы видите длительные паузы GC и / или пропущенные чтения / мутации, это признак того, что узлы перегружены. Если вы выполняете нагрузочный тест, рассмотрите возможность уменьшения пропускной способности, чтобы не перегружать ваш кластер. Приветствия!

Комментарии:

1. Когда я ограничиваю одновременные запросы до 255, это работает без исключений. Если я дойду до 256, эти исключения появятся снова. Мне нужно знать, откуда берется это число, и мне интересно, почему клиент не дросселирует сам по себе.

2. Я создал проект github , в котором показана проблема. Если вы установите max-concurrent-requests = 1024, все в порядке. Если вы установите его обратно на 1025, появятся исключения NoNodeAvailableExceptions. (Я тестировал это 5 раз с каждым значением). Также я не вижу никаких проблем в журналах. Gc.log.0 показывает «общее время, в течение которого потоки приложений были остановлены», не более 0,1 секунды.