使用接收器内存的Akka http流正​​在增长

时间:2017-02-22 04:47:37

标签: scala scala-collections akka-stream akka-http

我使用akka http流来实现WebSocket服务器。但是,客户端每分钟都会发送大量数据。因此,客户端和服务器之间的连接保持活动状态。

在实现Web套接字处理程序时,我使用了flow和sink。并使用Sink.seq。接收器是继续收集传入元素直到上游终止的东西。

我该如何避免呢?

    implicit val system = ActorSystem("DecoderSystem")
    implicit val materializer = ActorMaterializer()
    val streamedMsgFuture: Future[Seq[ByteString]] = streamedMsg.runWith(Sink.seq)
    streamedMsgFuture.onComplete { completedStream =>
      var completeBytestring = new ByteStringBuilder()
      //I'm sure there's a better way to do this.. but hey, it's O(n)
      completedStream.foreach { x => 
        x.foreach { y => 
          completeBytestring ++= y  
        }
      }

1 个答案:

答案 0 :(得分:1)

如何解决此问题完全取决于您希望如何使用传入数据。这个问题不明确,所以我假设你想为每个传入的ByteString执行一些操作。你总是可以通过引入一些批处理阶段来复杂化这个逻辑 - akka stream可以帮助你解决这个问题。

您可以使用ByteString / map组合器对任何单独的传入mapAsync执行操作(具体取决于您的操作是同步/异步)。示例如下:

def action(msg: ByteString): SomeResult = ??? // do something
def asyncAction(msg: ByteString): Future[SomeResult] = ??? // do something

def handleResult(result: SomeResult): Unit = ??? // do something

streamedMsg.map(action).runForeach(handleResult)
streamedMsg.mapAsync(5)(asyncAction).runForeach(handleResult)