我正在创建一个库,用于使用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吗?也许某种定制的调度程序或处理器?背压将如何工作?我是否需要担心创建缓冲区?
答案 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
的下一个值开始一个新值。