我们正试图从2.X迁移到3.X. https://github.com/reactor/reactor-core/issues/375 我们在我们的应用程序(低延迟FX系统)中使用EventBus作为事件管理器,它对我们非常有用。
更改后,我们决定采用每个模块并创建自己的处理器来处理事件。 1.从您的角度来看,这种用途是否正确?由于目前阶段缺乏文件,在审查完所有内容后,我们真的不知道该怎么做 2.我们尝试使用Flux以便每隔X个间隔执行一次操作 例如:市场到达1000点1秒,但我们希望在一秒钟内只处理4次更新。升级后,我们正在使用:
带缓冲区的处理器并发送到另一个方法。 在这个方法中,我们有Flux获取列表并尝试并行工作以完成他的任务。 我们有两个主要问题: 1.有时我们收到Null事件,我们无法发现我们的系统发送给我,我想也许我们错过了使用处理器
//Definition of processor
ReplayProcessor<Event> classAEventProcessor = ReplayProcessor.create();
//Event handler subscribing
public void onMyEventX(Consumer<Event> consumer) {
Flux<Event> handler = classAEventProcessor .filter(event -> event.getType().equals(EVENT_X));
handler.subscribe(consumer);
}
在上面的示例中,处理程序中的事件有时会变为null ..一旦他执行流停止工作,直到我们重新启动服务器(因为只有在重新启动时我们正在创建处理器)
2.我们尝试了并行,但有时一些消息消失了,所以也许我们误用了框架
//On constructor
tickProcessor.buffer(1024, Duration.of(250, ChronoUnit.MILLIS)).subscribe(markets ->
handleMarkets(markets));
//Handler
Flux.fromIterable(getListToProcess())
.parallel()
.runOn(Schedulers.parallel())
.doOnNext(entryMap -> {
DoBlockingWork(entryMap);
})
.sequential()
.subscribe();
这样做的目的是处理器每250ms唤醒一次并调用处理程序。处理程序将与Flux并行工作,以便更好,更快地处理。 *如果DoBlockingWork需要超过250毫秒,我无法理解这将是什么行为
更新: EventBus由我们包装,每个订阅的事件都会抛出包装好的事件管理器。 现在我们已经尝试为每个模块创建事件处理器,但它的工作速度非常慢。我们已经将TopicProcessor与ThreadExecutor一起使用并且仍然非常慢.. EventBus在高速下也做了同样的工作 任何人有任何想法?顺便说一句,当我尝试使用DirectProcessor时,它似乎比TopicProcessor好多了。
答案 0 :(得分:1)
Reactor 3是围绕这样一个概念构建的,你应该尽可能地避免阻塞,所以在你的第二个片段DoBlockingWork
看起来并不好。
如何生成事件?你可能有一个基于监听器的异步API来获取它们吗?如果是这样,您可以尝试使用Flux.create
。
对于&#34;的用例,我们在1秒内有1000个事件,但只想处理4&#34;,我链接sample
运算符。例如,sample(Duration.ofMillis(250))
将每秒分成4个窗口,从中只发出最后一个元素。
正在编写参考指南,以及一个页面,您可以在其中找到指向外部文章和学习资料的链接。还可以预览WIP参考指南here和学习资源页面{{ 3}}