Spring 项目反应堆处理器v3.X

Spring 项目反应堆处理器v3.X,spring,project-reactor,Spring,Project Reactor,我们正在尝试从2.X迁移到3.X。 在我们的应用程序(低延迟FX系统)中,我们使用了EventBus作为事件管理器,它对我们非常有用 在更改之后,我们决定采用每个模块并创建自己的处理器来处理事件。 1.从你的观点来看,这个用法正确吗?由于在现阶段缺乏文件,在审查了所有可能的情况后,我们真的不知道在这里做什么 2.我们尝试使用通量,以便每X间隔执行一次操作 例如:Market将在1秒内到达1000,但我们希望在1秒内仅处理4次更新。升级后,我们使用: 带缓冲区的处理器,并发送到另一个方法。 在这个

我们正在尝试从2.X迁移到3.X。 在我们的应用程序(低延迟FX系统)中,我们使用了EventBus作为事件管理器,它对我们非常有用

在更改之后,我们决定采用每个模块并创建自己的处理器来处理事件。 1.从你的观点来看,这个用法正确吗?由于在现阶段缺乏文件,在审查了所有可能的情况后,我们真的不知道在这里做什么 2.我们尝试使用通量,以便每X间隔执行一次操作 例如:Market将在1秒内到达1000,但我们希望在1秒内仅处理4次更新。升级后,我们使用:

带缓冲区的处理器,并发送到另一个方法。 在这个方法中,我们有一个通量,它获取列表并尝试并行工作以完成他的任务。 我们有两个主要问题: 1.有时我们接收到空事件,我们无法发现我们的系统正在发送给我想可能我们没有使用处理器

    //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);
   }
这样做的目的是处理器将每250ms唤醒一次并调用处理程序。处理程序将与Flux并行工作,以实现更好更快的处理。 *如果DoBlockingWork需要超过250毫秒,我无法理解会发生什么行为

更新: EventBus由我们包装,每个订阅的事件都会抛出包装好的事件管理器。 现在我们已经尝试为每个模块创建事件处理器,但它的工作速度非常慢。我们使用了带有ThreadExecutor的TopicProcessor,但仍然非常慢。。EventBus以高速完成了同样的工作
有人知道吗?顺便说一句,当我尝试使用DirectProcessor时,TopicProcessorReactor 3似乎工作得更好,它是围绕着您应该尽可能避免阻塞的概念构建的,因此在您的第二个代码片段中,DoBlockingWork看起来不太好

这些事件是如何产生的?您是否有基于侦听器的异步API来获取它们?如果是这样,您可以尝试使用
Flux.create

对于“我们在1秒内有1000个事件,但只想处理4个”的用例,我将链接一个
sample
操作符。例如,
sample(Duration.ofMillis(250))
将每秒划分为4个窗口,从中只发出最后一个元素


正在编写参考指南,还有一个页面,您可以在其中找到指向外部文章和学习材料的链接。还有WIP参考指南和学习资源页面的预览。

谢谢您的回答。我试图避免,但这是一个“沉重行动”的例子,我必须以某种方式与之平行。移动到v3.X后,无法使用事件总线。我曾尝试为每个模块切换到TopicProcessor,而不是为所有模块切换到通用事件总线,但我发现它非常慢。。。试图给他一个线程执行器,但仍然非常缓慢。所以现在我们的活动非常缓慢,并行性也不是很好。你认为我们需要试试什么?我们真的一点线索也没有我们想尽一切办法。。我正在阅读我找到的所有文件,你认为我的处理器有问题吗?它们之间的区别是什么?(例如DirectProcessor)?希望我能解释一下我使用的是什么,并且需要最佳实践的帮助以避免错误,并且仍然像EventBus一样具有速度和高吞吐量
    //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();