项目反应堆处理器v3.X

时间:2017-01-23 07:41:35

标签: spring project-reactor

我们正试图从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好多了。

1 个答案:

答案 0 :(得分:1)

Reactor 3是围绕这样一个概念构建的,你应该尽可能地避免阻塞,所以在你的第二个片段DoBlockingWork看起来并不好。

如何生成事件?你可能有一个基于监听器的异步API来获取它们吗?如果是这样,您可以尝试使用Flux.create

对于&#34;的用例,我们在1秒内有1000个事件,但只想处理4&#34;,我链接sample运算符。例如,sample(Duration.ofMillis(250))将每秒分成4个窗口,从中只发出最后一个元素。

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