Когда подкачка драйвера драйвера datastax дает меньше страниц, чем запрошено? - PullRequest
2 голосов
/ 21 июня 2019

Я пытаюсь использовать подкачку datastax-драйвера с помощью fetch-size.Однако в документации dasastax сказано следующее:

Обратите внимание, что установка размера выборки не означает, что Cassandra всегда будет возвращать точное количество строк, возможно, она возвращает чуть более или менее результаты

Не знаете внутренние детали реализации подкачки, но кто-то может уточнить, в какой ситуации мы получаем больше или меньше результатов с сервера?Например, если я установлю размер выборки равным 10, на основе приведенного выше оператора можно получить 8 или 12 строк в результате.Но я пытаюсь понять, в какой ситуации мы получим 8 (или 12) строк?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Обратите внимание, что установка размера выборки не означает, что Cassandra всегда будет возвращать точное количество строк, возможно, она возвращает чуть более или менее результаты

Яне уверен, что это утверждение полностью верно.Вы можете ожидать, что страница может содержать меньше, чем желаемый размер страницы.Например, если размер вашей страницы равен 10, и только 8 строк соответствуют вашим критериям запроса, конечно, вы получите только 8 строк назад.

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

Если для result_page_size задано положительное значение, результирующий набор сообщения RESULT, возвращаемого для запроса, будет содержать не более result_page_size первых строк результата запроса.

Кроме того, в спецификации протокола также говорится:

Несмотря на то, что текущая реализация всегда учитывает точное значение result_page_size , мы оставляем за собой право возвращать чуть меньшие или большие страницы в будущем по соображениям производительности.

Я не думаю, что это было осуществлено, но может объяснить, почему документация для водителя так сформулирована.

2 голосов
/ 23 июня 2019

Ответ Энди довольно полный, но я хочу добавить еще несколько соображений по поводу , почему возврат страниц не совсем нужного размера может быть полезен - в текущих или будущих реализациях:

Одной из причин, по которой Кассандра может захотеть вернуть короткие страницы, является фильтрация. Представьте, что запрос имеет разрешение ALL FILTERING, и ему нужно прочитать много данных с диска, чтобы получить несколько строк, которые в итоге проходят фильтр и возвращаются клиенту. Клиент, не подозревая об этом, запросил страницу из 1000 строк - но в нашем примере, возможно, на самом деле создание 1000 строк, проходящих фильтр, заняло бы 10 секунд, и клиент мог бы отключиться, если Кассандра подождет 10 секунд, прежде чем получить какие-либо результаты. Поэтому в этом случае Cassandra должна просто вернуть все строки, которые ей удалось собрать, до истечения времени ожидания - даже если это всего 17 строк, а не 1000 строк. Клиент получит эти 17 строк и перейдет на следующую страницу в обычном режиме.

В крайнем случае, может быть так много работы по фильтрации с таким небольшим выводом, что мы можем иметь длительное время даже без вывода в одну строку. В этом случае перед тайм-аутом Cassandra может вернуть страницу с нулевыми результатами, на которой установлен бит has_more, что означает, что клиент должен продолжить пейджинг (количество результатов меньше запрошенного - или даже ноль - не является признаком того, когда прекрати пейджинг!) Я не уверен, что Cassandra на самом деле возвращает страницы с нулевой строкой сегодня, но Scylla (более быстрый клон Cassandra) определенно это делает, и драйверы должны не забывать использовать бит has_more как единственный признак того, когда нужно прекратить пейджинг.

Другой вопрос заключается в том, почему подкачка вернула бы на больше строк, чем нужно. Как Энди сказал в своем ответе, я не думаю, что это на самом деле происходит ни в Кассандре, ни в Сцилле. Но я могу понять, почему какая-то будущая реализация может захотеть, чтобы это произошло: представьте, что координатору требуется 1000 строк для страницы. Таким образом, он читает до 1000 строк из каждой реплики, но есть противоречивые данные, и у одной реплики есть дополнительная строка, и в результате у координатора теперь есть 1001 строка для возврата. Он может (и сегодня это делает) возвращать только первые 1000 строк, но недостатком является то, что теперь некоторые реплики находятся в неправильном месте в данных и должны будут переопределить свое место, когда их попросят прочитать следующую страницу. Если бы мы вернули все 1001 найденную строку, все реплики смогли бы эффективно возобновить чтение с того места, где они остановились.

...