У реагирующих клиентов Couchbase гарантируется порядок строк в представлении запроса

Я использую Couchbase Java SDK 2.2.6 с сервером Couchbase 4.1.

Я запрашиваю свое мнение с помощью следующего кода

public <T> List<T> findDocuments(ViewQuery query, String bucketAlias, Class<T> clazz) {
    // We specifically set reduce false and include docs to retrieve docs
    query.reduce(false).includeDocs();
    log.debug("Find all documents, query = {}", decode(query));
    return getBucket(bucketAlias)
            .query(query)
            .allRows()
            .stream()
            .map(row -> fromJsonDocument(row.document(), clazz))
            .collect(Collectors.toList());
}

private static <A> A fromJsonDocument(JsonDocument saved, Class<A> clazz) {
    log.debug("Retrieved json document -> {}", saved);
    A object = fromJson(saved.content(), clazz);
    return object;
}

В логах от fromJsonDocument Метод Я вижу, что строки не всегда сортируются по ключу строки. Обычно они есть, но иногда нет.

Если я просто запускаю этот запрос в графическом интерфейсе couchbase браузера, я всегда получаю результаты в ожидаемом порядке. Это ошибка или ожидается, что результаты запроса представления не сортируются при запросе с асинхронным клиентом? Каково поведение у разных клиентов, а не Java?

1 ответ

Решение

Это связано с асинхронным характером вашего вызова в клиенте Java + тем фактом, что вы использовали includeDocs,

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

Если поиск документа имеет небольшую задержку по сравнению с предыдущей строкой, он может изменить порядок передачи (строка + документ).

Но хорошие новости всем! E сть includeDocsOrdered альтернатива в ViewQuery принимает те же параметры, что и includeDocs но будет гарантировать, что AsyncViewRow прийти в том же порядке, возвращенном представлением.

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

Это довольно специфично для клиента Java, с его использованием RxJava, Я даже не уверен, что другие клиенты имеют представление о includeDocs...

Другие вопросы по тегам