如何在Reactor 3中跨多个发布者排队工作?

时间:2018-10-16 15:07:23

标签: project-reactor

我正在创建一个库,用于使用Reactor 3创建数据处理工作流。每个任务都有一个输入流量和一个输出流量。输入通量由用户提供。输出通量由库创建。可以链接任务以形成DAG。像这样:(在科特林)

val base64 = task<String, String>("base64") {
    input { Flux.just("a", "b", "c", "d", "e") }
    outputFn { ... get the output values ... }
    scriptFn { ... do some stuff ... }
}

val step2 = task<List<String>, String>("step2") {
    input { base64.output.buffer(3) }
    outputFn { ... }
    scriptFn { ... }
}

我需要限制整个工作流程的并发性。一次只能配置数量的输入。在上面的示例中,限制为3,这意味着任务base64将首先使用输入“ a”,“ b”和“ c”运行,然后等待每个输入完成,然后再处理“ d”,“ e”和“ step2”任务。

从输入磁通创建输出磁通时,如何应用此类限制?可以以某种方式应用TopicProcessor吗?也许某种定制的调度程序或处理器?背压将如何工作?我是否需要担心创建缓冲区?

1 个答案:

答案 0 :(得分:0)

背压从最后的表皮向上传播到整个链。但是,链中的操作员可以提前请求数据(预取),甚至“重写”请求。例如,在buffer(3)的情况下,如果该运算符接收到request(1),它将在上游执行request(3)(“ 1个缓冲区==最多3个元素,因此我可以请求我的源足够填充我请求的1个缓冲区”)。

如果输入始终由用户提供,则很难抽象出来...

没有一种简单的方法可以对多个管道甚至是对一个给定管道(Flux)的多个订阅中的限制源进行评级。

在多个Scheduler中使用共享的publishOn将不起作用,因为publishOn选择了一个Worker线程并坚持使用。

但是,如果您的问题更具体地是关于base64任务受到限制,那么也许可以从flatMap的并发参数中获得效果?

input.flatMap(someString -> asyncProcess(someString), 3, 1);

这将最多运行3次出现的asyncProcess,并且每次终止时,都会从input的下一个值开始一个新值。

相关问题