我需要使websocket服务器应用程序保持连接并重新发送消息(在单个机器上大约100k连接)。要了解scala / akka-http是否是一个很好的选择,我做了一个测试。 服务器端代码:
object Server2 {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
def echoFlow: Flow[Message, Message, Any] =
Flow[Message].mapConcat {
case tm: TextMessage =>
TextMessage(Source.single("test ") ++ tm.textStream) :: Nil
}
val websocketRoute =
path("chat") {
handleWebSocketMessages(echoFlow)
}
val bindingFuture = Http().bindAndHandle(websocketRoute, "127.0.0.1", 8080)
// the rest of the sample code will go here
println("Started server at 127.0.0.1:8080, press enter to kill server")
StdIn.readLine()
system.terminate()
}
}
服务器只是将消息发送回客户端。我在nodejs上写的客户端。
我与服务器建立了10k连接,每个连接在10秒内发送一次消息。 (告诉它当前的时间戳)。测试显示服务器使用70%CPU和1.5GB内存。在18k连接上,服务器停止连接新客户端。
我写了另一个服务器,这次是在nodejs + ws上。在同一台机器上,它表现出更好的性能100k连接,70%的CPU使用率。 我是斯卡拉的新人,我的问题是我做错了什么? 或者scala + akka-http不适合这类任务,我的意思是websockets。
我在我的机器上运行服务器(intel i5-7500 3.4Ghz.16GB ram.OS Windows 10 Pro.Java SE 64-bit 1.8.0_171)。
答案 0 :(得分:1)
查看Akka Http文档https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html。
检查它是否有效声明你的来源:
def echoFlow0: Flow[Message, Message, Any] =
Flow[Message].collect {
case tm: TextMessage.Strict =>
TextMessage.Strict("Test " + tm.text)
}