waterflow是一个水流式的流程编排引擎。其主要核心特点是:
- 多源热数据
- 无限水流。
- 多流交互。
- 异步处理。
与传统方法不同,“waterflow”引擎采用了一种创新的“基于节点的响应式流”模式,而非“基于数据的响应式流”。在这种模式下,流的定义与数据源的绑定被解耦,允许先行定义一个通用的数据处理流程,然后根据需要将不同的数据源灌入其中。这样简化了多数据源集成,通过统一的offer方法灌入数据,简化了从不同数据源接收并处理数据的复杂性。
比如:
Flow<String> flow = Flows.<String>create().map(…).reduce(…);定义好流程后,无论是冷数据还是热数据源,都可以通过简单的offer方法灌入相同的流中进行统一处理:
flow.offer("data1"); // 冷数据灌入
flow.offer(emitter1); // 热数据源1灌入
flow.offer(emitter2); // 热数据源2灌入这种设计显著简化了多源数据处理的逻辑,使开发者能够专注于流程本身的设计,而无需关心数据来源的差异。
在waterflow中,流不是由数据源发起,而是预先定义,并且能够接收来自任意数量和类型的数据源的数据。这是通过定义一个灵活的流处理模板实现的,该模板可以接受随时到来的数据项,而不是固定地从特定的数据源启动。为了支持这种设计我们的写法如下:
ProcessFlow<String> hello = Flows.<String>create()
.just(input -> System.out.println(input))
.close();
hello.offer("hello world!");
hello.offer("hello world!");
输出:
hello world!
hello world!
- 其中的
hello为一个编排好的流对象。 - 在
hello.offer("hello world!");时,向该编排好的流对象投递数据。然后数据异步的在编排的节点中流转。 - 上述
just节点收到输入只是进行一个打印,具体支持的节点操作可以参考后续的功能介绍。
在waterflow引擎中,无限水流和多源热数据特性共同构成了其核心的多流交互机制。这一机制使得在响应式数据流环境中,任何节点都具备将数据传递给其他流或流中特定节点的能力,如图所示。这种设计增强了整个系统对于动态数据源和异步操作的适应能力
- 通过多源热数据和无限水流特性,观察图示特征,每个节点都可以是另外一个节点的输入,任何其他流的节点也可以是这个节点的输入。
- 节点与流的交互:B1作为1流的一个节点,将数据传入2流,2流处理的结果返回给B1节点,作为B1的处理结果。
- 节点与节点的交互:B2作为2流的一个节点,将数据传入3流的A3节点,A3节点处理的结果返回给B2,作为B2的处理结果。
由于我们设计是支持无界流的,对于每次投递数据,编排的流都可以源源不断的处理,这里使用异步的方式可以很好的对流中数据进行缓冲和调度,方便更高效的对数据进行组织和处理。所以使用时需要注意以下几点:
offer返回时,此时不代表对应的数据已经处理完成,只是表示数据已经被投递到流中进行执行。- 如果需要同步等待结果,此时可以在
close节点监听结果并使用信号量等来控制同步,如:
Semaphore semaphore = new Semaphore(0);
ProcessFlow<String> hello = Flows.<String>create()
.just(input -> System.out.println(input))
.close(result -> semaphore.release());
hello.offer("hello world!");
semaphore.acquire();输出:
hello world!
流程中的每个节点均是可以接收数据进行处理的,都可以执行offer操作。具体特点如下:
- 对一个流
offer数据时,是将数据发送到开始节点,开始节点直接将数据发送给后续节点。 offer时是向该结点的后续节点发送数据,并不会执行该节点中的动作。- 可以对流程中的任意节点
offer数据。
这样设计可以获得一些好处,比如:其中一个节点为子流,子流执行结束后再把数据投递回来时,继续投递给该节点,然后从该节点继续向后执行。

