В чем заключается преимущество / недостаток каждого способа обновления большого количества документов в 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, возможно, это обеспечивает наиболее последовательную читабельность, поэтому я бы использовал этот. Кроме того, вы получаете один поток и подписку, поэтому вы платите только один раз.

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