Stream 如何使akka流源队列FIFO?
我正在使用akka开发一个股票交易系统。 我向TradeQueue提供订单簿,如下所示:Stream 如何使akka流源队列FIFO?,stream,akka,akka-stream,Stream,Akka,Akka Stream,我正在使用akka开发一个股票交易系统。 我向TradeQueue提供订单簿,如下所示: val tradeQueue = Source.queue[TradeTask](1, OverflowStrategy.backpressure) .map(task=>{ println("TradeTask Start:"+task) task }) .via(ProcessA) .via(ProcessC) .via(ProcessC) .toMat(Sink.foreach(task
val tradeQueue = Source.queue[TradeTask](1, OverflowStrategy.backpressure)
.map(task=>{
println("TradeTask Start:"+task)
task
})
.via(ProcessA)
.via(ProcessC)
.via(ProcessC)
.toMat(Sink.foreach(task => {
log.info("TradeTask finish:"+task)
}))(Keep.left).run()
for (item <- 1 to 100) {
val task = TradeTask(item)
tradeQueue.offer(task)
}
val tradeQueue=Source.queue[TradeTask](1,OverflowStrategy.backpressure)
.map(任务=>{
println(“交易任务开始:+任务)
任务
})
.via(过程A)
.via(过程C)
.via(过程C)
.toMat(Sink.foreach)(任务=>{
log.info(“交易任务完成:+任务”)
}))(Keep.left)。run()
对于(项目)已经是先进先出的
您的问题已经证明队列是“(F)irst(I)n(F)irst(O)ut”。如输出所示,进入流的第一个元素,TradeTask(1)
,是接收器处理的第一个元素:
TradeTask Start:TradeTask(1) // <-- FIRST IN
TradeTask Start:TradeTask(2)
TradeTask finish:TradeTask(1) // <-- FIRST OUT
TradeTask finish:TradeTask(2)
类似地,您可以使用函数合成和简化迭代:
val compositeFunction : Int => Unit =
TradeTask.apply andThen functionA andThen functionB andThen functionC andThen logTask
(1 to 100) foreach compositeFunction
我有一些处理器编写为akka actor,在akka流中,我可以方便地通过我的actor进行如下处理:tradeQueue.ask[TradeTask](pickMatchOrderBookHandler)。ask[TradeTask](calculateHandler)没有akka strem,它将给我们带来巨大的变化。有没有办法让akka steam实现这一点?@liaolunhui我不理解你的评论。tradeQueue
没有ask
方法。你可以将数据发送到源
,但是发送方
信息不会被保存,因此的ink
无法对提交的参与者作出响应。我认为您的设计应该重新评估。akka streams确保第一条消息将首先在每个步骤中进行处理(除非您使用mapAsyncUnordered
).这与您的提问模式示例中的情况相同,因此不确定为什么您的问题是海豚。
val compositeFunction : Int => Unit =
TradeTask.apply andThen functionA andThen functionB andThen functionC andThen logTask
(1 to 100) foreach compositeFunction