假设我有一个存储桶,需要从该存储桶中获取日期早于现在的文档。 该文档如下所示:
{
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));
}
它的工作原理与预期的一样,但是我想知道是否有比逐流处理每个元素更好的方法(特别是在性能方面)。
答案 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();