Способ Scala использовать один актер на соединение сокета - PullRequest
5 голосов
/ 24 марта 2010

Мне интересно, как можно избежать одного сокетного соединения пр. нить в скале. Я много об этом думал, но всегда получаю код, который прослушивает входящие данные для каждого клиентского соединения.

Проблема в том, что я хочу разработать приложение, которое должно одновременно обрабатывать, возможно, пару тысяч соединений. Однако я, конечно, не хочу создавать поток для каждого соединения из-за отсутствия масштабируемости и переключения контекста.

Каков был бы «правильный» способ сделать это. В моем мире должно быть возможно иметь одного актера для каждого соединения без необходимости блокировать один поток на каждого актера.

Ответы [ 2 ]

6 голосов
/ 24 марта 2010

В книге «Программирование Scala» авторы использовали библиотеку под названием naggati, которая предоставляет среду, объединяющую NIO и актеров, http://programming -scala.labs.oreilly.com / ch09.html .

4 голосов
/ 24 марта 2010

У меня есть приложение, которое смешивает актеров с неблокирующими сокетами (т.е. NIO). Способ, которым я это сделал, - создать выделенный поток ввода-вывода, который отправляет сообщения акторам (во многом аналогично тому, как делегировать работу пулу потоков в системе Java) с использованием шаблона реактора.

Очевидно, что используя старые блокирующие сокеты, вы ограничены одним потоком на соединение. И субъект мог справиться с этим, но, конечно, это накладывает ограничение на количество соединений, которые могут обрабатываться одновременно.

В случае одного потока ввода-вывода это является узким местом в теории, но не так много на практике (в наших наблюдениях), поскольку поток ввода-вывода выполняет вычислительно не интенсивную работу. Есть много хороших обсуждений, которые можно найти на схеме реактора NIO .

...