如何增加Akka-http websockets的性能

时间:2018-05-29 13:27:17

标签: scala akka akka-http

我需要使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)。

1 个答案:

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