В чем заключается преимущество / недостаток каждого способа обновления большого количества документов в Couchbase, Java SDK?
Иногда мне нужно обновить много документов одновременно, 10 КБ или даже больше, и я думаю, что является преимуществом / недостатком в каждом случае?
Я думал о двух способах сделать это, и я буду рад понять, что является преимуществом / недостатком, и услышать о третьем пути.
Я ищу хороший пакетный способ сделать это.
Способ 1, отправьте в наблюдаемую, чтобы получить все документы и выполнить работу:
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, запустите каждый идентификатор документа и используйте 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();
}
1 ответ
Для этого может потребоваться небольшой тест производительности, но я думаю, что оба подхода хороши и должны быть относительно близки по производительности.
С помощью bucket.async()
в обоих случаях убедитесь, что внутренние запросы будут быстро поставлены в очередь в ringBuffer и отправлены на сервер.
Третий способ был бы аналогичен варианту 2, но с блокирующим API, и он определенно работал бы хуже.
В общем, вариант 1 является чисто Rx и, хотя в Observable.from
, возможно, это обеспечивает наиболее последовательную читабельность, поэтому я бы использовал этот. Кроме того, вы получаете один поток и подписку, поэтому вы платите только один раз.