[Netty] Modelo Parte 1: Interpretación de la arquitectura y el principio de funcionamiento del modelo Netty Thread

1 Introducción básica de Netty

1.1 Revisar el modelo de E/S en Java: BIO, NIO, AIO

  • Una comprensión simple del modelo de E/S: es decir 用什么样的通道进行数据的发送和接收, determina en gran medida el rendimiento de la comunicación del programa.

  • Java admite un total de 3 modelos de programación de red/modelos IO: BIO, NIO, AIO.

  • Java BIO: 同步并阻塞(传统阻塞型), el modo de implementación del servidor es que 一个连接对应一个线程cuando el cliente tiene una solicitud de conexión, el servidor necesita iniciar un subproceso para el procesamiento. Si la conexión no hace nada, causará una sobrecarga innecesaria del subproceso.
    inserte la descripción de la imagen aquí

  • Java NIO: 同步非阻塞, el modo de implementación del servidor es 一个线程处理多个请求(连接), es decir, las solicitudes de conexión enviadas por el cliente se registrarán en el multiplexor, y el multiplexor procesará la solicitud de E/S cuando sondee la conexión .
    inserte la descripción de la imagen aquí

  • Java AIO(NIO.2): 异步非阻塞, el concepto introducido 异步通道por Proactor 模式y simplifica la programación.Su 有效的请求才启动线程característica es que el sistema operativo primero notifica al programa del servidor que inicie el hilo para procesar después de la finalización de la aplicación.

Análisis de escenarios de aplicación de BIO, NIO y AIO

  • El método BIO es adecuado para 连接数目比较小且固定的架构este método. Este método tiene requisitos relativamente altos en los recursos del servidor y la concurrencia está limitada a la aplicación. Es la única opción antes de JDK1.4, pero el programa es simple y fácil de entender.
  • El método NIO es aplicable a 连接数目多且连接比较短(轻操作)的架构, por ejemplo, servidores de chat, sistemas de bombardeo, comunicación entre servidores, etc. La programación es más complicada, JDK1.4empezar a apoyar.
  • El método AIO es adecuado para 连接数目多且连接比较长(重操作)的架构, por ejemplo, un servidor de álbumes, que invoca completamente el sistema operativo para participar en operaciones simultáneas. La programación es más complicada y JDK7es compatible.

1.2 ¿Qué es Netty?¿Por qué se necesita Netty?

que es netty

  • Netty es un marco de código abierto de Java proporcionado por JBOSS y ahora es un proyecto independiente en Github.

  • Netty es una plataforma de alto 异步的rendimiento y alta confiabilidad para un desarrollo rápido . Simplifica y agiliza el proceso de desarrollo de NIO.基于事件驱动网络应用框架网络 IO 程序

  • Netty está principalmente dirigido a TCP协议下aplicaciones de alta concurrencia para Clientes, o aplicaciones 大量数据持续传输en .
    inserte la descripción de la imagen aquí

  • La esencia de Netty es uno NIO框架, que es adecuado para varios escenarios de aplicaciones 服务器通讯relacionados .

  • Para comprender a fondo a Netty, primero debemos aprender NIO, de modo que podamos leer el código fuente de Netty.

Problemas con NIO nativo

  • La biblioteca de clases y la API de NIO son complicadas y difíciles de usar: debe dominar Selector, ServerSocketChannel, SocketChannel, ByteBufferetc.
  • Necesita tener otras habilidades adicionales: estar familiarizado con la programación de subprocesos múltiples de Java, debido a que la programación NIO implica el modo Reactor, debe estar muy familiarizado con la programación de redes y subprocesos múltiples para escribir programas NIO de alta calidad.
  • La carga de trabajo y la dificultad del desarrollo son muy grandes: por ejemplo, el cliente se enfrenta a la desconexión y la reconexión, la interrupción de la red, la lectura y escritura de medio paquete, la falla de caché, la congestión de la red y el procesamiento de flujo anormal, etc.
  • Errores en JDK NIO: por ejemplo, el infame Epoll Bug, 它会导致 Selector 空轮询,最终导致 CPU 100%. Hasta la versión JDK 1.7, este problema aún existe y no se ha resuelto fundamentalmente.

Esta es la razón para preguntar por qué se necesita Netty.

