我使用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
}
}
答案 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)