使用反应式Couchbase Java驱动程序进行批处理

时间:2020-02-26 18:29:47

标签: reactive-programming couchbase

假设我有一个存储桶,需要从该存储桶中获取日期早于现在的文档。 该文档如下所示:

{
id: "1",
date: "Some date",
otherObjectKEY: "key1"
}

对于每个文档,我需要使用其 otherObjectKEY 获取另一个文档,将后者发送给kafka主题,然后删除原始文档。

使用反应性Java驱动程序3.0 ,我可以通过以下方式做到这一点:

public void batch(){
    streamOriginalObjects()
         .flatMap(originalObject -> fetchOtherObjectUsingItsKEY(originalObject)
                       .flatMap(otherObject -> sendToKafkaAndDeleteOriginalObject(originalObject))
         )
         .subscribe();
}

streamOriginalObjects():

public Flux<OriginalObject> streamOriginalObjects(){
        return client.query("select ... and date <= '"+ LocalDateTime.now().toString() +"'")
                .flux()
                .flatMap(result -> result.rowsAs(OriginalObject.class));
    }

它的工作原理与预期的一样,但是我想知道是否有比逐流处理每个元素更好的方法(特别是在性能方面)。

1 个答案:

答案 0 :(得分:2)

执行N1QL查询,然后从中散出键值操作是一种有用且常见的模式。这应该使扇出并行发生:

    streamOriginalObjects()
        // Split into numberOfThreads 'rails'
        .parallel(numberOfThreads)

        // Run on an unlimited thread pool
        .runOn(Schedulers.elastic())

        .concatMap(originalObject -> fetchOtherObjectUsingItsKEY(originalObject)
            .concatMap(otherObject -> sendToKafkaAndDeleteOriginalObject(originalObject))
        )

        // Back out of parallel mode
        .sequential()
        .subscribe();