Мне нужно сделать приложение сервера 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).