Netty encapsula la API NIO que viene con JDK para resolver los problemas anteriores.

  • Diseño elegante: sockets de bloqueo y no bloqueo de API unificados para varios tipos de transmisión; basado en un modelo de eventos flexible y extensible, que puede separar claramente las preocupaciones; modelo de subprocesos altamente personalizable: subproceso único, uno o más grupos de subprocesos.
  • Facilidad de uso: Javadoc bien documentado, guía del usuario y ejemplos; sin otras dependencias, JDK 5 (Netty3.x) o 6 (Netty 4.x) es suficiente.
  • Alto rendimiento, mayor rendimiento: menor latencia; menor consumo de recursos; minimice la copia de memoria innecesaria.
  • Seguridad: compatibilidad total con SSL/TLS y StartTLS.
  • La comunidad está activa y se actualiza constantemente: la comunidad está activa, el ciclo de iteración de la versión es corto y los errores encontrados se pueden corregir a tiempo. Al mismo tiempo, se agregarán más funciones nuevas.

1.3 Escenarios de aplicación de Netty

Industria de Internet: en un sistema distribuido , se requieren llamadas de servicio remoto entre nodos , y un marco RPC de alto rendimiento es esencial. Como marco de comunicación asincrónica de alto rendimiento, estos marcos RPC suelen utilizar Netty como un componente básico de comunicación.

Las aplicaciones típicas incluyen: el marco RPC Dubbodel usa el protocolo Dubbo para la comunicación entre nodos El protocolo Dubbo usa Netty como el componente de comunicación básico por defecto para implementar la comunicación interna entre los nodos del proceso.

industria del juego

  • Ya sea un servidor de juegos móviles o un juego en línea a gran escala, el lenguaje Java se usa cada vez más;
  • Como componente básico de comunicación de alto rendimiento, Netty proporciona pilas de protocolos TCP/UDP y HTTP, que son convenientes para personalizar y desarrollar pilas de protocolos privados y servidores de inicio de sesión de cuentas;
  • La comunicación de alto rendimiento entre servidores de mapas se puede llevar a cabo convenientemente a través de Netty.

2 Modelo de servicio de E/S de bloqueo tradicional y modo Reactor

Los modelos de roscado existentes actualmente son:

  • Modelo de servicio de E/S de bloqueo tradicional
  • modo reactor

De acuerdo con la cantidad de reactores y la cantidad de subprocesos del grupo de recursos de procesamiento, hay tres implementaciones típicas:

  • Hilo simple de un solo reactor;
  • Reactor único multihilo;
  • Reactor maestro-esclavo multiproceso

Netty se basa principalmente en el modelo de subprocesos 主从 Reactormúltiples 改进, en el que el modelo Reactor de subprocesos múltiples maestro-esclavo有多个 Reactor

2.1 Modelo de servicio de E/S de bloqueo tradicional

Diagrama del principio de funcionamiento: los cuadros amarillos representan objetos, los cuadros azules representan hilos y los cuadros blancos representan métodos (API)
inserte la descripción de la imagen aquí

Características del modelo

  • Use el modo de E/S de bloqueo para obtener datos de entrada
  • Cada conexión requiere un subproceso independiente para completar la entrada de datos, el procesamiento comercial y la devolución de datos.

análisis del problema

  • Cuando la cantidad de concurrencia es grande, se creará una gran cantidad de subprocesos, lo que consumirá una gran cantidad de recursos del sistema.
  • Después de crear la conexión, si el subproceso actual no tiene datos para leer temporalmente, el subproceso se bloqueará en la operación de lectura, lo que resultará en una pérdida de recursos del subproceso.

2.2 Modo reactor

Se recomienda que aprenda primero sobre NIO: https://blog.csdn.net/qq_36389060/category_11777885.html

Para las dos deficiencias del modelo de servicio de E/S de bloqueo tradicional, la solución:

  • Basado en el modelo de multiplexación de E/S: varias conexiones comparten un objeto de bloqueo y la aplicación solo necesita esperar en un objeto de bloqueo sin bloquear y esperar todas las conexiones. Cuando una conexión tiene datos nuevos que se pueden procesar, el sistema operativo notifica a la aplicación, el subproceso regresa del estado bloqueado y comienza el procesamiento comercial.
  • Multiplexación de recursos de subprocesos en función del grupo de subprocesos: ya no es necesario crear un subproceso para cada conexión, y las tareas de procesamiento comercial después de que se completa la conexión se asignan al subproceso para su procesamiento, y un subproceso puede procesar el negocio de varias conexiones .

La multiplexación de E/S combinada con el grupo de subprocesos es la idea de diseño básica del modo Reactor

  • El nombre correspondiente del Reactor:
    • modo reactor
    • Modo distribuidor (Dispatcher)
    • Patrón de notificador (notificador)
  • modo reactor
    • Una o más solicitudes, pasadas simultáneamente a 服务处理器(基于事件驱动);
    • El programa del lado del servidor procesa varias solicitudes entrantes y las envía a los subprocesos de procesamiento correspondientes de forma síncrona, por lo que el modo Reactor también se denomina modo Dispatcher;
    • El modo Reactor se usa IO复用para escuchar eventos y los distribuye a un cierto hilo (proceso) después de recibir el evento 这点就是网络服务器高并发处理关键.
      inserte la descripción de la imagen aquí

