Galería de mapas mentales Ruta de avance de arquitecto Java p5-p7 con salario anual de 500.000-700.000
Ruta de avance del arquitecto Java p5-p7 con un salario anual de 500,000-700,000, algoritmo y estructura de datos prácticos, modelo de estructura de datos de solución de microservicio, ajuste práctico del rendimiento de la máquina virtual JVM. Práctica de programación concurrente, interpretación del código fuente del marco de microservicios, interpretación del código fuente del marco de colección, soluciones de arquitectura distribuida. Diseño e implementación real de la arquitectura de transacciones distribuidas de Internet, principios del middleware de mensajes distribuidos, optimización del rendimiento real de MySQL e interpretación profunda del código fuente de Netty.
Editado a las 2023-11-21 16:53:38,プロジェクトマネジメントとは、専門的な知識、スキル、ツール、方法論をプロジェクト活動に適用し、限られたリソースの制約の中で、プロジェクトが設定された要件や期待を達成、またはそれ以上にできるようにするプロセスである。 この図は、プロジェクトマネジメントプロセスの8つの構成要素を包括的に示したものであり、一般的なテンプレートとして利用することができる。
プロジェクトマネジメントとは、専門的な知識、スキル、ツール、方法論をプロジェクト活動に適用し、限られたリソースの制約の中で、プロジェクトが設定された要件や期待を達成、またはそれ以上にできるようにするプロセスである。 この図は、プロジェクトマネジメントプロセスの8つの構成要素を包括的に示したものであり、一般的なテンプレートとして利用することができる。
世界的に著名な科学者、航空力学者、中国有人宇宙飛行の創始者、中国科学院および中国工程院の院士、「二元一星勲章」受章者、「中国宇宙飛行の父」、「中国ミサイルの父」、「中国自動制御の父」、「ロケットの王」として知られる。 中国宇宙の父」、「中国ミサイルの父」、「中国自動制御の父」、「ロケット王」として知られる。
プロジェクトマネジメントとは、専門的な知識、スキル、ツール、方法論をプロジェクト活動に適用し、限られたリソースの制約の中で、プロジェクトが設定された要件や期待を達成、またはそれ以上にできるようにするプロセスである。 この図は、プロジェクトマネジメントプロセスの8つの構成要素を包括的に示したものであり、一般的なテンプレートとして利用することができる。
プロジェクトマネジメントとは、専門的な知識、スキル、ツール、方法論をプロジェクト活動に適用し、限られたリソースの制約の中で、プロジェクトが設定された要件や期待を達成、またはそれ以上にできるようにするプロセスである。 この図は、プロジェクトマネジメントプロセスの8つの構成要素を包括的に示したものであり、一般的なテンプレートとして利用することができる。
世界的に著名な科学者、航空力学者、中国有人宇宙飛行の創始者、中国科学院および中国工程院の院士、「二元一星勲章」受章者、「中国宇宙飛行の父」、「中国ミサイルの父」、「中国自動制御の父」、「ロケットの王」として知られる。 中国宇宙の父」、「中国ミサイルの父」、「中国自動制御の父」、「ロケット王」として知られる。
El camino hacia el avance como arquitecto JAVA
Práctica de estructura de datos y algoritmos.
Repaso de conocimientos de matemáticas.
índice
logaritmo
serie
módulo aritmético
la complejidad
complejidad del tiempo
complejidad espacial
estructura de datos
modelo de pila
Principio de primero en entrar, último en salir
Estallar/Empujar
aplicación de pila
modelo de cola
principio de primero en entrar, primero en salir
cola secuencial
cola encadenada
deque
cola de prioridad
modelo de arbol
Árbol binario
árbol AVL
árbol binario de pistas
árbol negro rojo
árbol extendido
modelo hash
función hash
Método de detección lineal
método de detección de cuadrados
doble hash
Método de función hash
método de direccionamiento directo
analítica digital
Método cuadrado-medio
método de plegado
método de división dejando resto
método de números aleatorios
Cómo manejar los conflictos
Sondeo lineal y luego hash
sondeo al cuadrado y hash
modelo de montón
pila izquierda
pila sesgada
práctica de algoritmos
Algoritmo de clasificación
tipo de inserción
clasificación de colinas
clasificación de montón
fusionar ordenar
Ordenación rápida
Ordenamiento de burbuja
Algoritmo práctico
algoritmo codicioso
Codificación Huffman
Problema aproximado de embalaje del contenedor
algoritmo divide y vencerás
Tiempo de ejecución del algoritmo divide y vencerás
Problemas recientes
Seleccionar pregunta
programación dinámica
Utilice una tabla en lugar de recursividad
El orden de la multiplicación de matrices.
árbol de búsqueda binaria óptimo
El camino más corto para todos los pares de puntos.
algoritmo de aleatorización
generador de números aleatorios
mesa de salto
prueba de aptitud
Modelo de estructura de datos de solución de microservicio
Algoritmo de clúster del centro de registro
Algoritmo de balsa electoral de clúster de Nacos
Algoritmo de propagación epidémica Protocolo P2P-Gossip
Protocolo de coherencia de transmisión de mensajes Eureka
Protocolo de coherencia de transacciones distribuidas
Protocolo de consistencia fuerte
Protocolo de consistencia débil
protocolo de coherencia eventual
Algoritmo del protocolo de consenso de Zookeeper
Protocolo de transmisión atómica ZAB
Protocolo de consenso de Paxos
Algoritmo de eliminación de caché distribuida
Algoritmo de desalojo de caché LRU (uso menos reciente)
Algoritmo de desalojo de caché LFU (algoritmo menos utilizado)
Algoritmo de eliminación de caché ARC (Algoritmo de reemplazo de caché adaptativo)
Algoritmo de desalojo de caché FIFO (primero en entrar, primero en salir)
Algoritmo de desalojo de caché MRU (usado más recientemente)
Protocolo de desglose de caché distribuida
filtro de floración
filtro de cuco
Algoritmo de equilibrio de carga
Algoritmo del mecanismo de sondeo
algoritmo aleatorio
algoritmo de ip fija
algoritmo de peso
Algoritmo de limitación de corriente de microservicio
Algoritmo de contador (ventana fija)
algoritmo de ventana deslizante
algoritmo de cubo con fugas
Algoritmo de depósito de tokens
Algoritmo de programación de tareas informáticas distribuidas (xxl-job)
método de rotación
método de ponderación
hash
método de unión mínima
método de falta mínima
método de respuesta más rápido
algoritmo genético
Solución de algoritmo de colonia de hormigas
Protocolo de coherencia y sincronización de datos distribuidos
mysql
replicación semisincrónica
replicación asincrónica
Sincronización global
cache
canal
nutria
(openresty/tengine) Alta concurrencia real
Módulo central nativo de Nginx
Tipos de módulos Nginx
Módulo HTTP estándar
Módulo HTTP opcional
Módulo de terceros (lua)
Modelo y características basados en eventos de Nginx
Configuración central de Nginx
Configuración de host virtual
río arriba
ubicación
Configuración de directorio estático
configuración del protocolo https
Configuración del algoritmo de equilibrio de carga de Nginx
Algoritmo del mecanismo de sondeo
algoritmo aleatorio
algoritmo de ip fija
algoritmo de peso
openresty/tengine
Openresty se combina con Lua para crear una página de detalles del producto de mil millones de niveles
Tengine es un proyecto de servidor web desarrollado por Alibaba
Ajuste práctico del rendimiento de la máquina virtual JVM
Historia del desarrollo del lenguaje de programación.
Lenguaje ensamblador/lenguaje de máquina
lenguaje C/C
java/php/lenguaje fácil/ython
Cargador de clases JVMClassLoader
Análisis del principio de implementación del cargador de clases a partir del código fuente de la máquina virtual (C) HotSpot
¿Qué es un cargador de clases?
Leer nuestro archivo de clase en la memoria.
Clasificación de cargadores de clases.
Cargador de clases Bootstrap (escrito en C)
$JAVA_HOME/jre/lib
Cargador de clases de extensión (escrito en Java)
JAVA_HOME/jre/lib/ext
(Aplicación) Cargador de clases AppClassLoader (escrito en Java)
Paquetes de clase y jar bajo classpath
Cargador de clases personalizado (escrito en java)
Directorio de archivos de clase personalizado
Beneficios del mecanismo de delegación parental
El propósito es evitar conflictos entre las clases definidas por los desarrolladores y las clases de código fuente definidas por jdk, y garantizar la unicidad de la clase en la memoria.
Principio de delegación de padres del cargador de clases y cómo romperlo
mecanismo spi
Análisis en profundidad del código fuente del cargador de clases de inicio/extensión/aplicación
Principio de la interfaz del proveedor de servicios Java SPI
Principio de implementación del cargador de clases Tomcat/Jetty
Cómo personalizar un cargador de clases para cargar código de bytes y complemento de implementación en caliente escrito a mano
Disco local
Adquisición de red
base de datos
Generación de proxy dinámico
guerra/tarro
Análisis de los principios de la estructura de la memoria JVM.
Zona de tiempo de ejecución de JVM
contador de programa
Registre el número de línea del hilo actual que ejecuta el código para facilitar el siguiente cambio de contexto de la CPU para reanudar la ejecución.
montón
Los nuevos objetos se almacenan en el montón (compartidos por subprocesos).
Solución de problemas de pérdidas de memoria del montón en un entorno de producción
pérdida de memoria
¿Qué es una pérdida de memoria del montón?
Espacio de aplicación de memoria dinámica, GC no puede liberar la memoria
Escenarios donde ocurren pérdidas de memoria
pérdida de memoria local de subprocesos
Pérdida de memoria del objeto clave personalizado de hashMap
Solución de problemas de pérdidas de memoria del montón en un entorno de producción
Jps/Jmap
jvisualvm/jconsole
desbordamiento de memoria
¿Qué es el desbordamiento de memoria del montón?
Al solicitar espacio en la memoria del montón, no hay suficiente espacio.
Desbordamiento de memoria del montón
La cantidad de datos cargados en la memoria es demasiado grande, como por ejemplo, recuperar demasiados datos de la base de datos a la vez.
Hay una referencia al objeto en la clase de colección, que no se borra después de su uso, lo que hace que la JVM no pueda reciclarlo.
Hay un bucle infinito en el código o el bucle genera demasiadas entidades de objetos duplicados.
El valor de la memoria del parámetro de inicio establece que la memoria del montón es demasiado pequeña.
Solución de desbordamiento de memoria
Aumentar la memoria del montón
Detalles de la estructura de la memoria del montón
División de estructura de montón
Nueva Generación/Vieja Generación
nueva generación
El objeto recién creado se almacena en la nueva generación.
vejez
Los objetos de uso frecuente se almacenan en la generación anterior.
versión JDK
jdk1.7
eden (Jardín del Edén) de (s0) a (s1) generación permanente (área de método)
jdk1.8
eden (Jardín del Edén) de (s0) a (s1) generación permanente (metaespacio)
característica:
La relación predeterminada entre la nueva generación y la antigua generación es 1:2
-XX:Nueva relación
Edén predeterminado con s0/s1 8:1:1
-XX: Ratio de supervivencia
Palabras comunes
YoungGen (nueva generación)
oldGen (vieja generación)
s0(de)
s1(a)
PermGen (generación permanente)
metaespacio
Clasificación de GC
colección parcial
Colección de nueva generación (Minor GC/Young GC)
Colección de vieja generación (Major GC/Old GC)
CMS GC recopilará la generación anterior por separado.
Colección de áreas de método y montón
(GC completo): recopila la recolección de basura de todo el área de método y montón de Java (metaespacio)
Preguntas comunes de la entrevista
La diferencia entre GC completo y GC menor/GC joven
El gc completo activará la recopilación de nueva generación y de antigua generación.
GC menor desencadena una colección de GC de nueva generación
Los tiempos de recolección de GC menores son muy frecuentes
full gc activa el reciclaje cuando no hay suficiente memoria en la generación anterior o en el área de método (metaespacio)
La eficiencia de recuperación de GC del GC completo es muy baja
Intente no activar el reciclaje completo de GC
¿Dónde se guardan los objetos grandes?
Si el área del Edén no se puede guardar, se almacenará directamente en la generación anterior.
Análisis de registros de GC
escape de la memoria
Garantía de espacio
Análisis de la estructura interna de la pila de hilos y el marco de la pila.
tabla de variables locales
pila de operandos
conexión dinámica
exportación de métodos
Tecnología de pila de métodos locales (JNI llamando a código C)
Grupo constante de cadenas
Clasificación de grupo constante
grupo constante estático
Ejecutar grupo constante
Grupo constante de cadenas
Grupo constante para diferentes áreas de almacenamiento de versiones JDK
El grupo de constantes de cadena en JDK1.6 y anteriores se almacena en el área de método (generación permanente)
En JDK1.7, el grupo de constantes de cadenas comienza a almacenarse en el montón
El grupo de constantes de cadenas en JDK1.8 se almacena en el montón
Preguntas comunes de la entrevista sobre cadenas
¿Por qué JDK1.7 comenzó a almacenar el grupo de constantes de cadenas en el montón?
En JDK7, el grupo de constantes de cadena se coloca en el espacio del montón. Debido a que la eficiencia de reciclaje de la generación permanente es muy baja, la recolección de basura de la generación permanente solo se ejecutará durante el GC completo, y el GC completo se activará cuando no haya suficiente espacio en la generación anterior y la generación permanente sea insuficiente. .
Esto da como resultado una baja eficiencia de reciclaje del grupo constante de cadenas. En nuestro desarrollo, se creará una gran cantidad de cadenas y la eficiencia de reciclaje será baja, lo que resultará en una memoria de generación permanente insuficiente. Colocarlo en el montón puede recuperar memoria a tiempo.
Cadena s1 = "mayikt";
String s1 = "mayikt"; s1 apunta al grupo de constantes de cadenas
nueva cadena("mayikt");
Cree una dirección de espacio de montón en el montón y devuélvala a s2 s2 obtiene la dirección de la memoria del montón y mayikt introduce el grupo de constantes de cadena en la clase String.
Diseño de memoria de objetos JVM
disposición del objeto
encabezado de objeto
Datos de instancia
Alinear el relleno
¿Cuántos bytes ocupa un nuevo objeto?
Ubicación de acceso al objeto
modo de manejo
Una parte de la memoria se puede dividir en el montón de Java como un grupo de identificadores. Lo que se almacena en la referencia en la variable local es la dirección del identificador del objeto.
método de puntero directo
Lo que se almacena en referencia es directamente la dirección del objeto.
Cómo se crean los objetos
1.nuevo objeto
2. Crea objetos usando la reflexión.
3. Utilice clone() para clonar el objeto.
4. Utilice objetos deserializados
5. La biblioteca de terceros Objenesls crea objetos
Crear detalles del objeto
1. Compruebe si la clase del objeto se ha cargado, analizado e inicializado.
1. Cuando la máquina virtual Java encuentra una nueva instrucción de código de bytes, primero verificará si los parámetros de esta instrucción pueden ubicar la referencia simbólica de la clase en el grupo constante (en el metaespacio) y verificará la clase representada por esta referencia simbólica. Si se ha cargado, analizado e inicializado (para determinar si el metaespacio ha cargado la clase)
De lo contrario, primero se debe ejecutar el proceso de carga de clases correspondiente (luego use el mecanismo de delegación principal para encontrar la clase (ruta completa de la clase); si no se encuentra, se informará un error: ClassNotFoundException).
2. Una vez pasada la verificación de carga de clases, la máquina virtual asignará memoria para el nuevo objeto.
Úselo si la memoria del montón es regular
colisión de puntero
Úselo si la memoria del montón es irregular
lista libre
3. La creación de objetos es un comportamiento muy frecuente en una máquina virtual. Incluso si solo modifica la ubicación señalada por un puntero, no es seguro para subprocesos en circunstancias concurrentes.
1. Utilice el reintento fallido de CAS para garantizar la atomicidad de las actualizaciones;
2. Asigne una parte del espacio TLAB única al hilo actual en Eden (Eden Campus) para cada hilo.
4. Establezca el valor predeterminado del atributo Una vez completada la asignación de memoria, la máquina virtual debe inicializar el espacio de memoria asignado (pero sin incluir el encabezado del objeto) a cero. Si se utiliza TLAB, este trabajo también se puede asignar por adelantado. a TLAB. Por cierto. Este paso garantiza que los campos de instancia del objeto se puedan usar directamente en el código Java sin asignar valores iniciales, de modo que el programa pueda acceder a los valores cero correspondientes a los tipos de datos de estos campos.
5. Establezca la información del encabezado del objeto. La máquina virtual Java también necesita realizar las configuraciones necesarias para el objeto, como de qué clase es una instancia el objeto, cómo encontrar la información de metadatos de la clase y el código hash del objeto. (En realidad, el código hash del objeto se retrasará hasta que se llame realmente al método Object::hashCode()), la edad de generación de GC del objeto y otra información. Esta información se almacena en el encabezado del objeto (Object Header) del objeto. Dependiendo del estado de ejecución actual de la máquina virtual, como si el bloqueo de polarización está habilitado, etc., el encabezado del objeto se configurará de diferentes maneras.
6. Ejecute el método init para la inicialización.
Algoritmo de recolección de basura JVM
Algoritmo de recolección de basura
Algoritmo de marca y barrido
Ventajas: alta eficiencia/sin direcciones de memoria móviles
Desventajas: propenso a la fragmentación
algoritmo de clasificación de etiquetas
Ventajas: evita problemas de fragmentación
Desventajas: mover dirección de memoria, baja eficiencia
Algoritmo de copia marcada
Ventajas: evita problemas de fragmentación
Desventajas: mover dirección de memoria, alta eficiencia
Principio del algoritmo generacional.
nueva generación
vejez
Colector JDK1.0-14
Combinación de recolector de basura
(Paralelo en la nueva generación) ParNew (serie en la generación anterior) Serie antigua
(Serie de nueva generación) Serie, (Generación anterior) Serie antigua
(Serial de nueva generación) Serial/CMS (Simultaneidad de generación anterior)
(JDK9 obsoleto)
(Concurrencia en la nueva generación) ParNew/CMS (Concurrencia en la vieja generación)
(No recomendado para JDK9)
(Paralelo de nueva generación) Parallel/SerialOld (Serie de antigua generación)
No recomendado
(Paralelo en la nueva generación) Parallel Scavenge/Parallel Old (paralelo en la vieja generación)
JDK8 predeterminado
G1 (valor predeterminado de JDK9) colección completa del montón
JDK8 predeterminado
Serie (reciclaje de subprocesos de GC único)
Explicación detallada del recolector de basura en serie
combinación
Algoritmo de replicación marcado (en serie) de nueva generación
Algoritmo de compresión de marca antigua en serie
Escenarios de aplicación
Utilice CPU de un solo núcleo y poca memoria
Paralelo (reciclaje de múltiples subprocesos de GC)
Explicación detallada del recolector de basura ParNew
Escenarios de aplicación
nueva generación
Adecuado para CPU multinúcleo
combinación
(Antigua generación) Serie antigua (algoritmo de compresión de marcas)
(Antigua generación) CMS (algoritmo de marca y barrido)
Explicación detallada del recolector de basura paralelo
Escenarios de aplicación
Múltiples colecciones de GC de nueva generación/antigua generación al mismo tiempo
combinación
Paralelo
GC antiguo paralelo
Concurrencia (GC y subprocesos de usuario se ejecutan simultáneamente)
Principio del recolector de basura de CMS (puntos clave)
Principio de implementación
marca inicial
marcado concurrente
reetiquetar
Borrado concurrente
¿Cuáles son las deficiencias del recopilador CMS?
El algoritmo de marca y barrido causa un problema de fragmentación
La alternativa SerialOld es ineficiente
Resuelva el problema de las etiquetas faltantes según el método de actualización incremental
Principio del colector G1 (puntos clave)
Principio de implementación
n múltiples regiones diferentes
Conjunto de memoria de región (Recordar conjunto)
Explicación detallada de Cardtable
Resuelva el problema de señalización del edificio basándose en la instantánea original (satb)
Explicación detallada del recolector de basura ZGC
Explicación detallada de los recolectores de basura de Epsilon y Shenandoah.
algoritmo de copia basura
Principio del algoritmo de marcado de tres colores del mecanismo de recolección de basura.
Problemas de etiquetado múltiple/etiquetado faltante causados por el algoritmo de marcado de tres colores
basura flotante
Problema de oferta faltante
Solución de etiqueta faltante de objeto
Basado en el método de actualización incremental (CMS)
Basado en el método de instantánea original satb(G1)
Explicación detallada del conjunto de memoria de región (Remember Set) y la tabla de tarjetas (Cardtable)
parar el mundo
¿Por qué ocurre el problema de detener el mundo?
Cómo evitar el problema de detener el mundo
Explicación detallada de las herramientas de ajuste de JVM
Explicación detallada de los comandos de ajuste Jstat, Jinfo, Jmap, Jhat y Jstack propios de JDK
Explicación detallada de las herramientas de ajuste de Jvisualvm y Jconsole
Explicación detallada del uso de la herramienta Arthas de Alibaba.
Herramienta de análisis de registros de GC
Cómo leer los detalles del registro de GC
Uso de la herramienta de análisis de registros GCEasy
Uso de la herramienta de análisis de registros GCViewer
Práctica de ajuste de parámetros de JVM
Configuración y ajuste de parámetros de recolección de basura de generación joven y generación anterior de memoria de montón de proyecto de tráfico de 100 millones de niveles
Entorno de producción en línea Herramienta de monitoreo de desbordamiento de memoria OMM y solución de posicionamiento
Prácticas de optimización sobre cómo reducir la GC completa grave en entornos de producción en línea que provocan congelaciones directas del sistema
Sistema de alta concurrencia, cómo evitar operaciones frecuentes de GC en un entorno de producción en línea
Sistema de alta concurrencia, cómo optimizar el recopilador G1/CMS
Cómo configurar el tamaño de memoria inicial del montón de JVM para el servicio de PV promedio diario de millones
Programación concurrente en la práctica.
Conceptos básicos del sistema operativo
Proceso de cambio entre modo usuario y modo kernel
Gestión de modelos de procesos de Linux
Principio de comunicación entre procesos de Linux
Principios de comunicación de la red Linux
Conceptos básicos de subprocesos múltiples
Inicio rápido con subprocesos múltiples
¿Qué es un proceso/hilo?
El proceso es la unidad más pequeña de asignación de recursos.
El hilo es la unidad más pequeña de ejecución del programa.
Escenarios de aplicaciones multiproceso
Desarrollo de cliente (aplicación móvil/)
Enviar SMS/Enviar correo electrónico de forma asincrónica
Cambie el código que tarda en ejecutarse a una ejecución asincrónica de subprocesos múltiples.
Escribir registro de forma asincrónica
Descarga multiproceso
Diferencia entre subprocesos múltiples y subprocesos únicos
Multihilo (ejecución paralela)
Hilo único (ejecución sincrónica)
Cómo entender el concepto de conmutación de CPU multiproceso
La CPU actual cambia para ejecutar otro hilo.
¿Es cierto que cuanto más subprocesos múltiples esté habilitado, mejor?
No necesariamente. Abrir demasiados subprocesos puede provocar fácilmente un cambio de contexto de la CPU.
La diferencia entre hilos de usuario y hilos de demonio
Cómo detener un hilo con gracia
Análisis de siete estados de subprocesos múltiples.
estado inicial
estado listo
Estado de funcionamiento
<font face="宋体"><span style="font-size: 14px;">Estado de muerte</span></font><br>
estado de bloqueo
espera de tiempo de espera
estado de espera
Cinco formas de crear subprocesos múltiples
Heredar la clase Thread para crear un hilo
Implementar la interfaz Runnable para crear un hilo.
Crear hilos usando Callable y Future
Utilice un grupo de subprocesos como el marco Executor
Cree un hilo usando la anotación asíncrona @Async
Crear un hilo usando expresión lambda
Seguridad de hilos múltiples
¿Qué es el problema de seguridad del hilo?
Cuando varios subprocesos escriben en la misma variable global al mismo tiempo, otros subprocesos pueden interferir en ellos, lo que puede provocar problemas de seguridad de subprocesos.
La diferencia entre bloqueo y bloqueo sincronizado
lock Adquirir y liberar bloqueos manualmente
Sincronizado adquiere y libera cerraduras automáticamente
SynchronizedJDK6 inicia el proceso de actualización automática del bloqueo
La implementación subyacente del bloqueo se basa en el bloqueo aqs y requiere una actualización manual del bloqueo.
Problema de interbloqueo de subprocesos múltiples
Cómo solucionar problemas de interbloqueo con subprocesos múltiples
jconsole.exe diagnostica un punto muerto
Causas del interbloqueo de subprocesos múltiples
Sincronización anidada dentro de sincronización
Cómo resolver problemas de seguridad de subprocesos (cómo garantizar la sincronización de subprocesos)
Sincronizado resuelve problemas de seguridad de subprocesos
El código de sincronización sincronizado es rápido.
método de instancia modificado sincronizado
método estático modificado sincronizado
El bloqueo de bloqueo resuelve el problema de seguridad del hilo
Comunicación entre múltiples hilos.
espera y notifica
esperar libera el bloqueo actual y bloquea el hilo actual
notificar despierta el hilo bloqueado
El principio del método de unión.
La capa inferior se basa en la encapsulación de espera.
principio sincronizado
Cómo se compone un objeto
encabezado de objeto
Marcar palabra
Código hash (HashCode), edad de generación de GC, indicador de estado de bloqueo, bloqueo retenido por subproceso, ID de subproceso sesgado, marca de tiempo sesgada
Puntero de clase<br>
Datos de instancia
propiedades de miembros
Alinear el relleno
El tamaño del objeto debe ser un múltiplo entero de 8 bytes. Si no es un múltiplo entero de 8 bytes, se alineará y rellenará.
Proceso de actualización de bloqueo sincronizado
bloqueo de polarización
El bloqueo y el desbloqueo no requieren una sobrecarga adicional. Solo son adecuados para que el mismo subproceso acceda al bloque de código sincronizado sin sobrecarga adicional. Si varios subprocesos compiten al mismo tiempo, el bloqueo se revocará.
Cerradura ligera
Los subprocesos en competencia no se bloquearán, lo que mejora la velocidad de respuesta del programa. Si nunca se obtiene el subproceso en competencia para el bloqueo, se utilizará spin para consumir recursos de CPU. Es adecuado para situaciones en las que los bloques de código sincronizados se ejecutan muy rápidamente. rotación después 7)
bloqueo de peso
La competencia de subprocesos no utiliza giro, no consume recursos de la CPU y es adecuada para la ejecución de código sincrónico durante un tiempo relativamente largo.
Análisis del principio del proceso de expansión de bloqueo sincronizado.
Bloqueo de polarización(101)
1. El hilo actual obtiene si es un bloqueo sesgado a partir de la palabra de marca en el encabezado del objeto. Si es un bloqueo sesgado, determine si la identificación del hilo === la identificación del hilo actual.
2. Si es igual a la identificación del hilo actual, la operación CAS no se realizará repetidamente, sino que ingresará directamente a nuestro bloque de código de sincronización.
3. Si no es igual a la ID del hilo actual, si se trata de una situación sin bloqueo y no hay otros hilos compitiendo conmigo, use CAS directamente para modificar el estado del bloqueo en Markword a 101 y también almacene la ID del hilo actual. en palabra clave.
4. Otros subprocesos comienzan a competir con el subproceso de bloqueo de polarización. Si el número de cancelaciones de bloqueo de polarización llega a 20, redirigirán directamente el bloqueo de polarización al subproceso T2 en lotes (nota: no hay otros subprocesos que compitan con t2). El número de cancelaciones de bloqueos de sesgo llega a 20, 40 veces, la deshacer por lotes comenzará más tarde.
5. Para cancelar el bloqueo sesgado, debemos detener nuestro hilo de bloqueo sesgado en un punto seguro global, modificar nuestra palabra de marca a un bloqueo liviano y activar el hilo de bloqueo sesgado.
6. Nota: JDK15 desactiva la optimización de bloqueo sesgado de forma predeterminada.
Candado ligero(000)
1. Si varios subprocesos compiten por el mismo bloqueo al mismo tiempo, actualice el bloqueo liviano y use CAS (modifique el estado del bloqueo de markword = 00, si tiene éxito, reemplácelo con markword y almacene el valor de HashCode directamente en nuestro marco de pila). , La dirección del registro de bloqueo se almacena en markword
2. Cuando usamos un candado liviano para liberar el candado, el contenido del valor de la palabra clave se restaura
Peso pesado (010) (Monitor C)
1. Si nuestro hilo lo ha reintentado varias veces y aún no ha adquirido el bloqueo, el bloqueo actual se actualizará a un bloqueo pesado.
2.2 Los subprocesos que no han adquirido el bloqueo se almacenarán en la colección EntryList del objeto C Monitor. Al mismo tiempo, el subproceso actual bloqueará y liberará directamente los derechos de ejecución de la CPU. El costo del proceso de reactivación y reingreso a la competencia. El bloqueo en el período posterior es muy alto porque es necesario cambiar el contexto de la CPU. Cambie del modo de usuario al kernel y cambie el valor de la palabra clave en el encabezado de nuestro objeto a C Monitor. El puntero de dirección de memoria del objeto Java está asociado con C Monitor.
C Bloqueo del monitor (bloqueo pesado)
Monitor (objeto de bloqueo pesado)
recursiones (número de recursiones/número de reingresos)
propietario (registra el ID del hilo que actualmente contiene el candado)
waitSet (los subprocesos que esperan que el grupo esté en estado de espera se agregarán a _WaitSet)
EntryList (grupo de bloqueo: los subprocesos que esperan el estado del bloque de bloqueo se agregarán a la lista)
Cuando se despierte el hilo en el grupo de espera, ¿se obtendrá el bloqueo inmediatamente?
Una vez que se despierta el hilo en el grupo de espera, el grupo de espera se transfiere al grupo de bloqueo y se pone en cola para competir por el bloqueo nuevamente.
Bloqueo de engrosamiento, eliminación y optimización del rendimiento.
Desbaste de cerraduras
Cada hilo mantiene el candado durante el menor tiempo posible.
Eliminación de cerraduras
La eliminación de bloqueos es un método de optimización de bloqueos que ocurre en el nivel del compilador.
principio de palabra clave volátil
propiedades de palabras clave
Garantizar la visibilidad
Deshabilitar reordenamiento
No hay garantía de atomicidad
modelo de memoria java
Análisis de la arquitectura de hardware multinúcleo de la CPU.
jmm ocho especificaciones de sincronización
Protocolo de coherencia de caché volátil
cerradura de autobús
protocolo MESI
El problema del intercambio falso
Conceptos básicos de líneas de caché.
Plan de llenado bancario
¿Por qué es necesario agregar volátil al reordenamiento/barrera de memoria/bloqueo de doble verificación?
La diferencia entre sincronizado y volátil.
Por qué Volatile no garantiza la atomicidad
Clasificación de bloqueos concurrentes.
cerradura pesimista
bloqueo optimista
bloqueo de giro
Bloqueo de reentrada
cerradura justa
bloqueo injusto
interpretación del código fuente de aqs
Interpretación del código fuente de LockSupport
Interpretación del código fuente de AbstractQueuedSynchronizer
ReentrantLock/ReentrantReadWriteLock, interpretación del código fuente de ReadWriteLock
Interpretación del código fuente de Semaphore/CountDownLatch/CyclicBarrie
Cómo implementar la capa inferior de AQS
A.Cas garantiza la seguridad de los subprocesos de AQS
B. La lista doblemente enlazada almacena hilos bloqueados
C.LockSupport bloquea y activa subprocesos
atributos centrales
valor del estado del estado
Estado del nodo (estado de espera)
-2 El hilo actual bloquea y libera el bloqueo al mismo tiempo.
-1 despierta el hilo de los nodos posteriores<br>
Escenarios de aplicación de AQS
La implementación subyacente de lock lock
Bloqueo justo y bloqueo injusto
El valor predeterminado es un bloqueo injusto.
Tiempo de bloqueo de contención
Candado justo: al competir por un candado, si el candado ya está en manos de otro hilo, se almacenará directamente al final de la lista doblemente enlazada.
Bloqueo injusto: al competir por un bloqueo, si el bloqueo ya está en manos de otro subproceso, CAS se intentará nuevamente.
Principios básicos de diseño
método de bloqueo()
Utilice CAS para modificar el valor de estado en la clase AQS de 0 a 1
Si el cambio es exitoso (el bloqueo se adquiere exitosamente)
Si el cambio falla (no se pudo obtener el bloqueo)
Almacenado en la lista doblemente enlazada de AQS
método de desbloqueo()
Utilice CAS para modificar el estado en la clase AQS de 0 a 1
Si CAS tiene éxito
Necesita reactivar el hilo almacenado en caché por el siguiente nodo del nodo principal en la lista doblemente enlazada de AQS
Pregunta: ¿Por qué desbloquear libera el bloqueo y solo activa un subproceso en lugar de varios subprocesos?
La capa inferior utiliza una lista enlazada bidireccional para almacenar subprocesos bloqueados. El costo de activar todos los subprocesos es muy alto.
No existe un proceso de actualización de bloqueo en el bloqueo y los desarrolladores deben expandirlo ellos mismos.
Código fuente de ConcurrentHashMap1.7 subyacente a Lock
Condición
Nota: La condición y el bloqueo no utilizan la misma lista doblemente enlazada
Bloquear grupo y esperar grupo
Grupo de bloqueo: se refiere a los subprocesos en el bloqueo que no pudieron competir por el bloqueo y se almacenan en la lista doblemente enlazada de AQS.
Grupo de espera: se refiere al hilo actual que llama al método de espera, libera activamente el bloqueo (valor de estado de aqs = 0) y lo almacena en la lista doblemente enlazada del grupo de espera.
¿Cómo despertar el hilo en el grupo de espera?
Llamar a esta señal () solo transfiere los nodos (subprocesos) en el grupo de espera al grupo de bloqueo de lista doblemente enlazada de AQS para competir nuevamente por los recursos de bloqueo.
Después de llamar a esta señal () y llamar al método de desbloqueo, los subprocesos en el grupo de bloqueos de activación comienzan a competir por los recursos de bloqueo.
CountDownLatch(contador)
A través del constructor new CountDownLatch(1)
La implementación subyacente basada en AQS establece el valor de estado en la clase AQS en 1
método de espera
Almacene el bloque de hilo actual en la lista doblemente enlazada de AQS
cuenta regresiva
Opere el valor de estado -1 en la clase AQS. Si el estado de AQS se cambia a 0, active el hilo almacenado en la lista doblemente enlazada en la clase AQS.
Semáforo(Semáforo)
A través del constructor new Semaphore(3)
La implementación subyacente basada en AQS establece el valor de estado en la clase AQS en 3
La operación subyacente de adquirir es modificar el valor de estado -1 en la clase AQS. Si el valor de estado en la clase AQS se cambia a 0, el hilo actual debe bloquearse y almacenarse en la lista doblemente enlazada en la clase AQS.
La capa inferior de la versión opera en el estado 1 en la clase AQS<br>
Despierta los hilos bloqueados en la clase AQS al mismo tiempo (solo se despertará uno)
CyclicBarrier (barrera de sincronización)
A través del constructor new CyclicBarrier(2)<br>
La capa inferior asigna un valor = 2 al atributo de recuento de CyclicBarrier
Llamada en espera de capa inferior
Operación en CyclicBarrier conteo-1
contar=0
Continúe la ejecución y active todos los subprocesos en el grupo de espera
contar!=0
Almacenado en piscina de espera
Operaciones atómicas concurrentes
clase atómica
Principio CAS (bloqueo optimista)
Explicación detallada de la clase de magia insegura.
Principio de bloqueo de colaBlockingQueue
Clasificación de cola de bloqueo
Cola delimitada por matriz ArrayBlockingQueue
Cola delimitada de lista vinculada ConcurrentLinkedQueue
PriorityBlockingQueue ordenación de prioridad de cola ilimitada
DelayQueue retrasa la cola ilimitada
Aplicación marco
Grupo de subprocesos escritos a mano basado en BlockingQueue
Middleware de mensajes escritos a mano basado en BlockingQueue
Marco de registro escrito a mano basado en BlockingQueue
Explicación detallada del grupo de subprocesos del ejecutor y análisis del código fuente principal
¿Por qué utilizar el grupo de subprocesos?
Reutilizabilidad
Gestión unificada
Mejorar la respuesta
Cuatro formas de crear un grupo de subprocesos
newCachedThreadPool(); Grupo de subprocesos almacenable en caché
newFixedThreadPool(); se puede fijar en longitud y limitar el número máximo de subprocesos.
newScheduledThreadPool(); se puede programar
newSingleThreadExecutor();
La capa inferior real se basa en el grupo de subprocesos de encapsulación del constructor ThreadPoolExecutor.
Análisis de los principios básicos del grupo de subprocesos.
Cola de bloqueo vinculada
modelo de productor y consumidor
Por qué Alibaba no recomienda el uso de Ejecutores
El uso subyacente de la cola ilimitada LinkedBlockingQueue es propenso a desbordamiento de memoria
Qué hacer si la cola del grupo de subprocesos está llena
Denegar política
AbortPolicy descarta tareas y genera excepciones de tiempo de ejecución
Tarea de ejecución de CallerRunsPolicy
DiscardPolicy Ignorar, no pasará nada
DiscardOldestPolicy sale de la cola y entra primero en la cola.
Implemente la interfaz RejectedExecutionHandler y personalice el procesador
Cómo configurar correctamente los parámetros del grupo de subprocesos
CPU intensiva
Número óptimo de subprocesos = número de núcleos de CPU o número de núcleos de CPU ±1
Intensivo
Número óptimo de subprocesos = ((tiempo de espera del subproceso, tiempo de CPU del subproceso)/tiempo de CPU del subproceso) * número de CPU
Cómo personalizar el grupo de subprocesos según ThreadPoolExecutor
Interpretación del código fuente de FutureTask
Implementación de FutureTask basado en LockSupport
Implementación de FutureTask basada en Esperar/Notificar
Interpretación del código fuente de ForkJoin
Desarrollo de programación concurrente
mecanismo de robo de trabajo
Principio de unión de horquilla
Interpretación del código fuente local de threads
¿Qué es Threadlocal?
Escenarios de aplicación threadlocal
1.Clase de plantilla de transacción de primavera
2. Obtenga la solicitud http
3.La cadena de llamadas de Aop pasa parámetros
La diferencia entre Threadlocal y sincronizado
Cómo prevenir pérdidas de memoria local en Thread
1. Llame al método de eliminación
2. Al utilizar el método set, se borrará que la clave anterior era nula.
Interpretación del código fuente del marco de microservicios
Interpretación del código fuente de SpringBoot
Cómo funciona la configuración automática de SpringBoot
Interpretación del código fuente del módulo principal SpringBoot
Interpretación del código fuente de las anotaciones principales de SpringBoot
Interpretación del código fuente del contenedor de servlet integrado SpringBoot
Implementación de paquetes SpringBoot y gestión de operación y mantenimiento
Cómo los contenedores de servlet superan a Webflux
Interpretación del código fuente del componente central SpringCloudNetfilix (primera generación)
Interpretación del código fuente de descubrimiento y registro del servicio Eureka
Renovación del servicio Eureka (latido)
Eliminación del servicio del lado del servidor Eureka
Mecanismo de autoprotección del servicio Eureka
¿Qué pasa si el servicio se cae?
Los servicios locales utilizan un mecanismo de reintento
El servicio local implementa la conmutación por error de dirección
Notificación fuera de línea del servicio Eureka
Sincronización de datos del clúster Eureka
Interpretación del código fuente de la llamada al servicio declarativo Fegin
Hystrix implementa limitación de corriente de servicio, degradación e interpretación del código fuente del disyuntor
Explicación detallada de la puerta de enlace unificada de Zuul, enrutamiento de servicios e interpretación del código fuente del filtro
Configuración de la interpretación del código fuente del centro de configuración distribuida
Interpretación del código fuente de seguimiento de enlaces distribuidos de detective
Explicación detallada del equilibrio de carga del cliente Ribbon y análisis del código fuente
Interpretación del código fuente de SpringCloudAlibaba (segunda generación)
Interpretación del código fuente del centro de registro distribuido de Nacos
Registro y descubrimiento de servicios.
Interpretación del código fuente de descubrimiento y registro del servicio Nacos
Principio de registro del servicio.
eurekaCliente
Utilice jerseyClient para enviar una solicitud de registro
eurekaLado del servidor
Utilice ConcurrentHashMap para almacenar en caché las direcciones de la interfaz
La clave es el nombre del servicio.
El valor es la dirección de la interfaz de caché.
Interpretación del código fuente de renovación y detección de latidos del servicio Naocs
De forma predeterminada, EurekaClient envía un paquete de renovación de latidos cada 30 segundos para extender el tiempo y decirle a EurekaServer que todavía estoy vivo.
De forma predeterminada, EurekaServer busca direcciones caducadas en la dirección de caché cada 60 segundos, las almacena en una nueva colección y utiliza un algoritmo aleatorio para borrarlas.
Servicio Naocs fuera de línea y interpretación del código fuente de verificación de estado
Interpretación del código fuente del algoritmo de elección Raft del clúster de Nacos
Mecanismo de procesamiento de sondeo largo del servidor Nacos
Principio de sincronización de datos entre los nodos del clúster Nacos
Interpretación del código fuente del modo AP en Nacos
Interpretación del código fuente del modo CP en Nacos
Solución de cerebro dividido en clúster de Nacos
Centro de configuración distribuida
Principio de implementación del centro de configuración distribuida de Nacos
Cómo actualizar dinámicamente archivos de configuración en Nacos
Gateway Interpretación del código fuente del gateway de microservicio de nueva generación
¿Por qué el rendimiento de Gateway es mejor que el de Zuul?
Análisis del código fuente de enrutamiento dinámico de puerta de enlace
Especificar ruta de coincidencia de regla de tiempo
ruta de coincidencia de cookies
Ruta de coincidencia de encabezado
Ruta de coincidencia de host
Ruta de coincidencia del método de solicitud
Solicitar ruta coincidente
Análisis del código fuente del filtro de puerta de enlace
Filtro de puerta de enlace personalizado
Gateway integra Nacos para lograr equilibrio de carga
Gateway integra Sentinel para implementar la limitación de corriente de la puerta de enlace
Interpretación del código fuente del marco de transacciones distribuidas de Seata
Interpretación del código fuente de los tres componentes centrales de Seata para resolver transacciones distribuidas
Seata genera de forma inversa una declaración SQL basada en la tabla undo_log y revierte la interpretación del código fuente
Interpretación del código fuente del diseño de bloqueo global de transacciones de sucursales de Seata
Interpretación del código fuente de GlobalTransactionalInterceptor
Cómo TM se conecta remotamente a TC para obtener la interpretación del código fuente del ID de transacción global
Interpretación en profundidad del código fuente del código fuente de los espejos delanteros y traseros de Seata
¿Cuáles son las diferencias entre la reversión de Seata y LCN?
Interpretación del código fuente del marco de sincronización de datos distribuidos del canal
Interpretación del código fuente de la arquitectura general del canal
Análisis de la arquitectura del principio de replicación maestro-esclavo de MySQL
Cómo Canal pretende suscribirse a archivos BinLog desde nodos
Principios de diseño de EventParser y EventSink
Principio de diseño de consumo/suscripción incremental del canal
Optimización del rendimiento de sincronización de datos de alta concurrencia del canal
Cómo reducir la latencia de sincronización entre datos
Cómo evitar la coherencia de la secuencia de mensajes de sincronización de datos
Cómo evitar el problema de pérdida de sincronización de datos
Centinela
aislamiento del servicio
Algoritmo de limitación actual
cubo de fichas
cubo agujereado
Implementado basado en semáforo Semáforo
Ventana de conteo fija
ventana de tecnología corredera
Reglas de control de flujo
Hilos
Implementado basado en semáforo Semáforo
QPS
cubo de fichas
Hystrix
Reglas de control de flujo
Aislamiento de semáforo
En centinela
QPS
cubo de fichas
Aislamiento del grupo de subprocesos
Los defectos consumen recursos de la CPU
Método de limitación actual
Google Guayaba (RateLimiter)
Centinela de Alibaba
nginx
Redis lua implementa limitación actual
Se recomienda que la limitación actual se realice en nginx o gateway
Interpretación del código fuente del marco de colección
Hash (función hash) Interpretación del código fuente del marco de colección de mapas
conocimiento básico
La diferencia entre == e igual y la implementación subyacente
¿Por qué reescribir es igual y también reescribir el código hash?
Conversión binaria y decimal/^ (operación OR exclusiva)/>>> (desplazamiento a la derecha sin signo)/ & (operación AND)
Implementación de bajo nivel
JDK1.7
lista enlazada de matriz
Método de inserción de cabeza (problema de bucle infinito de expansión concurrente)
Escribir código es simple
JDK1.8
Array lista enlazada árbol rojo negro
método de inserción de la cola
Escritura de código de alta gama
Conversión de árbol rojo-negro
(Capacidad de la matriz >= 64 y longitud de la lista vinculada mayor que 8)
Número de nodos de árbol rojo-negro <6 lista vinculada de conversión
Cálculo de la función hash
(h = clave.hashCode()) ^ (h >>> 16)
yo = (n - 1) y hash
complejidad del tiempo
La clave no entra en conflicto
La complejidad del tiempo es O (1)
Conflicto clave
El almacenamiento de la lista vinculada es O(N)
El almacenamiento del árbol rojo-negro es O (LogN)
problema de colisión de código hash
Los valores del código hash son los mismos pero los valores del contenido son diferentes.
Características:
La clave es nula para almacenar la posición 0 de la matriz.
Implementado usando una lista enlazada unidireccional
Almacenamiento de hash desordenado
Optimización del rendimiento
Cómo evitar problemas de pérdida de memoria con HashMap
Cómo HashMap reduce la probabilidad de conflictos Hash
Cómo especificar razonablemente el tamaño del valor inicial de la colección en HashMap
Preguntas comunes de la entrevista de HashMap
¿Por qué deberíamos reescribir el método HashCode al reescribir Equals?
Cómo HashMap evita problemas de pérdida de memoria
¿Cómo se implementa la capa inferior de HashMap1.7?
¿Dónde se almacena HashMapKey como nulo?
¿Cómo se implementa la capa inferior de HashMap1.7?
¿Dónde se almacena HashMapKey como nulo?
Cómo HashMap resuelve el problema de conflicto Hash
Cómo HashMap implementa el problema de expansión de matriz
¿La capa inferior de HashMap utiliza una lista enlazada simple o una lista enlazada doble?
Complejidad temporal de la consulta HashMap según la clave
¿Cuáles son las diferencias entre HashMap1.7 y 1.8?
Cómo evitar el problema del bucle infinito de la expansión de subprocesos múltiples en HashMap1.8
¿Por qué HashMap1.8 necesita introducir árboles rojo-negros?
¿Por qué el factor de carga es 0,75 en lugar de 1?
¿Cómo reduce la capa inferior de HashMap la probabilidad de conflictos Hash?
¿Cómo almacena HashMap 10.000 claves de forma más eficiente?
¿Cuáles son los beneficios de las operaciones de módulo y bits altos y bajos de HashMap?
¿Por qué no simplemente usar la clave como valor hash sino realizar una operación XOR con los 16 bits altos?
¿Cómo se implementa la función hash en HashMap?
¿La capa inferior de HashMap se almacena en orden? <br>
¿Cómo logran el orden las capas subyacentes de LinkedHashMap y TreeMap?
Cómo utilizar HashMap en situaciones de alta concurrencia
El principio de implementación subyacente de ConcurrentHashMap
Interpretación del código fuente del marco de colección ConcurrentHashMap
conocimiento básico
sincronizado y bloqueado
Cómo entender el concepto de bloqueo de segmentación
Algoritmo CAS y volátil.
implementación subyacente
JDK1.7
estructura de datos
Implementación de la lista vinculada HashEntry de bloqueo de segmentación de segmentos de matriz
Implementación de bloqueo
Bloqueo de bloqueo Bloqueo optimista CAS Clase INSEGURA
Implementación de expansión de capacidad
Admite la expansión simultánea de múltiples segmentos
jdk1.8
estructura de datos
Utilice la matriz de nodos directamente para guardar datos
Array lista enlazada árbol rojo negro
Implementación de bloqueo
Cancelar diseño de segmento de segmento
El índice no entra en conflicto y utiliza cas lock
Los conflictos de índice utilizan sincronizado
Implementación de expansión de capacidad
Admite expansión simultánea
Características: Admite subprocesos múltiples, alta eficiencia, dividido en 16 segmentos de forma predeterminada
Características:
ConcurrentHashMap no admite clave nula
Análisis del código fuente de la colección de listas.
Implementación subyacente de la lista de matrices
estructura de datos
formación
complejidad del tiempo
Complejidad del tiempo de consulta de subíndice o (1)
Expansión
La expansión es 1,5 veces la original.
No es seguro para subprocesos
Ventajas y desventajas
La eficiencia de agregar y eliminar es baja y requiere expansión, pero la eficiencia de la consulta es relativamente alta.
Implementación subyacente del vector
estructura de datos
formación
complejidad del tiempo
Complejidad del tiempo de consulta de subíndice o (1)
Expansión
La expansión es 2 veces la original.
Seguridad del hilo
Implementación subyacente de LinkedList
Basado en la estructura de datos de la lista vinculada, complejidad del tiempo de consulta de subíndice ()
estructura de datos
lista enlazada
complejidad del tiempo
Búsqueda binaria log2 (n) de complejidad del tiempo de consulta de subíndice
No es seguro para subprocesos
Ventajas y desventajas
La eficiencia de agregar, eliminar y modificar es alta, pero la eficiencia de la consulta es relativamente baja.
Soluciones de arquitectura distribuida
Diseño y práctica de arquitectura idempotente de microservicios de Internet
¿Qué es el diseño idempotente? Antecedentes de producción idempotente.
Tiempo de espera de respuesta del cliente
Cuando el tiempo de ejecución empresarial es muy largo, se recomienda utilizar mq asincrónico.
política de reintento
Resuelva las razones centrales del problema idempotente de las interfaces de servicio
nivel de base de datos
Analizar las razones de la idempotencia desde el nivel arquitectónico.
capa de puerta de enlace
capa de interfaz
Consulte de antemano si la lógica empresarial se ha ejecutado en función del ID global
capa de base de datos
tipo de inserción restricción de anotación única
Mecanismo de bloqueo optimista de tipo de actualización.
¿La identificación global realmente garantiza la idempotencia de la interfaz?
No necesariamente, es necesario considerar el nivel de la base de datos.
Cómo garantizar la idempotencia de las interfaces RPC
identificación global
Mecanismo de bloqueo (no recomendado debido a su baja eficiencia)
Implementar un diseño idempotente basado en escenarios comerciales reales.
Diseño y práctica de arquitectura de cerraduras distribuidas de Internet.
¿Qué escenarios utilizan bloqueos distribuidos?
El problema de garantizar la idempotencia de la programación de tareas programadas.
Ventas flash garantizadas para evitar problemas de sobreventa
El principio de implementación esencial de las cerraduras distribuidas.
Estrategia de reintento
Adecuado para ejecución empresarial muy rápida.
Control de tiempo de espera
Diseño de extensión de vida.
Cómo evitar problemas de punto muerto al continuar con la vida
Optimización del rendimiento
Considere el efecto rebaño
Alta disponibilidad
Establecer tiempo de espera de bloqueo
Granularidad de bloqueo reducida
justicia
Diseño de recuperación y prueba de compatibilidad de bloqueo distribuido
Solución de implementación de bloqueo distribuido
Zookeeper implementa bloqueos distribuidos (modo CP)
Idea principal
Nodo temporal
unicidad del camino
evento de observador
Características
Usar modo cp
ventaja
Solución congénita al problema del cerebro dividido (más de la mitad del mecanismo)
Más confiable y estable
defecto
La eficiencia de los datos de sincronización del clúster es baja
Bajo rendimiento
Dos métodos de implementación
Implementado en base al mismo nodo temporal.
Puede producirse un efecto rebaño
Implementado en base a nodos secuenciales temporales.
Evite problemas de pastoreo
Nodo de número secuencial temporal
Si el nodo actual es el nodo más pequeño, significa que el bloqueo se adquirió correctamente.
Si el nodo actual no es el nodo más pequeño, suscríbase al nodo anterior
Bloqueo distribuido del marco del curador
obtener bloqueo
Implementación basada en nodos de numeración secuencial temporal
Crea un nodo de secuencia temporal y el que sea más pequeño adquirirá el candado.
bloquear
El nodo de secuencia temporal actual creado por usted mismo no es el más pequeño, suscríbase al nodo anterior
desbloquear bloqueo
Eliminar el nodo de número secuencial temporal
Dificultades de la entrevista
¿Cómo cae el nodo maestro zk y cuáles son los impactos?
Se produce la reelección de ZK y todo el entorno de ZK no está disponible temporalmente.
Necesidad de considerar el protocolo zab
Compare zxid primero, luego compare myid
Cómo evitar el problema de bloqueo del cliente zk
zkserver está inactivo
El cliente zk establece el tiempo de espera de bloqueo
Después de monitorear el tiempo de inactividad de zk, se activa activamente.
El cliente zk está inactivo
Las características innatas de zk evitan problemas de interbloqueo y liberan bloqueos de forma proactiva.
Otros clientes zk establecen tiempo de espera de bloqueo
La jvm que adquirió el bloqueo nunca lo libera.
Controle la cantidad de extensiones de vida, libere activamente el bloqueo después de múltiples extensiones de vida y la transacción se revertirá
Redis implementa bloqueo distribuido (modo AP)
Idea principal
Setnx implementa bloqueo distribuido
obtener bloqueo
Múltiples jvms setnx al mismo tiempo Al final, solo un jvm tiene éxito.
desbloquear bloqueo
eliminar la clave
Características
Usar modo AP
ventaja
Admite alta concurrencia
La eficiencia está bien
Usando el método de datos de sincronización asincrónica
defecto
Problema congénito de cerebro dividido (el grupo de Redis no tiene un mecanismo mayoritario)
No muy estable
El hilo único congénito de Redis puede garantizar los problemas de seguridad del hilo setnx
Marco de Redisson
obtener bloqueo
Crear clave hash usando el script lua
desbloquear bloqueo
eliminar la clave
Diseño de extensión de vida.
De forma predeterminada, el hilo de vigilancia se activa cada 10 segundos para evitar la caducidad de la clave.
Dificultades de la entrevista
Cómo evitar problemas de bloqueo de clientes
Establecer clave caducada
Limitar el número de extensiones de vida.
Transacción de reversión
La clave ha caducado, pero el negocio aún no se ha ejecutado. ¿Qué debo hacer?
Diseño de extensión de vida.
Extensión de vida global (no recomendado)
Extensión de vida incremental (recomendado)
De forma predeterminada, la vida se renueva por adelantado cada 10 segundos para evitar la caducidad de la clave.
Renueve la vida varias veces para limitar la cantidad de renovaciones de vida debido a problemas de bloqueo
Transacción de reversión
Liberar activamente el bloqueo
En el clúster de Redis, ¿qué debo hacer si el nodo maestro no funciona? <br>
Utilice el algoritmo de bloqueo rojo RedLock
No hay distinción entre maestro y esclavo en el clúster de Redis
El cliente cumple con más de la mitad de los requisitos de setnx para múltiples servidores redis y adquiere el bloqueo con éxito.
Si el cliente establece el tiempo total necesario para obtener el bloqueo > el tiempo de vencimiento de la clave, el bloqueo se liberará automáticamente.
Este algoritmo en realidad utiliza ZK para implementar bloqueos distribuidos.
Diseño y práctica de arquitectura de transacciones distribuidas en Internet.
El trasfondo de las transacciones distribuidas.
Un solo proyecto múltiples fuentes de datos
jta Atomikos resuelve transacciones distribuidas
Interfaz de llamada remota RPC
Protocolo de coherencia de transacciones distribuidas
Protocolo de consistencia fuerte
En el clúster, los datos de copia de cada nodo deben ser consistentes
Protocolo de consistencia débil
En el clúster, algunas réplicas de nodos pueden tener datos inconsistentes
protocolo de coherencia eventual
Se permiten breves retrasos en los datos, pero eventualmente se requiere coherencia de los datos.
Ideas de diseño de transacciones distribuidas
Teoría de base y PAC
teoría básica
Básicamente disponible<br>
estado blando
consistencia final
GORRA
Teoría básica
Consistencia(C)
En el clúster, los datos de copia de cada nodo deben ser consistentes
Disponibilidad(A)
Después de que algunos nodos del clúster fallan, ¿todo el clúster aún puede responder a las solicitudes de lectura y escritura del cliente?
Tolerancia de partición (P)
La tolerancia a fallas de partición (P) representa principalmente errores causados por fluctuaciones de la red, que son inevitables y estos tres modos no se pueden lograr simultáneamente, por lo que actualmente solo hay dos modos: modos CP y AP.
Selección de modo
CP (consistencia de datos garantizada)
Disponibilidad no garantizada
Ap (disponibilidad garantizada)
Sin embargo, no se puede garantizar la coherencia de los datos de cada copia.<br>
Análisis comparativo
Nacos
Nacos admite clústeres de modo mixto CP/AP a partir de la versión 1.0. De forma predeterminada, el modo Ap.
eureka
modo AP
cuidador del zoológico
modo cp
El centro de registro recomienda el modo Ap
Asuntos flexibles y rígidos
Las transacciones rígidas satisfacen la teoría ACID
Las transacciones flexibles satisfacen la teoría BASE (básicamente disponibles, eventualmente consistentes)
2PC/3PC/TCC<br>
Marco de resolución de transacciones distribuidas
LCN resuelve problemas de transacciones distribuidas
Seata resuelve problemas de transacciones distribuidas
MQ resuelve problemas de transacciones distribuidas
TCC resuelve problemas de transacciones distribuidas
Reintentar el método de devolución de llamada para resolver problemas de transacciones distribuidas<br>
Diseño y práctica de arquitectura de programación de tareas distribuidas en Internet.
Desventajas de las tareas programadas tradicionales
Consumir recursos de la CPU
El no desacoplamiento afecta la lógica empresarial
Ideas centrales de diseño de programación de tareas distribuidas
Trazabilidad de registros
Expansión y contracción flexibles.
Admite programación paralela
Estrategia de alta disponibilidad
Estrategia de manejo de fallas
Estrategia de fragmentación dinámica
Marco de programación de tareas distribuidas
Interpretación del código fuente de XXLJob
Interpretación del código fuente de ElasticJob
protocolo de coherencia de datos mysql y Redis
solución
1. Actualice los datos de MySQL y borre manualmente el caché de Redis
Ventajas: baja latencia
Desventajas: no desacoplado
2. Actualice los datos de MySQL y sincronícelos con Redis en forma de mq asíncrono
Ventajas: implementar desacoplamiento, reintentar la estrategia de compensación, mejorar la respuesta de la interfaz
Desventajas: alta latencia
3. Sincronice datos con Redis basándose en la suscripción a MySQLBinLog combinado con el formulario asincrónico mq (implementación del marco del canal)
Ventajas: más desacoplamiento, estrategia de compensación de reintento, respuesta de interfaz mejorada
Desventajas: la latencia es cada vez mayor
Ideas de diseño centrales
La idea de coherencia final es que se permiten inconsistencias temporales de datos, pero los datos finales deben ser consistentes.
Principio del protocolo de coherencia de doble escritura
Primero elimine el caché y luego actualice la base de datos (no recomendado)
Es necesario retrasar la doble eliminación, eliminar dos veces
Eliminar el caché por primera vez
La segunda vez, para evitar la concurrencia de otros subprocesos, sincronice los datos de lectura sucia con Redis, por lo que espere unos segundos (el momento en que el negocio del segundo subproceso actualiza los datos antiguos a Redis) para eliminar el caché.
Primero actualice la base de datos, luego elimine el caché
Debe combinarse con mq y garantizar la coherencia de la secuencia de mensajes. La eliminación del caché debe realizarse correctamente.
Protocolo de coherencia DoubleWrite
¿Qué es la doble escritura?
Primero actualice la base de datos, luego actualice el caché
¿Qué problemas surgirán?
En una situación concurrente, varios subprocesos escriben al mismo tiempo. Otro subproceso puede escribir datos de lectura sucios en la memoria caché.
Cómo resolver lecturas sucias
Al utilizar el mecanismo de bloqueo de fila de transacciones de MySQL, varios subprocesos escriben operaciones al mismo tiempo. Al final, solo un subproceso adquiere el bloqueo de fila. Después de adquirir el bloqueo de fila, Redis debe sincronizarse correctamente antes de que se pueda liberar el bloqueo de fila. los hilos pueden escribir
Implementado mediante bloqueos distribuidos (no recomendado, se puede implementar directamente en función de bloqueos de fila de MySQL)
Principio de diseño del marco del canal.
canal resuelve el principio de sincronización de datos entre mysql y Redis
1.canal se disfraza de nodo esclavo mysql y se suscribe al archivo binlog del nodo maestro mysql;
2. Cuando el archivo binlog de nuestro nodo maestro mysql cambia, el archivo binlog <br> se envía al servidor del canal;
3. El servidor del canal convierte el archivo binlog al formato json y lo envía al cliente del canal;
4. El cliente del canal sincroniza los datos con Redis/ES;
modo de sincronización del canal
tcp (baja eficiencia)
kafka (recomendado)
Cómo mejorar la eficiencia del canal integrando la sincronización de datos de Kafka
Integrar el modo de tema MQ
Tema único y partición única (orden estricto de binlog global)
La partición única de varios temas puede garantizar el orden a nivel de tabla.
El mismo nombre de tabla se coloca en la misma partición y, finalmente, el mismo consumidor lo consume.
Tema único, partición múltiple de múltiples temas combinada con modo hash
Cómo resolver el problema de coherencia de la secuencia de mensajes
Configure varias particiones y calcule el hash en función de los campos de la tabla, como la identificación de la clave principal. La misma identificación se colocará en la misma partición y será consumida por el mismo consumidor.
¿Hay algún retraso en la sincronización de datos entre mysql y redis?
Durante el proceso de sincronización de datos, habrá un breve retraso, lo cual es normal. Es difícil lograr una coherencia fuerte y seguir la idea de una coherencia eventual.
Principio del middleware de mensajes distribuidos
Modelo conceptual básico de MQ
Sincrónico y asincrónico
Recorte de picos de tráfico
Escalabilidad/desacoplamiento
Almacenamiento en búfer/recuperabilidad
productores y consumidores
Soluciones comunes de MQ
Cómo MQ evita la acumulación de mensajes
Incrementar la tasa de consumo (clúster)
Los consumidores reciben mensajes en lotes
¿Cómo evita MQ el consumo repetido por parte de los consumidores (problema idempotente)?
El escenario empresarial de identificación global garantiza la singularidad
¿Cómo garantiza MQ que los mensajes no se pierdan?
Mecanismo de confirmación de mensaje
Persistencia
mensaje de confirmación
Cómo MQ garantiza la coherencia de la secuencia de mensajes
Vincular al mismo consumidor y cola.
Modelo de arquitectura push y pull de MQ
Cómo obtienen los productores resultados de consumo
Devuelve de forma asincrónica una ID global y la interfaz usa ajax para realizar consultas activas con regularidad.
Marco MQ convencional
conejomq
Pensamientos arquitectónicos
Centro de plataforma de gestión Rabbitmq
Anfitriones virtuales
Almacene colas de mensajes en rutas de desarrollo de equipo separadas
Intercambio
mensaje de distribución de ruta
clave de enrutamiento
Modelo de cola RabitMQ
modo simple<br>
modo de trabajo
Modo de transmisión --- fanout
Modo de enrutamiento: directo
Modo tema --tema
RabitMQ cuatro tipos de conmutadores
Intercambio directo (intercambio directo)
Intercambio fanout
Intercambio de temas
Intercambio de encabezados
Preguntas comunes de la entrevista de RabbitMQ
Cómo RabbitMQ garantiza que los mensajes no se pierdan
productor
Asegúrese de que el productor entregue correctamente el mensaje al servidor MQ
Mecanismo de confirmación del mensaje de confirmación (Confirma)
Forma sincrónica o asincrónica
Mensajes de transacciones
consumidor
Modo recibo manual de consumo
Firma automática (no recomendado)
Firma manual (recomendado)
Persistencia de mensajes del lado del servidor MQ
Cola de mensajes fallidos de RabbitMQ
El mensaje se entrega a MQ y se almacena. El mensaje ha caducado.
El contenedor de cola está lleno
Si el consumidor no consume varios mensajes, se transferirá a la cola de mensajes no entregados.
Mecanismo de reintento automático de mensajes RabbitMQ
¿Qué debo hacer si sigo fallando después de intentarlo varias veces?
Pasar a la cola de mensajes fallidos
Registre en la tabla de registro la compensación programada o la compensación manual
¿Cómo evitar problemas de idempotencia del consumidor?
El escenario empresarial de identificación global garantiza la singularidad
kafka
Modelo de diseño de arquitectura central de Kafka.
Agente (lado del servidor MQ)
Tema (los temas se clasifican según el negocio)
Partiiton (mensaje de almacenamiento de partición)
Productor
Consumidor
Grupo de consumidores
Réplica (mecanismo de réplica)
Compensación (récord de consumo)
Por qué Kafka puede admitir una alta concurrencia
nivel de estructura de almacenamiento
Los mensajes se comprimirán para reducir la transmisión del ancho de banda
modelo de estructura de almacenamiento de partición de partición kafka
Archivo de mensajes de almacenamiento .log
.index almacena el índice del mensaje
.timeIndex, archivo de índice de tiempo
Registro de almacenamiento segmentado (archivo de segmento)
Utilice un índice disperso para encontrar la ubicación física del mensaje (no se crea ningún índice para cada mensaje)
Beneficios: Ahorra espacio
Una vez almacenado el mensaje, no se eliminará inmediatamente después de un consumo exitoso. El mensaje se obtiene en función del desplazamiento (debe considerar configurar la estrategia de limpieza de registros).
nivel de aplicación java
productor
Los productores entregan mensajes en lotes (diseño de grupo de búfer)
consumidor
Los consumidores obtienen mensajes en lotes (múltiples compensaciones)
Un consumidor por partición (escalabilidad)
nivel del kernel de linux
Utilice lectura y escritura secuencial.
Utilice el mecanismo de copia cero
modo de usuario sendfile mmap y mapeo del modo kernel
No es necesario que la CPU copie datos
Reducir el número de cambios entre el modo de usuario y el modo kernel
Utilice Page Cache para mejorar la lectura y la escritura
Necesidad de considerar la cuestión del cepillado del disco.
Cómo Kafka garantiza mensajes fiables
Replicación
Mecanismo confiable de réplica de ISR
Réplica de elección en partición
High Water Mark: la compensación máxima que los consumidores pueden consumir
El valor de compensación más grande en la cola LEO
El productor entrega el mensaje de confirmación
0 significa que el productor no espera (se pueden perder mensajes)
1 significa que el productor está esperando y el líder está vaciando el disco (se recomienda la configuración predeterminada)
-1 significa que el productor debe esperar a que se sincronicen todos los nodos.
Principio de control del principio electoral de Kafka
Confiar en los nodos temporales de Zookeeper para implementar elecciones
El consumidor envía la compensación manualmente
¿Cómo encuentra Kafka el mensaje con un desplazamiento específico?
1. Buscar archivos de segmento de segmento según el desplazamiento (búsqueda binaria)
2. Acceda al archivo de índice (índice disperso) y busque la ubicación de almacenamiento físico correspondiente
3. Según la ubicación de acceso físico, acceda al registro para encontrar el mensaje físico correspondiente.
Encuentre el valor del índice del mensaje
Devolver mensajes físicos directamente (complejidad de tiempo o (1))
No se encontró el valor del índice del mensaje
Buscar en secuencia (complejidad temporal o (N))
Optimización del rendimiento de Kafka
productor
Tamaño del buffer de memoria del productor
Políticas de reintento "retries" y "retries.backoff.ms"
Este parámetro establece el número de reintentos y el intervalo.
Mecanismo de confirmación: acks. Se recomienda configurarlo en 1 para el equilibrio.
consumidor
El número de particiones de consumo.
Los consumidores obtienen mensajes en lotes basados en múltiples compensaciones
El consumidor habilita el envío de compensación manual
Agente (lado del servidor MQ)
Configuración de la política de retención de registros
Estrategia de vaciado de archivos de datos de registro
configuración de replicación de réplica
Optimización de la configuración de subprocesos de red y IO
Optimización práctica del rendimiento de MySQL
Optimización del rendimiento de MySQL
Principios del proceso de ejecución y arquitectura MySQL
Cómo se ejecutan las declaraciones SQL
Caché de consultas incorporado
Análisis gramática y léxico.
procesador semántico
Optimizador/plan de ejecución
motor de ejecución de consultas
Estructura de memoria y estructura de disco de InnoDb
Diseño de búfer
Función de grupo de búfer
El buffer de memoria está lleno, ¿qué hacer?
¿Cómo configurar el tamaño de su Buffer Pool?
Problemas de latencia de MySQL y estrategias de vaciado de datos
Cómo entender la unidad de página de datos abstractos en MySQL
¿Cómo se corresponden entre sí las páginas de datos y las páginas de caché en el disco?
¿Cuál es la información de descripción correspondiente a la página de caché?
Cómo configurar el grupo de búfer adecuadamente según la configuración de la máquina
¿Cuánta memoria se debe configurar para el grupo de búfer en un entorno de producción?
Tamaño total = 2 veces (tamaño del fragmento * número de grupos de búfer)
Principio del protocolo de comunicación subyacente de MySQL
Linux
Conector TCP/IP
mensaje mysql
Autenticación de protocolo de enlace de tres vías
Zócalo Unix
ventanas
tubería con nombre
compartir memoria
División del módulo subyacente de MySQL
Módulo de inicialización
API principal
Módulo de interacción de red
Módulo de protocolo de interacción cliente y servidor
módulo de usuario
módulo de control de acceso
Gestión de conexiones, subprocesos de conexión y gestión de subprocesos.
Módulo de análisis y reenvío de consultas
Módulo optimizador de consultas
Módulo de registro
Módulo de interfaz del motor de almacenamiento
El principio de implementación subyacente del índice MySQL
Modelo de estructura de datos de índice
tabla de picadillo
árbol de búsqueda binaria
árbol negro rojo
Árbol de búsqueda equilibrado de múltiples bifurcaciones
B árboles
¿Qué categorías tiene el índice?
Índice de texto completo
índice de clave primaria
índice combinado
índice único
La diferencia entre innodb y myisam La diferencia en el índice<br>
Principios básicos para establecer y utilizar índices MySQL.
Los principios subyacentes de las transacciones MySQL
La diferencia entre declaración de Spring y transacción de programación
¿Qué problemas ocurrirán si la transacción solo comienza y no se confirma ni se revierte?
Principio MVCC de control de versiones múltiples de MySQL
Nivel de aislamiento de transacciones MySQL
lectura repetible
leer compromiso
Leer no comprometido
publicación por entregas
Principios de bloqueo y liberación de bloqueo de MySQL
Bloqueo de fila, bloqueo de tabla, bloqueo de página
Bloqueo pesimista/bloqueo optimista
Bloqueo de espacio
¿Qué es el bloqueo de espacios?
¿Por qué el bloqueo de espacios es la razón principal para evitar lecturas fantasma en el nivel de aislamiento RR?
Índice de clave principal/índice único ¿Se agregará un bloqueo de espacio a la lectura actual?
Si el bloqueo de espacio se agregará mediante una consulta de rango
¿Se agregará Gap a la lectura actual si las condiciones de búsqueda no existen?
Principio de análisis de punto muerto
Bloqueo bifásico
¿Por qué se produce un punto muerto?
El principio subyacente del registro MySQLUndo
La diferencia entre Deshacer registro y Rehacer registro
UndoLog implementa el principio de atomicidad de transacciones
RedoLog implementa el principio de persistencia de transacciones
Optimización práctica del rendimiento de MySQL
Análisis y soluciones de consultas lentas SQL
Cómo habilitar la consulta lenta de MySQL
Interpretación del principio del plan de ejecución.
id: cuanto más grande sea la columna, mayor será la prioridad de ejecución. Si la identificación es la misma, se ejecutará de arriba a abajo. Si la identificación es NULL, se ejecutará en último lugar.
select_type: indica el tipo de consulta
tabla: explica a qué tabla accede una fila.
tipo de columna
sistema
constante
eq_ref
árbitro
<p class="MsoNormal"><b><span style="font-family: "Times New Roman"; font-size: 10.5pt;">rango </span></b></p>
índice
TODO
Extra significa información adicional
Principios de SQL y optimización de índices
Siga la regla del mejor prefijo izquierdo para evitar errores en el índice
Intente utilizar índices de cobertura para evitar consultas anteriores a la tabla
La clasificación sigue el mejor método de prefijo izquierdo para evitar la clasificación de archivos
El tipo mínimo satisface el nivel de consulta de rango de rango.
Optimización de la paginación donde la condición de identificación filtra el conjunto o la subconsulta ubica la asociación de identificación
La consulta de combinación de tablas optimiza tablas pequeñas para generar datos de tablas grandes. Está prohibido utilizar la combinación para más de tres tablas.
Al igual que difusa, sigue la regla del mejor prefijo izquierdo o utiliza una consulta difusa de índice compuesto
Principios de optimización de la configuración de MySQL
Optimización del motor de almacenamiento y de la estructura de tablas.
Manual de desarrollo de Alibaba Optimización de MySQL desde una perspectiva
Tabla y base de datos MySQL
Cuando una tabla única alcance el tamaño máximo, se dividirá en tablas y bases de datos.
La diferencia entre divisiones horizontales y verticales.
Estrategia de subtabla y subbase de datos
Módulo restante/rango
Dividir por rango
Dividir por fecha
Dividido por mes
Fragmento por valor de enumeración
Corte de rango de módulo binario
Fragmentación de hash consistente
Partición según lo especificado por el prefijo del campo de destino<br>
Segmente el rango del módulo según el código y valor del prefijo ASCII
Personalización del desarrollador
problema comun
¿Cuáles son las ventajas y desventajas de realizar consultas después de la partición de tablas y bases de datos?
Cómo implementar una consulta de paginación después de dividir tablas y bases de datos
Cómo implementar la consulta de combinación de tablas después de dividir tablas y bases de datos
Por qué no se recomienda MyCat
Interpretación profunda del código fuente de Netty
Base conceptual del modelo de red.
Modelo de arquitectura de cinco capas TCP/IP
Capa de aplicación
capa de transporte
Capa de red
Capa de enlace de datos
capa fisica
Programación de redes de sockets
protocolo TCP
protocolo UDP
Cómo resolver el principio de la dirección IP ingresando una dirección URL
Los principios subyacentes del protocolo HTTP.
Principio de solicitud y respuesta del protocolo HTTPS
Principios HTTPS y SSL/TLS
La diferencia entre el protocolo http y Socket
Principio del modelo IO
Bloqueo del modelo de E/S
Modelo de E/S sin bloqueo
Modelo de E/S multiplexada
Modelo de E/S controlado por señal
Modelo de E/S asíncrono
La diferencia entre NIO y BIO
Principios básicos de AIO
La evolución de BIO a NIO
Orientado a flujos y orientado a búfer
Bloqueo y no bloqueo
Principio de implementación de NIO (kernel del sistema operativo)
Concepto principal
búfer del núcleo
buffer de proceso
núcleo de linux
seleccionar
La complejidad del tiempo es O (n) y existen ciertas restricciones en la supervisión de los descriptores de archivos.
encuesta
La complejidad del tiempo es O (n) y no hay límite para escuchar descriptores de archivos.
epoll
La complejidad del tiempo es O (1) y no hay límite para escuchar descriptores de archivos.
Interpretación del código fuente de Netty
Escenarios de uso comunes de Netty
marco RPC
servidor tomcat
Juego en linea
Principios de la arquitectura NIO
buffer
Selector
pasillo
Diseño Netty de alto rendimiento
Comunicación asincrónica sin bloqueo
Copia cero/grupo de memoria
escritura MMAP
Enviar archivo
Cosas para pensar:
Cómo reducir la cantidad de copias de la CPU
Principio de copia dma de memoria directa
Cómo reducir la cantidad de cambios de kernel
Modelo de subprocesos de reactor eficiente
Hilo único de un solo reactor
Subprocesos múltiples de un solo reactor
Modelo maestro-esclavo del reactor
Concepto de diseño en serie sin bloqueo
Soporte de marco de serialización
Interpretación del código fuente de Netty
Modelo de hilo Netty y análisis de código fuente.
Protocolo de serialización de alto rendimiento protobuf y análisis de código fuente
Fenómeno y solución de desempaquetado de paquetes adhesivos, análisis del código fuente del códec
Explicación detallada de la memoria directa y la copia cero de Netty
Práctica del marco Netty
Basado en el marco RPC escrito a mano de Netty (alta imitación de Dubbo)
Basado en la versión multijugador en línea de escritura a mano de Netty del juego de backgammon
Basado en el servidor web escrito a mano Netty (alta imitación de Tomcat)
Análisis de los principios del kernel del sistema Linux.
Trabajo de preparación del kernel de Linux
Un breve análisis de la arquitectura del kernel de Linux.
La diferencia entre la arquitectura de Linux y la estructura del kernel
Mecanismo de plataforma impulsado por Linux
Arquitectura del núcleo de Linux
Interpretación del código fuente del marco del sistema Spring
Interpretación del código fuente Spring5
Interpretación del código fuente SpringMVC
Interpretación del código fuente de SpringBoot
Nuevo proyecto de comercio electrónico minorista
Ideas de diseño de arquitectura
Nuevo concepto de comercio minorista<br>
Plano técnico de arquitectura.
arranque de primavera
PrimaveraNubeAlibaba
Diseño intermedio
Centro Técnico
Centro de negocios
Centro de organización
computación en la nube
SaaS (software como servicio)
PaaS (servicio de plataforma)
IaaS (Servicios de Infraestructura)
Integración de operación y desarrollo de Devops y K8S
apm
Implementar seguimiento de servicios
Alarma de monitoreo
Separación de los extremos delantero y trasero.
Front-end ----- vue es similar a la tecnología ajax y lo implementan ingenieros de front-end
Backend ------ Formulario de interfaz El ingeniero de backend implementa java
Construir servicios de infraestructura.
Implementar el centro de registro/configuración del servicio Nacos
Cree un servidor privado Maven de nivel empresarial
Implementar la llamada de la interfaz RPC en el equipo de microservicio.
Definir el protocolo de especificación de la interfaz API
Cree una plataforma de gestión de almacén de códigos a nivel empresarial
po/do/vo/dto/bo seleccionar aplicación
El objetivo es garantizar la seguridad de los datos transmitidos por RPC.
Seleccionar aplicación
DO (objeto de datos): corresponde a la estructura de la tabla de la base de datos uno a uno y transmite los objetos de origen de datos hacia arriba a través de la capa DAO.
DTO (Objeto de transferencia de datos): objeto de transferencia de datos, un objeto transferido externamente por el servicio o administrador
BO (Objeto de Negocio): Objeto de negocio. Objeto que encapsula la salida de la lógica empresarial de la capa de servicio.
AO (Objeto de aplicación): Objeto de aplicación. Modelo de objetos de reutilización abstracto entre la capa web y la capa de servicio
VO (Ver objeto): objeto de capa de visualización, generalmente un objeto transmitido por la web a la capa del motor de renderizado de plantillas.
Diseño del centro de miembros
Implementación de la interfaz de inicio de sesión
¿Por qué no usar la sesión?
Cuando la sesión se guarda en el servidor jvm, se debe considerar el problema de sincronización del clúster de nodos.
Método de implementación del token
Principio de implementación
Genere aleatoriamente un token (UUID) como valor clave de Redis como ID de usuario
Devuelva el token al cliente y el cliente llamará a la interfaz cada vez que pase el token.
Ventajas y desventajas
ventaja
Ocultar autenticidad de parámetros
defecto
Necesito pasar por la consulta de Redis
implementación de JWT
componentes
encabezado(encabezado)
Carga útil(carga útil)
Firma
Ventajas y desventajas
ventaja
No es necesario almacenar datos de usuario en el servidor, lo que reduce la presión del lado del servidor
El estilo json liviano es relativamente simple
lenguaje cruzado
defecto
No se puede actualizar el período de validez
No se puede destruir un jwt
Cómo implementar el cierre de sesión en Jwt
Borrar las cookies del navegador (pero el servidor aún existe)
Se recomienda ajustar el tiempo un poco más corto.
Integre subprocesos múltiples y agrupación de subprocesos
Utilice subprocesos múltiples para procesar correos electrónicos, mensajes de texto y cupones enviados después de iniciar sesión, mejorando así la eficiencia de respuesta de la interfaz.
Los proyectos grandes utilizan el procesamiento asincrónico y que requiere mucho tiempo de mq para reducir los recursos de la CPU del servidor.
Inicio de sesión único SSO
formulario web
Implementado en base a cookies
Separación de los extremos delantero y trasero.
Implementado en base a token o jwt.
problema comun
Cómo obtener la información IP del cliente real
Configurando la IP real del usuario en nginx
Cómo resolver el problema entre dominios de la separación de front-end y back-end
Utilice jsonp pero no admite solicitudes de publicación (no recomendado)
Utilice la anotación SpringMVC @CrossOrigin (recomendado)
Resolver problemas entre dominios según la puerta de enlace (recomendado)
Acceso basado en diferentes proyectos basados en Nginx (recomendado)
Implementación conjunta de inicio de sesión
protocolo abierto oauth2
1. Generar dirección de enlace de autorización basada en appid
2. Obtener el código de autorización
3. Obtenga el accessToken según el código de autorización.
4. Obtener información del usuario según el código de autorización.
Soluciones distribuidas
Desventajas de los registros de recolección tradicionales
Utilice tail para buscar registros en cada servidor
solución
aop elk kafka implementa la recopilación de registros distribuidos
¿Por qué Elk necesita agregar Kafka?
Reducir el coste de operación y mantenimiento de cada instalación de Logstash
Precauciones
AOP almacena en caché los registros recopilados en una cola simultánea y los entrega a Kafka en un hilo asincrónico separado.
Diseño de pago agregado
Proceso de arquitectura de pago
Verificar el método de firma
Cifrado asimétrico RSA
MD5
método de devolución de llamada
Devolución de llamada sincrónica
Una vez que el pago del tercero se realiza correctamente, saltará al comerciante en forma de redirección del navegador de pago.
devolución de llamada asincrónica
El pago de terceros envía notificaciones a los comerciantes utilizando tecnología similar a HttpClient
Patrones de diseño
patrón de estrategia
patrón de método de plantilla
problema comun
Cómo las devoluciones de llamadas sincrónicas y asincrónicas garantizan la seguridad de la interfaz
La devolución de llamada sincrónica salta en forma de navegador y no modifica el estado del pedido.
Después de que la devolución de llamada asincrónica verifique la firma con éxito, preste atención al problema de idempotencia para modificar el estado del pedido.
Cómo evitar que los usuarios paguen repetidamente
El mismo número de pedido se envía desde el formulario al pago de terceros, y el pago de terceros garantizará la unicidad global según el número de pedido.
¿Qué debo hacer si el pago del usuario se realizó correctamente pero el estado del pedido aún es impago?
Este fenómeno es normal. A través de la idea de coherencia eventual, puede llamar activamente a la interfaz de Alipay para consultar si el pedido ha sido pagado.
Cómo manejar la inconsistencia entre el monto del pago del usuario y el monto del pedido
En la devolución de llamada asincrónica, se preguntará según el pedido si el número de pedido real del usuario es consistente con el monto de pago del usuario. <br>Si son inconsistentes, es un pedido anormal.
¿Qué tipos de campos de importe de la tabla de pagos son adecuados?
El almacenamiento directo de tipos de números enteros se puede convertir posteriormente en elementos.
tipo decimal
Cómo gestionar un pedido que no ha sido pagado durante 30 minutos extra
Implementado en base a la cola de retraso MQ (recomendado)
1. Una vez realizado el pedido correctamente, envíe un mensaje de cola retrasada a MQ
2. Cuando el mensaje caduque, se transferirá a la cola de mensajes no entregados.
3. El consumidor de la cola de mensajes fallidos escucha el mensaje y verifica si el estado del pedido es pagado.
Implementado en base a la clave caducada de Redis (no recomendado)
1. Después de realizar el pedido con éxito, establezca una clave de vencimiento de 30 minutos para Redis.
2. Cuando el cliente monitorea el vencimiento de la clave, verifica si el estado del pedido está pagado.
3. Para habilitar el monitoreo de claves vencidas, debe prestar atención al prefijo y suscribirse a una biblioteca de Redis separada.
problema comun
La tarjeta del usuario paga en 30 minutos. ¿Cómo garantizar la coherencia del estado del pedido?
1. Establezca el tiempo de espera para redirigir pedidos de Alipay a 30 minutos
2. La cola de retraso llama activamente a la interfaz de Alipay para verificar el estado del pago según el número de pedido entre 31 y 35 minutos.
3. Si el pago aún no se realiza después de llamar a la interfaz de Alipay, se considerará que el pedido lleva mucho tiempo.
Diseño de arquitectura de sistema de servicio de producto.
Cómo lograr resistencia a la alta concurrencia
capa frontal
Mejoramiento
Arquitectura de separación dinámica y estática.
Servidor de recursos estático
servidor de recursos dinámicos
Compresión de recursos estáticos
Generar archivo .min
caché CDN
Visita según el principio de proximidad.
efecto final
Reducir la transmisión de ancho de banda
capa de interfaz
Mejoramiento
Ajuste de parámetros de JVM para reducir la cantidad de problemas de stw de reciclaje de GC
Maneje operaciones que requieren mucho tiempo en forma de desacoplamiento asíncrono de subprocesos múltiples/MQ
Utilice el caché de Redis para reducir la presión del acceso a la base de datos
Considere dividir tablas y bases de datos/optimización de índices para datos masivos de MySQL
efecto final
Capa de operación y mantenimiento.
Utilice Docker o K8S para expandir/reducir la implementación de manera elástica
JavaSE
gramática básica
tipo de datos
Tipos de datos básicos
tipo numérico
Entero (byte, corto, int, largo)
Número de coma flotante (flotante, doble)
personaje (carácter)
tipo no numérico
booleano
Tipo de datos de referencia
clase
interfaz
formación[]
orientado a objetos
marco de colección
flujo de E/S
mecanismo de reflexión
subprocesos múltiples
JDBC
JavaWeb
Base
servlet
JSP
marco
primavera5
Relación Spring5 y SpringBoot
Método de inyección SpringBean
Método de inyección SpringBean
Propiedades inyectadas del constructor paramétrico.
p inyección de espacio de nombres
Inyectar valores nulos y símbolos especiales
Inyectar frijoles internos
Inyectar frijoles externos
Inyectar asignación en cascada
Inyectar propiedades de tipo de colección
Frijoles de fábrica de primavera
Ciclo de vida de SpringBean
Paso 1: utilice la tecnología de reflexión para inicializar el objeto y llamar al constructor sin argumentos
Paso 2: utilice la reflexión para llamar al método set para asignar valores a las propiedades.
El tercer paso de ejecución: método previo al posprocesador de Bean
Paso 4: llamar al método init en el objeto
Paso 5: método posterior al procesador de Bean
Paso 6: destruye el objeto y llama al método de destrucción.
Alcance de SpringBean
Objeto único
Múltiples objetos de instancia
Cableado automático SpringBean
Archivo de propiedades externo SpringBean
Formulario de anotación SpringBean
Método de inicio de la anotación SpringBean
Función de inicio de anotaciones de SpringBean
Configuración de escaneo de anotaciones SpringBean
Anotaciones automáticas y calificadas
@El uso de recursos
SpringBean AOP
Conceptos básicos de AOP
El papel básico de AOP
Proxy estático y proxy dinámico
Uso de anotaciones @AspectJ
Utilice aop para imprimir registros de manera uniforme
Operaciones de transacción SpringBean
Clasificación de transacciones
Transacciones manuales
la programación importa
Siete comportamientos comunicativos de los asuntos.
PROPAGATION_REQUIRED (comportamiento de propagación predeterminado)
Si hay una transacción en el hilo actual, únase a la transacción actual
Si no existe una transacción para el hilo actual, cree una nueva transacción
SOPORTES_PROPAGACIÓN
Si hay una transacción en el hilo actual, únase a la transacción actual
Si no hay ninguna transacción en el hilo actual, se ejecutará sin transacción<br>.
PROPAGACIÓN_MANDATORIA
Si hay una transacción en el hilo actual, únase a la transacción actual
Lanza una excepción si hay una transacción en el hilo actual
PROPAGATION_REQUIRES_NEW
Si existe una transacción en el hilo actual, la transacción actual se suspenderá y se creará una nueva transacción.
PROPAGATION_NOT_SUPPORTED
Siempre ejecutado de forma no transaccional
PROPAGACIÓN_NUNCA
Siempre se ejecuta de forma no transaccional, se generará una excepción si existe una transacción en el hilo actual.
PROPAGATION_NESTED
Si hay una transacción en el hilo actual, se anidará una transacción
primaveraMVC
mibatis
Hibernar
microservicios
SpringBoot2.0
Por qué necesitas usar el marco SpringBoot
Puede ayudar a los desarrolladores a integrar rápidamente marcos de terceros (Principio: encapsulación de dependencia de Maven)
Elimine la configuración xml y utilice completamente la anotación (principio: método de anotación integrado en el sistema Spring)
No es necesario un Tomcat externo ni un servidor de implementación interno (principio: el lenguaje Java admite el servidor Tomcat integrado)
La diferencia entre SpringBoot y SpringCloud
Dependencias de SpringCloud y componentes SpringBoot
Utilice SpringMVC para escribir la interfaz del protocolo Http
Spring Cloud es un marco completo de solución de microservicios
Introducción a la introducción de la dependencia SpringBoot
padre-inicio-arranque-primavera,
spring-boot-starter-web
Rol @RestController
Todos los métodos del controlador devuelven formato JSON
Método de inicio SpringBoot
@EnableAutoConfiguración
@ComponentScan
@SpringBootAplicación
Se pueden escanear todas las clases del paquete o subpaquetes actuales
SpringBoot integra el acceso a recursos estáticos
¿Qué marco de motor de plantilla?
Renderizar la web, lo cual es beneficioso para la búsqueda SEO
Integrar el motor de plantillas ftl
Integrar el motor de plantillas de thymeleaf
SpringBoot integra fuentes de datos
Plantilla Jdbc
mybatis
hibernar
Implementación en caliente integrada de SpringBoot
Integrar herramientas devtools
Implementación del cargador de clases
integrar lombok
Archivo de configuración de integración SpringBoot
Utilice la anotación @value para leer archivos de configuración
Propiedades convertir formato yml
@Propiedades de configuración
Uso del marcador de posición del archivo de configuración
Integre diferentes archivos de configuración en múltiples entornos
Modificar puerto y ruta de contexto
Marco de registro integrado SpringBoot
volver a iniciar sesión
log4j
Utilice aop para imprimir información de registro de manera uniforme
Tareas programadas de SpringBoot
Integrar tareas programadas con anotación @Scheduled
Tareas de integración cronometradas combinadas con expresiones de Quartz.
SpringBoot integra subprocesos múltiples asíncronos
Preste atención al problema de invalidación de @Async
@Async integra el grupo de subprocesos
Integrar excepciones de captura global
Empaquetar y ejecutar lanzamiento
Herramientas de proyecto
estibador
concepto basico
¿Por qué necesitas usar Docker?
Beneficios de usar Docker
La diferencia entre contenedores y máquinas virtuales
Instalación ambiental
Instalar Docker en entorno Linux
Instalar Docker en entorno Win
Tres elementos principales
Archivo de imagen
envase
almacén
Principio del espejo
Principio de descarga de imágenes de Docker
Principio de carga de imágenes de Docker
botas
rootfs
unión fs
Configuración de imágenes acelerada en la nube
Imagen acelerada de Alibaba Cloud
Imagen acelerada en la nube de Huawei
Espejo acelerado HKUST
Comandos comunes de Docker
docker --help (comando de ayuda)
docker --version (ver versión)
Imágenes de Docker (ver imágenes)
búsqueda de Docker (imagen de búsqueda)
Docker Pull (descargar imagen)
último -----etiqueta la última versión del archivo de imagen
contenedor acoplable
ejecución de la ventana acoplable (iniciar contenedor)
Docker Start inicia la identificación del contenedor.
ID del contenedor de parada de Docker
ID del contenedor Docker RM
docker exec -it [ID DEL CONTENEDOR] bash (ingrese el contenedor)
registros de Docker: desde 30 m CONTAINER_ID (ver registros de contenedor)
Docker Commit (convertido en un archivo de imagen basado en el contenedor actual)
Volumen de datos de Docker -v
Instalar software de uso común
Gato
ejecución de la ventana acoplable -p 8081:8080 -d tomcat:8
nginx
ejecución de la ventana acoplable --nombre nginx81 -d -p 81:80
mysql
ventana acoplable crear --nombre mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
Análisis de DockerFile
Especificaciones de escritura de DockerFile
Directiva DockerFile
Cree un proyecto Springboot basado en Dockerfile
Composición acoplable
Redactar comandos comunes
docker-componer -h
Docker-componer
Docker-componer hacia abajo
registros de composición de Docker
extracción de composición acoplable
configuración de dokcer-compose
reinicio de Docker-Compose
inicio de composición de Docker
Redactar archivo de plantilla
Implementar el proyecto de microservicio SpringBoot MySQL Nginx
Uso de la herramienta de visualización Docker
portainer
DockerUI
k8s
concepto metanativo
microservicios
Comunicación tranquila entre aplicaciones.
Se puede desplegar/ampliar y reducir elásticamente de forma independiente
devops
Canal de lanzamiento automatizado, herramientas Ci/CD
Implemente rápidamente un entorno de producción
Integración de desarrollo y operación y mantenimiento.
entrega continua
Lanzamientos frecuentes, entrega rápida, retroalimentación rápida y riesgos de lanzamiento reducidos
Contenedorización
El mejor operador para microservicios.
Patrones de diseño
modo proxy