如何使用批量获取从couchbase获取有序结果

如何使用批量获取从couchbase获取有序结果,couchbase,rx-java,couchbase-view,Couchbase,Rx Java,Couchbase View,我试图通过使用异步GET来提高查询couchbase视图的性能。 我已经阅读了他们关于正确方法的文档,内容如下: Cluster cluster = CouchbaseCluster.create(); Bucket bucket = cluster.openBucket(); List<JsonDocument> foundDocs = Observable .just("key1", "key2", "key3", "key4", "key5") .flatMap(new F

我试图通过使用异步GET来提高查询couchbase视图的性能。 我已经阅读了他们关于正确方法的文档,内容如下:

Cluster cluster = CouchbaseCluster.create();
Bucket bucket = cluster.openBucket();


List<JsonDocument> foundDocs = Observable
.just("key1", "key2", "key3", "key4", "key5")
.flatMap(new Func1<String, Observable<JsonDocument>>() {
    @Override
    public Observable<JsonDocument> call(String id) {
        return bucket.async().get(id);
    }
})
.toList()
.toBlocking()
.single();
Cluster Cluster=CouchbaseCluster.create();
Bucket=cluster.openBucket();
列表foundDocs=可观察
.just(“键1”、“键2”、“键3”、“键4”、“键5”)
.flatMap(新函数1(){
@凌驾
公共可观察调用(字符串id){
返回bucket.async().get(id);
}
})
托利斯先生()
.toBlocking()
.single();
它工作得又快又好,但是因为我依赖于结果的顺序,所以我似乎需要做一些额外的工作来保持结果的顺序。 在上面的示例中,JsonDocument列表包含所有5个文档,但顺序在调用之间随机变化。 使用JavaRx功能或couchbase Java SDK功能,是否有任何优雅的方式来排序结果


我能想到的唯一解决方案是将结果保存到HashMap中,然后使用此HashMap将原始ID列表转换为JsonDocuments的有序列表。

我将使用Zip运算符将所有可观察对象压缩,然后在它们完成后将文档结果添加到列表中

   @Test
public void zipObservables() {
    Observable<String> oKey1 = Observable.just("key1").doOnNext(getDocument());
    Observable<String> oKey2 = Observable.just("key2").doOnNext(getDocument());
    Observable<String> oKey3 = Observable.just("key3").doOnNext(getDocument());
    Observable<String> oKey4 = Observable.just("key4").doOnNext(getDocument());

    List<Observable<String>> observables = Arrays.asList(oKey1,oKey2,oKey3,oKey4);
    List<Object> foundDocs = Observable.zip(observables, Arrays::asList)
            .toBlocking()
            .single();
}

private Action1<String> getDocument() {
    return id -> bucket.async().get(id);
}
@测试
public void zipObservables(){
OKEBSABLE oKey1=可观察的.just(“key1”).doOnNext(getDocument());
OKEBSABLE oKey2=可观测的.just(“key2”).doOnNext(getDocument());
Okebservable oKey3=可观察的.just(“key3”).doOnNext(getDocument());
Okebservable oKey4=可观察的.just(“key4”).doOnNext(getDocument());
List observables=Arrays.asList(oKey1,oKey2,oKey3,oKey4);
List foundDocs=Observable.zip(Observable,array::asList)
.toBlocking()
.single();
}
私有操作1 getDocument(){
返回id->bucket.async().get(id);
}

您可以在这里看到更多的Zip示例,而不是
flatMap
,您可以使用:

  • concatMap
    :将保留顺序,但实际上要等待每个内部
    GET
    完成,然后再触发下一个(可能会恢复为顺序执行,性能会降低)
  • concatmapanger
    :将立即订阅内部可观察对象(因此触发内部
    GET
    )。通过缓冲无序到达的响应来维持顺序,直到它们可以在序列中的正确索引处重放。在订购和性能方面,两者都是最好的

它可能会起作用,但键是作为输入列表提供的,因此键的数量可能会发生变化,因此对于我的特定问题,它不会起作用。您可以将集合传递给Zip操作员,因此您应该对此很在行。检查我的示例中的更新仍然,它引用了4个键。您能否将方法更改为zipObservables(列表键)并仍然按照您的建议返回结果?这是一个关于如何将集合传递给zip的示例。显然,集合将由您动态提供N个可观察对象。在StackOverflow中,我们将向您介绍如何执行此操作。请避免复制/粘贴,这真的很糟糕;)不管怎样,看起来concatMap比zip更适合我的需要。谢谢有什么理由选择concatMap而不是concatMapEager吗?内部GET执行的顺序并不重要,但是返回列表的顺序应该与输入列表匹配。ConcatMap没有缓冲区,如果所有响应的顺序相反,并且执行大量GET,缓冲区可能会变得很大。这将是内存开销。除此之外,不太好