Componentes principales en modo Reactor

  • Reactor: Reactor se ejecuta en un subproceso separado y 负责监听和分发事件se envía a los controladores apropiados para reaccionar a los eventos de E/S. Actúa como un operador telefónico de la empresa, recibe las llamadas de los clientes y desvía las líneas a los contactos adecuados;
  • Controladores: los controladores realizan eventos reales para ser realizados por eventos de E/S, de forma similar a los funcionarios reales de una empresa con la que un cliente desea hablar. Reactor responde a los eventos de E/S mediante el envío de controladores apropiados, que realizan operaciones sin bloqueo.

Taxonomía de patrón de reactor

De acuerdo con la cantidad de reactores y la cantidad de subprocesos del grupo de recursos de procesamiento, hay 3 implementaciones típicas

  • Hilo único de reactor único
  • Multiproceso de un solo reactor
  • Reactor maestro-esclavo multiproceso

2.2.1 Hilo único de reactor único

descripción del plan

  • Select es la API de programación de red estándar introducida en el modelo de multiplexación de E/S anterior, que permite a las aplicaciones monitorear múltiples solicitudes de conexión a través de un objeto de bloqueo.
  • El objeto Reactor monitorea el evento de solicitud del cliente a través de Select y lo distribuye a través de Dispatch después de recibir el evento.
  • Si se trata de un evento de solicitud de establecimiento de conexión, el aceptador maneja la solicitud de conexión a través de Aceptar y luego crea un objeto de controlador para manejar el procesamiento comercial posterior una vez que se completa la conexión.
  • Si no es un evento de establecimiento de conexión, Reactor despachará el Handler correspondiente a la conexión de la llamada para responder
  • El controlador completará el proceso comercial completo de Leer == "Procesamiento comercial == "Enviar
    inserte la descripción de la imagen aquí

Análisis de las ventajas y desventajas del programa.

El lado del servidor utiliza 一个线程para 多路复用manejar todas las operaciones de IO (incluidas la conexión, la lectura, la escritura, etc.), la codificación es simple y clara, pero si la cantidad de conexiones del cliente es grande, no podrá admitirlo. El estuche pertenece a este modelo.

  • Ventajas: el modelo es simple, no hay problemas de subprocesos múltiples, comunicación de procesos y competencia, y todo se completa en un solo subproceso
  • defecto:
    • Los problemas de rendimiento, solo un hilo, no pueden reproducir completamente el rendimiento de la CPU multinúcleo. Cuando el controlador está procesando el negocio en una determinada conexión, todo el proceso no puede manejar otros eventos de conexión, lo que puede conducir fácilmente a cuellos de botella en el rendimiento.
    • Los problemas de confiabilidad, la terminación inesperada de subprocesos o la entrada en un bucle infinito harán que el módulo de comunicación de todo el sistema no esté disponible, no pueda recibir ni procesar mensajes externos, lo que provocará una falla en el nodo.

Escenario de uso: la cantidad de clientes es limitada y el procesamiento comercial es muy rápido, como la complejidad de tiempo de Redis en el procesamiento comercial O (1).

2.2.2 Subprocesamiento múltiple de un solo reactor

descripción del plan

  • El objeto Reactor monitorea los eventos de solicitud del cliente a través de la selección y los distribuye a través del envío después de recibir el evento.
  • Si se establece una solicitud de conexión, el aceptador correcto maneja la solicitud de conexión a través de la aceptación y luego crea un objeto controlador para manejar varios eventos una vez que se completa la conexión.
  • Si no es una solicitud de conexión, será procesada por el controlador correspondiente a la conexión llamada por el reactor.
  • handler 只负责响应事件, no realice un procesamiento comercial específico, después de leer los datos, se distribuirá a un subproceso en el grupo de subprocesos de trabajo para procesar el negocio
  • worker 线程池Se asignará un subproceso independiente para completar el negocio real y el resultado se devolverá al controlador.
  • Después de que el controlador recibe la respuesta, devuelve el resultado al cliente a través de envío
    inserte la descripción de la imagen aquí

Análisis de las ventajas y desventajas del programa.

  • Ventajas: puede aprovechar al máximo la potencia de procesamiento de la CPU multinúcleo.
  • Desventajas: el acceso y el uso compartido de datos de subprocesos múltiples son más complicados, el reactor maneja todo el monitoreo y la respuesta de eventos, se ejecuta en un solo subproceso y es propenso a cuellos de botella de rendimiento en escenarios de alta concurrencia.

2.2.3 Reactor maestro-esclavo multiproceso

descripción del plan

