He leído el documento C10K y muchos documentos relacionados sobre la ampliación de un servidor de socket. Todos los caminos apuntan a lo siguiente:Modelo de subprocesamiento y escalado para servidor TCP con epoll
Evite el error clásico de "hilo por conexión".
Prefiero epoll sobre select.
Del mismo modo, el mecanismo asincrónico heredado en Unix puede ser difícil de usar.
Mi servidor TCP simple simplemente escucha las conexiones del cliente en un socket de escucha en un puerto dedicado. Al recibir una nueva conexión, analiza la solicitud y devuelve una respuesta. Luego, con gracia, cierra el zócalo.
Creo que tengo un buen manejo sobre cómo escalar esto en un solo hilo usando epoll. Solo un ciclo que llama a epoll_wait para el socket de escucha, así como para las conexiones de cliente existentes. A su regreso, el código manejará las nuevas conexiones de clientes creando así nuevas, así como la administración del estado de las conexiones existentes, dependiendo de qué socket se haya señalado. Y quizás algo de lógica para administrar los tiempos de espera de conexión, el cierre elegante de los sockets y la asignación eficiente de recursos para cada conexión. Parece lo suficientemente sencillo.
Pero, ¿y si quiero escalar esto para aprovechar múltiples hilos y múltiples núcleos de CPU? La idea central que me viene a la mente es la siguiente:
Un hilo dedicado para escuchar las conexiones entrantes en el socket de escucha TCP. Luego, un conjunto de N subprocesos (o grupo de subprocesos) para manejar todas las conexiones de cliente simultáneas activas. A continuación, invente una forma segura de subprocesos en la que el subproceso de escucha "envíe" la nueva conexión (socket) a uno de los subprocesos de trabajo disponibles. (ala IOCP en Windows). El subproceso de trabajo utilizará un bucle de epoll en todas las conexiones que maneja para hacer lo que haría el enfoque de subproceso único.
¿Estoy en el camino correcto? ¿O hay un patrón de diseño estándar para hacer un servidor TCP con epoll en múltiples hilos?
Sugerencias sobre cómo el hilo de escucha distribuirá una nueva conexión al grupo de subprocesos?
Si su elección de idioma es flexible, puede probar http://vibed.org/, que abstrae la naturaleza asincrónica de la programación asincrónica para que pueda programar de forma sincronizada. p. ubyte [] buf = new ubyte [] (1024); auto data = conn.read (buf); conn.write (datos); – rmc