Cassandra, Java и MANY Async запрос: это хорошо? - PullRequest
0 голосов
/ 20 декабря 2018

Я разрабатываю приложение Java с Cassandra с моей таблицей:

id  | registration | name 
 1          1         xxx
 1          2         xxx
 1          3         xxx
 2          1         xxx
 2          2         xxx
...        ...        ...
...        ...        ...
100,000    34        xxx

В моих таблицах очень большое количество строк (более 50 000 000).У меня есть myListIds из String id для повторения.Я мог бы использовать:

SELECT * FROM table WHERE id IN (1,7,18, 34,...,)
//image more than 10,000,000 numbers in 'IN'

Но это плохой шаблон.Поэтому вместо этого я использую асинхронный запрос следующим образом:

    List<ResultSetFuture> futures = new ArrayList<>();
    Map<String, ResultSetFuture> map = new HashMap<>();
   // map : key = id & value = data from Cassandra

    for (String id : myListIds)
    {
        ResultSetFuture resultSetFuture = session.executeAsync(statement.bind(id));
        mapFutures.put(id, resultSetFuture);
    }

Затем я обработаю свои данные методом getUninterruptibly().

Вот мои проблемы: я делаю, возможно, больше, чем10 000 000 запросов Касандры (один запрос для каждого идентификатора).И я помещаю все эти результаты в карту.

Может ли это вызвать ошибку кучи памяти?Какой лучший способ справиться с этим?

Спасибо

Ответы [ 2 ]

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

Я вижу следующие проблемы с вашим кодом:

  1. Перегруженный кластер Cassandra, он не сможет обработать столько асинхронных запросов, и ваши запросы будут отклонены с NoHostAvailableException
  2. Перегруженный драйвер cassadra, ваше клиентское приложение не будет работать с исключениями ввода-вывода, поскольку система не сможет обработать так много асинхронных запросов (см. Подробности о настройке соединения https://docs.datastax.com/en/developer/java-driver/3.1/manual/pooling/)
  3. И да, проблемы с памятью возможны.Это зависит от размера данных

Возможным решением является ограничение количества асинхронных запросов и обработка данных кусками (например, см. этот ответ )

0 голосов
/ 20 декабря 2018

Примечание: ваш вопрос «это хороший шаблон проектирования».

Если вам нужно выполнить 10 000 000 запросов данных о кассандре, значит, вы неправильно структурировали свои данные.В конечном итоге вы должны разработать свою базу данных с нуля, чтобы вам когда-либо приходилось выполнять 1-2 выборки.

Теперь, если у вас есть 5000 узлов кассандры, это может не быть большой проблемой (вероятно, это все ещеесть) но все равно пахнет плохим дизайном базы данных.Я думаю, что решение состоит в том, чтобы взглянуть на вашу схему.

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