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

Scala 使用接收器内存的Akka http流正在增长,scala,scala-collections,akka-stream,akka-http,Scala,Scala Collections,Akka Stream,Akka Http,我已经使用akka http streams实现了WebSocket服务器。然而,客户端每分钟发送大量数据。因此,客户端和服务器之间的连接保持活动状态 在实现web套接字处理程序时,我使用了flow和sink。并使用Sink.seq。接收器是持续收集传入元素直到上游终止的东西 我怎样才能避免呢 implicit val system = ActorSystem("DecoderSystem") implicit val materializer = ActorMaterializ

我已经使用akka http streams实现了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  
        }
      }

如何解决这个问题完全取决于您希望如何使用传入的数据。这个问题并不清楚,所以我假设您希望通过testring对每个传入的
执行一些操作。通过引入一些批处理阶段,您总是可以使这个逻辑复杂化——akka streams可以帮助您实现这一点

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

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)