2009-03-31 13 views
8

Puedo crear múltiples subprocesos para admitir la función multicliente en la programación de socket; eso está funcionando bien. Pero si 10.000 clientes desean conectarse, mi servidor no puede crear tantos hilos.Java Socket Programming no funciona para 10,000 clientes

¿Cómo puedo gestionar los hilos para que pueda escuchar a todos estos clientes simultáneamente?

Además, si en este caso el servidor desea enviar algo a un cliente en particular, ¿cómo es posible?

+0

Esto ya está respondido: http://stackoverflow.com/questions/592303/asynchronous-io-in-java – mparaz

+0

Hay algunas recomendaciones excelentes de no bloqueo de NIO a continuación, pero para resumir, permítanme decirlo claramente : Cuando espere unos pocos clientes, puede ir por el camino de una sola fila. Pero cuando esperas clientes de 10K, y yo argumentaría (dependiendo de las cargas de E/S y CPU) que si esperas algo más de 100 clientes, NECESITAS IR LA FORMA NIO (IO no bloqueante). Incluso si su sistema operativo supera 1000 veces por segundo, ¿podría imaginarse la tarea de manejar clientes 10K? ¡No tiene sentido ir con sockets de bloqueo con tantos clientes! – Jeach

Respuesta

1

Esto no es una cuestión sencilla, pero para un muy a fondo (lo siento, no en java sin embargo) la respuesta ver esto: http://www.kegel.com/c10k.html


EDITAR

Incluso con nio, esto es sigue siendo un problema difícil 10000 conexiones es una gran carga de recursos en la máquina, incluso si usa conectores no bloqueantes. Esta es la razón por la que los sitios web grandes tienen granjas de servidores y equilibradores de carga.

7

La programación de socket altamente escalable en Java requiere el selectable channels provisto en los paquetes "New I/O" o NIO. Al usar IO no bloqueante, un solo hilo puede dar servicio a muchos sockets, tendiendo solo a los sockets que están listos.

Una de las aplicaciones NIO de código abierto más escalables es el componente Grizzly del servidor de aplicaciones Glassfish. Jean-Francois Arcand ha escrito una serie de publicaciones informativas y en profundidad sobre su trabajo en el proyecto, y cubre muchos errores sutiles al escribir este tipo de software con NIO.

Si el concepto de IO no bloqueante es nuevo para usted, puede ser muy útil utilizar software existente como Grizzly, o al menos usarlo como punto de partida para su adaptación.

11

Debe investigar la biblioteca NIO de Java ("New I/O") para la programación de red sin bloqueo. NIO fue diseñado para resolver precisamente ¡el problema de escalabilidad del servidor al que se enfrenta!

4

Un modelo de hilos de rosca por conexión (bloqueo Socket I/O) no se escala demasiado bien. Aquí hay una introducción a Java NIO que le permitirá usar llamadas de socket no bloqueantes en java: http://today.java.net/cs/user/print/a/350

Como dice el artículo, hay muchos marcos disponibles para que no tenga que hacer los suyos propios.

+0

Gracias Peter, Es un enlace útil.¿Puede ayudarme con ese tipo de enlaces donde puedo obtener más detalles? –

+0

Hay código de muestra en el JDK para este modelo. Nota: no puede exceder la cantidad de usuarios que su servidor admitirá. Es posible que necesite más servidores. –

1

¿Por qué no procesa solo una cierta cantidad de solicitudes a la vez?

Digamos que desea procesar un máximo de 50 solicitudes a la vez (por no crear demasiadas hebras)

se crea un conjunto de subprocesos de 50 hilos.

Pones todas las solicitudes en una cola (aceptar conexiones, mantener las tomas abiertas), y cada hilo, cuando está hecho, obtiene la siguiente solicitud y luego la procesa.

Esto debería escalar más fácilmente.

Además, si se presenta la necesidad, será más fácil de hacer balance de carga, ya que es posible compartir sus colas para varios servidores

6

Los beneficios de NIO son discutibles. Consulte las entradas de blog de Paul Tyma here y here.

2

Como se mencionó anteriormente, 10.000 clientes no es fácil. Para Java, NIO (posiblemente aumentado con un threadpool separado para manejar cada solicitud sin bloquear el hilo de NIO) es la forma habitual de manejar una gran cantidad de clientes.

Como se mencionó, dependiendo de la implementación, los subprocesos realmente pueden escalar, pero depende mucho de la interacción que exista entre las conexiones del cliente. Es más probable que los hilos masivos funcionen si hay poca sincronización entre los hilos.

Dicho esto, NIO es notoriamente difícil de obtener al 100% la primera vez que lo implementa.

Recomendaría probar o, al menos, mirar la fuente para la lib Naga NIO al naga.googlecode.com. La base de código para lib es pequeña en comparación con la mayoría de los otros marcos de NIO. Debería poder implementar rápidamente una prueba para ver si puede poner 10.000 clientes en funcionamiento.

(La fuente Naga también pasa a ser libre de modificar o copiar sin atribuir al autor original)

0

Personalmente prefiero utilizar crear una E/S de configuración no bloqueante personalizado, por ejemplo utilizando un hilo para aceptar clientes y usar otro hilo para procesarlos (verificar si hay alguna entrada disponible y escribir datos en la salida si es necesario).

0

Tendrá que averiguar por qué su aplicación está fallando en 10,000 hilos.

  1. ¿Existe un límite estricto para el número de subprocesos en la JVM o el sistema operativo? Si es así, ¿se puede levantar?

  2. ¿Se está quedando sin memoria? Intente configurar un tamaño de pila más pequeño por subproceso y/o agregue más memoria al servidor.

  3. ¿Algo más? Arreglalo.

Solo cuando haya determinado el origen del problema, podrá solucionarlo. En teoría, 10.000 hilos deberían estar bien, pero a ese nivel de concurrencia se requiere un ajuste adicional de la JVM y el sistema operativo si se quiere que funcione.

También puede considerar NIO, pero creo que también puede funcionar bien con hilos.

+0

Tengo dificultades para digerir tus comentarios (los hilos 10K deberían estar bien)? Te reto a que escribas un pequeño programa que hace una sola tarea. Compare bien y mantenga ese número seguro. Luego, cree subprocesos de 10K y comience la misma tarea en cada subproceso, mientras que también lo compara. No importa qué sistema operativo utilices, ¡probablemente tengas hambre de hilos! – Jeach

+0

Hola Jeach, la tarea que tenemos a mano es "esperar a la E/S", no hay que hacer ningún procesamiento. El sistema operativo no realiza ningún cambio de contexto a los hilos que están esperando E/S. El sistema operativo no asigna memoria física a las áreas de la pila que no están en uso. –