2017-02-13 3 views
1

Возможно ли начать разбивку на страницы из заданного или случайного положения?Cassandra pagination: начать с заданной/случайной позиции?

Зачем мне это нужно?

На моих производственных узлах у меня есть пара параллельных сервисных заданий, которые повторяют около 200 000 000 элементов и обновляют информацию для них. Новые версии программного обеспечения часто переносятся на серверы и с каждым нажатием возобновляются служебные задания. Поэтому все задания начинаются снова и снова. Конечно, я использую блокировки, но было бы лучше, если бы я мог инструктировать эти параллельные задания для начала с разных страниц.

ответ

3

поискового вызова осуществляется с помощью Apache Cassandra и драйверов клиентов путем передачи в pagingState, как описано в разделе 8 native protocol specification:

Однако, если некоторые результаты не являются частью первой реакции, то Has_more_pages флаг будет установлен, и результат будет содержать значение paging_state. В этом случае paging_state значение следует использовать в QUERY или EXECUTE сообщение (то есть запрос же как оригинал одного или поведение не определено), чтобы получить следующую страницу результатов .

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

Это может быть достигнуто с помощью Java-драйвер DataStax, как описано в руководстве на странице «оповещение по громкой связи» под 'Saving and Reusing the paging state' разделом:

Драйвер выставляет объект PagingState, который представляет, где мы были в результате устанавливается, когда последняя страница была принесла:

ResultSet resultSet = session.execute("your query"); 
// iterate the result set... 
PagingState pagingState = resultSet.getExecutionInfo().getPagingState(); 

Этот объект может быть сериализовать в строку или массив байтов:

String string = pagingState.toString(); 
byte[] bytes = pagingState.toBytes(); 

Это последовательную форму можно сохранить в той или иной форме постоянного хранения для повторного использования позже. В нашем примере веб-службы мы, вероятно, сохраним версию строки в качестве параметра запроса в URL-адрес следующей страницы (http://myservice.com/results?page= < ...>). Когда это значение извлекается позже, мы можем десериализации его и инжектируем его в своем заявлении:

PagingState pagingState = PagingState.fromString(string); 
Statement st = new SimpleStatement("your query"); 
st.setPagingState(pagingState); 
ResultSet rs = session.execute(st); 

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

+0

вот оно, спасибо – Michal

Смежные вопросы