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