para no bloquear IO se debe utilizar cuando se puede manejar la petición, enviar para su procesamiento en algún otro contexto de ejecución (subproceso diferente, llamada RPC a otro servidor, algún otro mecanismo asíncrono) y suelte el web- el hilo del servidor para manejar más solicitudes entrantes. Cuando se complete el procesamiento de la respuesta, se invocará un hilo de manejo de respuesta y enviará la respuesta al cliente.
Recomendaría leer netty documentation para una mejor comprensión del concepto.
En cuanto a un mayor rendimiento: cuando el servidor envía/recibe grandes cantidades de datos, todos los conmutadores de contexto y el paso de datos entre subprocesos, realmente puede dañar el rendimiento general. Piénselo de esta manera: recibe una solicitud grande (solicitud PUT con un archivo grande). Todo lo que necesita hacer es guardarlo en el disco y regresar OK. Comenzar a lanzarlo entre hilos podría dar como resultado pocas operaciones más de copia de memoria que hubieran sido necesarias en caso de que acabara de tirarlo al disco en el mismo hilo. Y manejar esta operación de manera asincrónica no mejoraría el rendimiento: aunque podría haber liberado el hilo de manejo de solicitudes al grupo de subprocesos del servidor web y dejarlo procesar otras solicitudes, su cuello de botella de rendimiento principal es su disco IO, y en este caso - intentando para guardar más archivos simultáneamente, solo haría las cosas más lentas.
Espero haber sido lo suficientemente claro. Por favor, siéntase libre de hacer más preguntas en los comentarios si necesita más explicaciones.
Entonces, ¿puedo concluir que la mayor ventaja que proporciona el no bloqueo es la capacidad, es decir, la cantidad de solicitudes simultaneas que se pueden tratar por servidor, no el rendimiento total o la velocidad por procesamiento de solicitudes? Si agrego más servidores en el clúster, ¿puedo lograr el mismo resultado con una mejor velocidad y rendimiento utilizando el bloqueo io, siempre que la arquitectura de mi aplicación tenga una buena escalabilidad horizontal? – xiefei
Aproximadamente, sí. Por supuesto, todo su servidor usa algún recurso compartido (base de datos, sistema de archivos compartido, algún servicio de back-end), estaría limitado por su velocidad, pero si no tiene nada de eso, agregar más servidores lo mejorará. rendimiento en la mayoría de los casos. Además, programar de manera asíncrona es más difícil y mucho más propenso a errores. –
Por otro lado, agregar más servidores al clúster es expansivo y probablemente no lo ayude a hacer frente a una gran cantidad de pequeñas solicitudes que no requieren casi ningún servidor (Por ejemplo, el servidor web que usa IO no bloqueante es mucho más resiliente a los ataques de DOS: responde con el código de error adecuado a los atacantes y hace lo que necesita hacer para las solicitudes válidas) –