Java 8 交易引擎中的RxJava

Java 8 交易引擎中的RxJava,java-8,reactive-programming,rx-java,Java 8,Reactive Programming,Rx Java,我将使用伪代码来避免不必要的样板文件。我是新来的Rx,但我真的想用它来代替功能和类似的东西 这是交易引擎的简化模型 我们有一个数据库,它提供了人们可能感兴趣的所有事件流(可观察的) market.updateStream // stream of orderbook update events 我们有所谓的s,这些s将订阅所需的流,并在发生任何这样的变化时“作出反应” market.updateStream.subscribe(bot1.marketUpdateAction) market.u

我将使用伪代码来避免不必要的样板文件。我是新来的Rx,但我真的想用它来代替功能和类似的东西

这是交易引擎的简化模型

我们有一个数据库,它提供了人们可能感兴趣的所有事件流(可观察的)

market.updateStream // stream of orderbook update events
我们有所谓的s,这些s将订阅所需的流,并在发生任何这样的变化时“作出反应”

market.updateStream.subscribe(bot1.marketUpdateAction)
market.updateStream.subscribe(bot2.marketUpdateAction)
bot1.calculationStream.subscribe(botController.botActivityAction)
我们可能有许多机器人将订阅一个市场,每个机器人要么开始计算,要么忽略更改事件

现在我们有N个机器人对一个事件做出反应,我们需要有人比较他们的计算结果,并确定哪一个是最有利可图的。如果某个机器人正在减速,并且超出了我们准备等待的时间限制,我们将跳过它并继续比较和执行。。。为此,我们有一个botController,它订阅了所有bot事件,以便它知道bot何时决定对事件作出反应。。。像这样

market.updateStream.subscribe(bot1.marketUpdateAction)
market.updateStream.subscribe(bot2.marketUpdateAction)
bot1.calculationStream.subscribe(botController.botActivityAction)
bot将依次发出两个不同的事件(calculationStarted和calculationEnded,其中包含实际结果)

当机器人发出其开始计算的事件时(如果市场事件符合机器人的利益,则会发生这种情况,因此并非所有机器人都会发出开始事件),如果注册的机器人提前完成,则botController应执行以下操作,从第一个机器人启动事件开始计算时间,并等待所有发出类似事件的机器人,比较马上就要开始了

抱歉,如果问题太抽象了,但我真的不知道如何用RxJava实现BotController行为。。。感谢您的支持。。。有这么多的rx转换,我真的不知道我可以在那里使用什么


更新

假设我们的控制器订阅了N个机器人事件,每个机器人可以发出2个事件(已启动、已完成)

现在,当控制器第一次启动事件时,它开始倒计时T,当T时间未过期时,它将接受来自机器人的新事件,当T过期或所有机器人返回已完成事件时,它会进行一些计算并返回单个结果


我不明白的是:据我所知,rx是孤立地处理每个事件的,因此安全性不会出现典型的并发问题,现在我有几个事件相互关联,我不知道如何使用rx做到这一点。。。我只是需要一些指导。

我不完全理解您的问题,但这里有一些设计思路,向您展示如何思考“Rx方式”:

我不会订阅机器人程序,但它们应该是更新流上的
map
flatMap
,以便它们将更新流转换为答案流

我将创建一个包含4个子类的
BotAnswer
类:
Result
notinterest
Timeout
BotError

然后,对于每个机器人:

Observable<BotAnswer> bot1Answers = market.updateStream.flatMap(event -> 
  Observable.just(event).map({ if (event is interesting)
    return new Result(doBotCalculations())
  else
    return new NotInterested()
  })
  .timeout(T, TimeUnit.SECONDS)
  .onErrorResumeNext(
     error -> if (error instanceof TimeoutException)
        return Observable.just(new Timeout())
      else
        return Observable.just(new BotError(error))
   )
)

这是我想到的

每个bot都会订阅市场更新, 市场更新后,机器人开始计算, 当其完成其发射完成事件时, 如果其从主管处获得终止事件,则停止计算,如果其获得另一个市场,则更新其终止当前执行并重新开始

监督员也负责市场更新, 当它得到一个时,它期望所有机器人程序的计算结果(没有结果也是一个结果:), 如果某个机器人花费的时间太长,它会通过发送终止事件通知他(并将该机器人视为不返回结果), 一旦获得所有机器人程序的结果,它就会开始比较这些结果,并将最终值发送给订户, 如果它在执行时得到另一个市场更新,它将终止计算并重新开始(等待机器人)

在实现方面,Bot将设法处理对其方法(启动、终止)以及监控程序的适当并发访问,最终这些对象将使用传统同步通过并发执行确保不会对对象执行不安全的操作,但触发什么和周围发生什么的主要流程是由Rx控制的

请注意,在这种情况下,超时由主管控制


我错过什么了吗?如果必须将传统同步与rx结合使用,可能是我做错了什么?

您的问题是什么?我想你想知道如何构建一个“机器人控制器”,它将订阅N个观测值,然后在T次之后获取所有可用的结果,对它们做些什么,然后将其传递给其他人?几乎是的,当第一个“botStartedCalculation”发出botController时,它会注册该机器人,并知道该机器人将返回“botResult”(如果T时间已过,且该机器人未收到任何信息,则忽略此选项),我的问题/问题是,我真的不明白如何使用Rx转换实现这种行为,我需要一些伪代码之类的东西,如果Rx可以做到这一点,可以给我一个线索……我会更新问题以更清楚地解释问题……我甚至试着找人帮助我,但没有人回应:(非常感谢,我将从这个开始。但我们这里有一个巨大的问题,每个机器人将开始自己的超时计算…但我们需要控制器从第一个机器人开始…你认为RX可行吗?