Stream 如何使akka流源队列FIFO?

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

我正在使用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 => {
     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