java - Couchbase RX 客户端 - 合并多个可观察量与平面图

标签 java performance rx-java couchbase couchbase-java-api

以下代码片段之间的性能差异是什么?

用例:使用 Couchbase 响应式(Reactive) SDK 从 Couchbase 检索多个 key 。

代码片段#1

 return Observable
            .from(keys)
            .flatMap(id ->
                    bucket.get(id, RawJsonDocument.class)
            )
            .toList()
            .toBlocking()
            .single();

代码片段#2

     List<Observable<RawJsonDocument>> list = new ArrayList<>();
     keys.forEach(key -> list.add(bucket.get(key, RawJsonDocument.class)));
     return Observable.merge(list)
            .toList()
            .toBlocking()
            .single();

第一个片段是根据 CB 的 documentation. 推荐的方式

Also, at the very end the observable is converted into a blocking one, but everything before that, including the network calls and the aggregation, is happening completely asynchronously.

Inside the SDK, this provides much more efficient resource utilization because the requests are very quickly stored in the internal Request RingBuffer and the I/O threads are able to pick batches as large as they can. Afterward, whatever server returns a result first it is stored in the list, so there is no serialization of responses going on.

第二个片段是我们今天在代码库中发现的一个案例,其中有一个 Observable 列表,其中每个 observable 都会触发 Bucket 的 get 方法,然后将它们全部合并。

最佳答案

这两个片段之间应该没有性能差异,从 Couchbase SDK 和 RxJava 的角度来看,它们非常相似(因为 flatMap 基本上做了一个 mapObservables,就像你的keys.forEach,然后合并循环中的observables)。

编辑:从个人角度来看,我仍然更喜欢第一种风格;)

关于java - Couchbase RX 客户端 - 合并多个可观察量与平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872368/

相关文章:

java - 如何在 DefaultComboBoxModel Java Swing 上设置项目 id 并显示文本?

java - UTF-8 和 UTF-16 的区别?

java - 如何以编程方式从 InfluxDb 中删除测量值?

mysql - 关系数据库架构设计: Versioning properties on a large scale

c++ - 通过指针访问如此昂贵吗?

android - 当 dao 设置为返回 Single<List<DummyObject>> 时,找不到符号返回 RxRoom.createSingle

java - 整理代码并修复错误(java)

php - 加速 CakePHP

android - 如何在 BehaviorSubject 中设置默认值

java - RxJava 在 Observable 中收集 AMPQ 事件并使用缓冲区订阅