Para el modelo de subprocesos múltiples de un solo reactor, Reactor se ejecuta en un solo subproceso y es fácil convertirse en un cuello de botella de rendimiento en un escenario de alta simultaneidad, por lo que Reactor se puede ejecutar en varios subprocesos.

  • El objeto MainReactor del subproceso principal de Reactor escucha el evento de conexión a través de select, y después de recibir el evento, maneja el evento de conexión a través del Acceptor
  • Después de que el aceptador maneja el evento de conexión, el MainReactor asigna la conexión al SubReactor
  • SubReactor agrega la conexión a la cola de conexión para escuchar y crea un controlador para el procesamiento de varios eventos
  • Cuando ocurre un nuevo evento, el subreactor llamará al controlador correspondiente para su procesamiento
  • El controlador lee los datos a través de la lectura y los distribuye a los siguientes subprocesos de trabajo para su procesamiento
  • El grupo de subprocesos de trabajo asigna subprocesos de trabajo independientes para el procesamiento comercial y devuelve resultados
    inserte la descripción de la imagen aquí

Pros y contras del programa.

  • ventaja
    • La interacción de datos entre el subproceso principal y el subproceso secundario es simple y clara. El subproceso principal solo necesita recibir nuevas conexiones, y el subproceso secundario completa el procesamiento comercial posterior.
    • La interacción de datos entre el subproceso principal y el subproceso secundario es simple. El subproceso principal de Reactor solo necesita pasar la nueva conexión al subproceso secundario, y el subproceso secundario no necesita devolver datos.
  • Desventajas: mayor complejidad de programación

Combinación de ejemplos: este modelo se usa ampliamente en muchos proyectos, incluido el modelo de procesos múltiples Reactor maestro-esclavo de Nginx, el modelo de subprocesos múltiples maestro-esclavo de Memcached, la compatibilidad con el modelo de subprocesos múltiples maestro-esclavo de Netty

3 modelo de subprocesamiento Netty

Netty se 主从 Reactors 多线程模型basa una cierta cantidad de 改进Reactores en los que el modelo de subprocesamiento múltiple Reactor maestro-esclavo tiene múltiples Reactores .

Una breve descripción del modelo de subprocesamiento de Netty

  • El subproceso BossGroup mantiene el Selector y solo se enfoca en Accecpt;
  • Cuando se recibe el evento Accept, se obtiene el SocketChannel correspondiente, se encapsula en un NIOscoketChannel y se registra en el subproceso Worker (bucle de eventos) y se mantiene;
  • Cuando el subproceso Worker escucha el evento de su propio interés en el canal en el selector, lo procesará (por el controlador). Tenga en cuenta que el controlador se ha agregado al canal.
    inserte la descripción de la imagen aquí

Descripción detallada del modelo de subprocesamiento Netty

  • Netty abstrae dos conjuntos de grupos de subprocesos : BossGroup y WorkerGroup
    • BossGroup es responsable de recibir conexiones de clientes
    • WorkerGroup es responsable de la lectura y escritura de la red.
  • Los tipos BossGroup y WorkerGroup son ambos NioEventLoopGroup , NioEventLoopGroup es equivalente a uno 事件循环组, en este grupo 含有多个事件循环, cada ciclo de eventos es NioEventLoop
  • NioEventLoop representa un subproceso que ejecuta tareas de procesamiento en un ciclo continuo 每个NioEventLoop 都有一个selectory se utiliza para monitorear la comunicación de red del socket vinculado a él .
  • NioEventLoopGroup puede tener varios subprocesos, es decir, puede contener varios NioEventLoops
  • Los pasos ejecutados por NioEventLoop en cada Boss Group:
    • 1) Evento de aceptación de encuesta
    • 2) Procesar el evento de aceptación, establecer una conexión con el cliente, generar NioScocketChannel,并将其注册 Worker Group 上的某个 NIOEventLoop 上的 selector
    • 3) Procesar tareas en la cola de tareas, a saber, runAllTasks
  • Los pasos realizados por el ciclo NIOEventLoop en cada Grupo de Trabajo:
    • 1) Sondeo de eventos de lectura/escritura
    • 2) Manejar eventos de E/S, es decir, eventos de lectura/escritura, y procesarlos en el NioSocketChannel correspondiente
    • 3) Procesar tareas en la cola de tareas, a saber, runAllTasks
  • Cada Worker NIOEventLoop utiliza una canalización (pipeline) al procesar el negocio. El pipline contiene el canal, es decir, el canal correspondiente se puede obtener a través del pipline, y el pipline mantiene una gran cantidad de controladores (procesadores) para realizar una serie de procesamiento en nuestros datos.
  • El manejador (procesador) tiene Netty incorporado, y también podemos definirlo nosotros mismos.
    inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_36389060/article/details/124232377
Recomendado
Clasificación