2021SC@SDUSC
概述:
Datastream is an extremely fast implementation of reactive streams. It is useful for intra and inter-server communication and asynchronous data processing.
Datastream是一个非常快速的反应式流的实现。 它对服务器内和服务器间的 通信和异步数据处理非常有用
特点:
- 一个现代的异步反应流的实现(不同于Java 8中的流和传统的基于线程的阻塞流)。
- 具有极其有效的背压控制的异步性,以处理数据源速度的自然不平衡问题
- 可组合的流操作(映射器、还原器、过滤器、分类器、合并/拆分器、压缩、序列化)。
- 在Eventloop模块之上的基于流的网络和文件I/O
- 与CSP模块相兼容
与CSP的比较
可以发现,这与上一篇讲到的CSP有一定的相似之处。将两者比较一下。
- 开销:Datastream的开销极低,可以通过1个虚拟呼叫启动;CSP无短路评估,开销较高
- 吞吐速度:Datastream:极快;CSP:速度快,但慢于Datastream
- 对象:Datastream用于传输小段数据;CSP用于传输中型对象,如ByteBufs
- 编程模型:DataStream更复杂,CSP更简单方便
为了提供最高的效率,ActiveJ广泛使用CSP和Datastream的组合。为此,ChannelSupplier、ChannelConsumer、StreamSupplier 和 StreamConsumer 具有 transformWith() 方法和特殊的 Transformer 接口。使用这些方法和接口,我们可以将通道无缝转换为其他通道或数据流,反之亦然,从而创建此类转换链。
这是Datastream的主要代码部分,首先我们来看一下AbstractStreamConsumer类。这是StreamConsumer的抽象类,该类有助于处理状态转换,并帮助实现基本行为。
其含有的方法有:
protected void onInit() {
}
protected void onStarted() {
}
protected void onEndOfStream() {
}
public final void resume(@Nullable StreamDataAcceptor<T> dataAcceptor) {
if (CHECK) checkState(eventloop.inEventloopThread(), "Not in eventloop thread");
if (endOfStream) return;
if (this.dataAcceptor == dataAcceptor) return;
this.dataAcceptor = dataAcceptor;
if (!isStarted()) return;
supplier.updateDataAcceptor();
}
public final void suspend() {
resume(null);
}
public final void acknowledge() {
if (CHECK) checkState(eventloop.inEventloopThread(), "Not in eventloop thread");
ensureInitialized();
endOfStream = true;
if (acknowledgement.trySet(null)) {
cleanup();
}
}
protected void onError(Exception e) {
}
private void ensureInitialized() {
if (!initialized) {
initialized = true;
onInit();
}
}
protected void onCleanup() {
}
onInit():此方法将只调用一次:在创建此供应商后的下一个事件循环价格中,或者在 {@link #onStarted()} 或 {@link #onError(异常)} 调用之前调用 onStarted():当此使用者开始接收项目时,将调用此方法。如果消费者从未收到任何关闭的东西,则可能不会调用它。 onEndOfStream():当关联供应商关闭时,将调用此方法。 resume():开始将数据接收到给定的受体中,恢复关联的供应商以从其接收数据。 suspend():暂停关联的供应商。 acknowledge():触发此使用者的 {getAcknowledgement() }。 onError():当此使用者错误地更改为已确认状态时,将调用此方法。 ensureInitialized():仅当尚未初始化此使用者时,才通过调用 {@link #onInit()} 来初始化此使用者。 onCleanup():此使用者更改为确认状态后,无论出现错误,都将异步调用此方法。