【问题标题】:Couchbase RX Client - Merging multiple observables vs flatmapCouchbase RX 客户端 - 合并多个可观察对象与平面图
【发布时间】:2025-12-10 06:15:02
【问题描述】:

以下代码sn-ps的性能有什么区别?

用例:使用 Couchbase 反应式 SDK 从 Couchbase 检索多个键。

片段 #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();

第一个sn-p是根据CB的documentation.推荐的方式

此外,在最后,可观察对象被转换为阻塞对象, 但在那之前的一切,包括网络调用和 聚合,是完全异步发生的。

在 SDK 内部,这提供了更有效的资源利用 因为请求很快存储在内部请求中 RingBuffer 和 I/O 线程能够选择与 他们能。之后,无论服务器首先返回结果,它都是 存储在列表中,因此没有响应序列化 开。

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

【问题讨论】:

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


    【解决方案1】:

    这两个 sn-ps 之间应该没有性能差异,从 Couchbase SDK 和 RxJava 的角度来看,它们非常相似(因为 flatMap 基本上像你的密钥一样执行 mapObservables。 forEach,然后 merge 循环中的可观察对象)。

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

    【讨论】:

      【解决方案2】:

      flatMap 为每个键调用映射器函数,然后合并这些调用的结果。我不希望这种合并算法与merge 中使用的算法有任何不同。所以如果bucket.get()是非阻塞的,那么两者之间应该没有性能差异。

      片段 #1 对我来说更具可读性。

      【讨论】:

      • 同意,编辑第二个 sn-p 只是为了让问题更清楚。 RX 方面,我知道性能应该是相同的。我想知道在调用这两个示例时 SDK 如何管理其内部缓冲区和资源是否有所不同。
      • @shays10 相同的算法是指相同或非常相似的内部实现。因此在任何方面都应该没有差异。