我有时需要一次更新多个文档,10K甚至更多,我想的是各方面的优势/劣势是什么?
我想到了两种方法,我很乐意了解什么是优势/劣势,并在第三种方式上听到。
我正在寻找一个很好的批处理方式来做到这一点。
方式1,发送到observable以获取所有文档并完成工作:
Observable
.from(ids)
.flatMap(new Func1<String, Observable<JsonDocument>>() {
@Override
public Observable<JsonDocument> call(String id) {
return bucket.async().get(id);
}
})
.map(new Func1<JsonDocument, JsonDocument>() {
@Override
public JsonDocument call(JsonDocument original) {
// do some change in the document content
original.content().put("add", "content");
return original;
}
})
.flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
@Override
public Observable<JsonDocument> call(JsonDocument modified) {
return bucket.async().replace(modified);
}
}).subscribe();
方式2,运行每个文档id并使用async get然后以异步方式更改文档:
for (String id : ids){
bucket.async()
.get(id)
.map(new Func1<JsonDocument, JsonDocument>() {
@Override
public JsonDocument call(JsonDocument jsonDocument) {
// do some change in the document content
jsonDocument.content().put("add", "content");
return jsonDocument;
}
})
.flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
@Override
public Observable<JsonDocument> call(JsonDocument modified) {
return bucket.async().replace(modified);
}
}).subscribe();
}
答案 0 :(得分:1)
这可能会使用一点点基准测试,但我认为这两种方法都很好,而且性能应该相对接近。
在两种情况下都使用bucket.async()
确保在内部,请求将在ringBuffer中快速排队并激发到服务器。
第三种方式与选项2类似,但使用阻止API,这肯定会更糟糕。
总而言之,选项1纯粹是Rx,虽然Observable.from
可能会出现一点点开销,但它可能提供最连贯的可读性,因此我会使用这个。此外,您还可以获得单个流和订阅,因此您只需支付一次流量。