Как повысить производительность веб-сокетов Akka-http - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно сделать приложение сервера websocket для хранения соединений и повторной отправки сообщений (около 100 тыс. Соединений на одной машине).Чтобы понять, является ли 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.

Я сделал 10 тыс. Подключений к серверу, и каждое подключение отправляет сообщение один раз в 10 секунд.(сообщение это текущая метка времени).Тест показал, что сервер использует 70% ЦП и 1,5 ГБ оперативной памяти.На 18 тыс. Соединений сервер останавливает подключение новых клиентов.

Я написал другой сервер, на этот раз на nodejs + ws.На той же машине он показал гораздо лучшую производительность 100 тыс. Соединений с 70% загрузкой ЦП.Я новичок в Scala и мой вопрос, что я делаю не так?Или scala + akka-http не подходят для таких задач, я имею в виду веб-сокеты.

Я запускаю сервер на своей машине (Intel i5-7500 3.4 ГГц. 16 ГБ ОЗУ. ОС Windows 10 Pro. Java SE 64-бит 1.8.0_171).

1 Ответ

0 голосов
/ 29 мая 2018

Проверьте документацию 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)
  }
...