2010-03-24 14 views
5

Me pregunto cómo es posible evitar una conexión de socket pr. hilo en Scala. He pensado mucho al respecto, pero siempre termino con un código que está escuchando los datos entrantes para cada conexión de cliente.La forma Scala de usar un actor por conexión de socket

El problema es que quiero desarrollar una aplicación que debe manejar simultáneamente tal vez un par de miles de conexiones. Sin embargo, por supuesto, no quiero crear un hilo para cada conexión debido a la falta de escalabilidad y el cambio de contexto.

¿Cuál sería la forma "correcta" de hacerlo? En mi mundo, debería ser posible tener un actor por cada conexión sin la necesidad de bloquear un hilo por actor.

Respuesta

4

Tengo una aplicación que combina actores con tomas sin bloqueo (es decir, NIO). La forma en que lo he hecho es tener un hilo IO dedicado, que envía mensajes a los actores (de la misma manera que delegaría trabajo en un grupo de subprocesos en un sistema Java) usando el patrón del reactor.

Obviamente utilizando los antiguos sockets de bloqueo, está limitado a un hilo por conexión. Y el actor podría manejar esto, pero por supuesto esto restringe la cantidad de conexiones que se pueden manejar simultáneamente.

En el caso de un único hilo IO, este es un cuello de botella en teoría pero no mucho en la práctica (en nuestras observaciones) ya que el hilo IO está haciendo un trabajo computacionalmente no intensivo. Hay muchas buenas discusiones que se pueden encontrar en NIO reactor pattern.

Cuestiones relacionadas