Java 可观察到批量式Lmax干扰器

Java 可观察到批量式Lmax干扰器,java,reactive-programming,rx-java,observable,disruptor-pattern,Java,Reactive Programming,Rx Java,Observable,Disruptor Pattern,熟悉该数据结构的人都知道,该数据结构的最大优点之一是它可以批量处理输入事件,当我们有一个消费者可以利用批量处理使系统能够自动调整以适应负载时,您向其抛出的事件越多越好 我想知道我们是否可以通过一个可观察的(针对批处理特性)实现同样的效果。我已经尝试过,但这是非常不同的,缓冲区将等待,而不会发出批处理,而预期数量的事件没有到达。我们想要的是完全不同的 假设订阅方正在等待来自可观察的批次,当单个项目到达流时,它将发出一个由订阅方处理的单个元素批次,而它正在处理其他元素,这些元素将到达并收集到下一批中

熟悉该数据结构的人都知道,该数据结构的最大优点之一是它可以批量处理输入事件,当我们有一个消费者可以利用批量处理使系统能够自动调整以适应负载时,您向其抛出的事件越多越好

我想知道我们是否可以通过一个可观察的(针对批处理特性)实现同样的效果。我已经尝试过,但这是非常不同的,缓冲区将等待,而不会发出批处理,而预期数量的事件没有到达。我们想要的是完全不同的

假设订阅方正在等待来自<代码>可观察的批次,当单个项目到达流时,它将发出一个由订阅方处理的单个元素批次,而它正在处理其他元素,这些元素将到达并收集到下一批中,一旦订阅服务器完成执行,它将获得下一批,其中包含自上次处理开始以来已到达的事件数

因此,如果我们的订阅服务器足够快,一次处理一个事件,它就会这样做,如果负载变得更高,它仍然会有相同的处理频率,但每次都会有更多的事件(从而解决背压问题)。。。与缓冲区不同,缓冲区会粘住并等待批次填满


有什么建议吗?还是使用环形缓冲区?

RxJava和Disruptor代表两种不同的编程方法

我对Disruptor没有经验,但基于视频对话,它基本上是一个大的缓冲区,生产者像消防软管一样释放数据,消费者旋转/屈服/阻止,直到数据可用

另一方面,RxJava的目标是无阻塞事件交付。我们也有环形缓冲区,特别是在observeOn中,它充当生产者和消费者之间的异步边界,但这些缓冲区要小得多,我们通过应用协例程方法避免缓冲区溢出和缓冲区膨胀。Co例程归结为发送到您的回调的回调,这样您就可以回调我们的回调,以您的速度向您发送一些数据。此类请求的频率决定了速度

有些数据源不支持这种协作流,需要一个
onBackpressureXXX
操作符,如果下游请求速度不够快,该操作符将缓冲/删除值

如果您认为分批处理数据比逐个处理数据效率更高,则可以使用具有重载的
buffer
运算符来指定缓冲区的持续时间:例如,您可以拥有10毫秒的数据,而与在此持续时间内到达的值数无关


通过请求频率控制批量大小是一件棘手的事情,可能会产生不可预见的后果。一般来说,问题是如果您
从批处理源请求(n)
,则表明您可以处理n个元素,但源现在必须创建大小为1的n个缓冲区(因为类型是
可观察的
)。相反,如果没有调用请求,操作员将缓冲数据,从而产生更长的缓冲区。这些行为会在处理过程中引入额外的开销,如果您真的能够跟上,并且还必须将冷源转换为消防软管(因为否则您实际上拥有的是
buffer(1)
),这本身可能会导致缓冲区膨胀。

我相信此操作符称为
bufferIntrospective
,请参阅