Preguntas de la entrevista interna de backend de Java

21. ¿Cuándo no se debe usar un índice?

1. No cree índices para columnas que se agregan, eliminan o modifican con frecuencia;

2. Hay una gran cantidad de columnas repetidas sin indexar;

3. No cree un índice si hay muy pocos registros en la tabla.

22. Dime, ¿qué es MVCC ?

El control de concurrencia de múltiples versiones (MVCC = Control de concurrencia de múltiples versiones) es un método no volátil que se utiliza para resolver conflictos de lectura y escritura.

Control de concurrencia de bloqueo. Es decir, a las transacciones se les asignan sellos de tiempo crecientes unidireccionalmente y se guarda una versión para cada modificación. Versión y marca de tiempo de la transacción

Asociación, la operación de lectura solo lee la instantánea de la base de datos antes del inicio de la transacción (se copia una copia de los datos). De esta forma, la operación de lectura no necesita bloquear la operación de escritura.

Operación, las operaciones de escritura no necesitan bloquear las operaciones de lectura, al tiempo que evitan las lecturas sucias y las lecturas no repetibles.

23. ¿Qué problemas puede resolver MVCC para las bases de datos?

Al leer y escribir la base de datos simultáneamente, se puede lograr que la operación de lectura no necesite bloquear la operación de escritura, y la operación de escritura no necesite bloquear la operación de lectura, lo que mejora los datos.

El rendimiento de la lectura y escritura simultáneas de la base de datos. Al mismo tiempo, también puede resolver problemas de aislamiento de transacciones, como lecturas sucias, lecturas fantasma y lecturas no repetibles, pero no puede resolver problemas de actualización.

Problema perdido.

24. Hable sobre el principio de realización de MVCC

El propósito de MVCC es el control de concurrencia de múltiples versiones. Su implementación en la base de datos es para resolver conflictos de lectura-escritura. Su principio de realización es principalmente

Se realiza basándose en los tres campos implícitos en el registro, el registro de deshacer y la Vista de lectura.

25. ¿ Nivel de aislamiento de transacciones de MySQL ?

READ UNCOMMITTED (lectura no confirmada): la modificación en la transacción, aunque no esté confirmada, es visible para otras transacciones

de. causará lecturas sucias.

READ COMMITTED (commit read): Desde el inicio de la transacción hasta que se compromete, cualquier modificación realizada a otras transacciones es

Invisible. dará como resultado lecturas no repetibles. Este nivel de aislamiento también se puede denominar "lectura no repetible".

LECTURA REPETIBLE (lectura repetible): una transacción lee datos recuperados previamente de acuerdo con las mismas condiciones de consulta y otras transacciones

El servicio inserta nuevos datos que satisfacen sus criterios de consulta. Se generan líneas fantasma, lo que puede dar lugar a lecturas fantasma. (Nivel de aislamiento predeterminado de MySQL)

SERIALIZABLE: Obliga a que las transacciones se ejecuten en serie.

Información interna de Ali 26. Por favor, cuénteme acerca de los bloqueos de la base de datos MySQL .

Se pueden hacer muchas preguntas sobre el mecanismo de bloqueo de MySQL, pero también depende de la reserva de conocimiento del entrevistador en esta área.

Hay bloqueos compartidos y bloqueos exclusivos en MySQL, es decir, bloqueos de lectura y bloqueos de escritura.

1. Bloqueo compartido: sin bloqueo, varios usuarios pueden leer el mismo recurso al mismo tiempo sin afectarse entre sí.

2. Bloqueo exclusivo: una operación de escritura bloquea otros bloqueos de lectura y bloqueos de escritura, de modo que solo un usuario puede escribir, evitando que otros usuarios

El usuario lee el recurso que se está escribiendo.

3. Bloqueo de tabla: la sobrecarga del sistema es mínima y se bloqueará toda la tabla. MyISAM utiliza bloqueos de tabla.

4. Bloqueo de filas: propenso a puntos muertos, baja probabilidad de conflicto, alta concurrencia, InnoDB admite bloqueo de filas (debe tener un índice para lograrlo,

De lo contrario, toda la tabla se bloqueará automáticamente, por lo que no es un bloqueo de fila).

27. ¿Qué es la actualización de bloqueo?

Los bloqueos de fila de MySQL solo se pueden agregar al índice. Si la operación no usa el índice, se actualizará a un bloqueo de tabla. Porque el bloqueo de fila de InnoDB es más

En el índice, si no usa el índice, no puede usar el bloqueo de fila de forma natural, porque InnoDB usa el índice de clave principal

Junto con los datos de fila relacionados, se coloca en el nodo hoja del árbol B+. InnoDB debe tener una clave primaria, secundaria

Al buscar el índice, también encuentra el primario correspondiente y luego encuentra la fila de datos correspondiente.

Cuando la cantidad de registros en el índice no único excede un cierto número, el bloqueo de fila también se actualizará a un bloqueo de tabla. La prueba encontró que cuando el índice no único es el mismo

Cuando el contenido no sea menos de la mitad del registro completo de la tabla, se actualizará a un bloqueo de tabla. Porque cuando el mismo contenido del índice no único llega a todo el registro

Cuando se registra la mitad de los registros, el rendimiento requerido por el índice es mayor que el de la búsqueda de texto completo. Al optimizar la declaración de consulta, optará por no usar el índice, lo que resultará en

Cuando el índice falla, el bloqueo de fila se actualizará naturalmente a un bloqueo de tabla.

28. Hable sobre el bloqueo pesimista y el bloqueo optimista

bloqueo pesimista

Se dice que la base de datos se mantiene conservadora al ser modificada por el mundo exterior (incluidas otras cosas actuales en este sistema y el procesamiento de transacciones de sistemas externos)

Actitud, por lo que durante todo el proceso de modificación de datos, los datos están en un estado bloqueado. La implementación pesimista a menudo se basa en la máquina de bloqueo proporcionada por la base de datos.

control, y solo el mecanismo de bloqueo provisto a nivel de base de datos puede garantizar verdaderamente la exclusividad del acceso a los datos, de lo contrario, incluso si el sistema resume el real

Con el mecanismo de bloqueo, no hay forma de garantizar que el sistema no modificará los datos.

En el caso del bloqueo pesimista, para garantizar el aislamiento de las transacciones, se requiere un bloqueo coherente para la lectura. Bloqueo al leer datos, otras transacciones

Estos datos no se pueden modificar. Al modificar y eliminar datos, también se requieren bloqueos y otras transacciones no pueden leer estos datos.

candado optimista

En comparación con el bloqueo pesimista, el mecanismo de bloqueo optimista adopta un mecanismo de bloqueo más relajado. Los bloqueos pesimistas se basan en bloqueos de bases de datos en la mayoría de los casos

Implantación de controles para garantizar la máxima exclusividad de las operaciones. Pero lo que sigue es una gran sobrecarga en el rendimiento de la base de datos, especialmente para eventos largos.

En términos de negocios, tales gastos son a menudo inasequibles.

Según los datos internos de Ali, el mecanismo de bloqueo optimista resuelve este problema hasta cierto punto. Los bloqueos optimistas se implementan principalmente en función del mecanismo de grabación de la versión de datos (Version)

ahora. ¿Qué es una versión de datos? Es decir, agregar un identificador de versión a los datos.En la solución de versión basada en la tabla de la base de datos, generalmente a través de

Agregue un campo de "versión" a la tabla de la base de datos para lograrlo. Cuando lea los datos, lea este número de versión juntos, y cuando actualice más tarde, para

Este número de versión se incrementa en uno. En este punto, compare los datos de la versión de los datos enviados con la información de la versión actual del registro correspondiente en la tabla de la base de datos, si

Si el número de versión de los datos enviados es mayor que el número de versión actual de la tabla de la base de datos, se actualizará; de lo contrario, se considerará como datos caducados.

29. ¿Cómo evitar al máximo el interbloqueo?

1. Establezca el período de tiempo de espera para adquirir el bloqueo, al menos para garantizar que, en el peor de los casos, se pueda salir del programa y no se produzca un punto muerto debido a la espera;

2. Configure los recursos de acceso en el mismo orden, similar a la ejecución en serie;

3. Evitar el cruce de usuarios en las transacciones;

4. Mantenga las transacciones cortas y en un solo lote;

5. Utilice un nivel de aislamiento bajo;

6. Utilice enlaces vinculantes.

30. ¿A qué se debe prestar atención cuando se usa el índice MySQL ?

31. ¿ Cuál es la diferencia entre CHAR y VARCHAR ?

Los tipos CHAR y VARCHAR difieren en almacenamiento y recuperación

La longitud de la columna CHAR se fija a la longitud declarada cuando se creó la tabla, y el valor de la longitud oscila entre 1 y 255. Cuando se almacenan los valores CHAR,

Rellenados con espacios de una longitud específica, los espacios finales se eliminan al recuperar valores CHAR.

Toda la información interna 32. ¿Cuál es la diferencia entre una clave principal y una clave candidata?

Cada fila de la tabla se identifica de forma única mediante una clave principal y una tabla tiene solo una clave principal. Una clave principal es también una clave candidata. Por convención, las claves candidatas pueden ser

Se designa como clave principal y se puede utilizar para cualquier referencia de clave externa.

33. ¿Cuál es la diferencia entre una clave principal y un índice?

La clave principal definitivamente creará un índice único, pero la columna con el índice único no es necesariamente la clave principal;

La clave principal no permite valores nulos y la columna de índice único permite valores nulos;

Una tabla solo puede tener una clave principal, pero puede tener múltiples índices únicos;

Otras tablas pueden hacer referencia a la clave principal como clave externa, pero no a la columna de índice único;

La clave principal es una restricción y el índice único es un índice, que es la estructura de datos redundantes de la tabla.

34. ¿Cómo logra MySQL una alta disponibilidad?

MySQL tiene una alta disponibilidad, lo que significa que si hay un problema con un MySQL, no se puede acceder a él.

1. Alta disponibilidad de MySQL: subbase de datos y subtabla, conecte múltiples MySQL a través de MyCat

2. MyCat también debe tener alta disponibilidad: Haproxy, conecte varios MyCat

3. Haproxy también debe estar altamente disponible: ayude a Haproxy a través de keepalived

SpringCloud _

1. ¿Qué es Spring Cloud ?

El iniciador de aplicaciones Spring Cloud Stream es una aplicación integrada en Spring basada en Spring Boot, que proporciona integración con sistemas externos

convertirse en. Spring Cloud Task, un marco de microservicio de corta duración para crear rápidamente aplicaciones que realizan un procesamiento de datos limitado

programa.

2. ¿Qué es un microservicio?

La arquitectura de microservicios es un patrón o estilo arquitectónico que aboga por dividir una sola aplicación en un conjunto de pequeños servicios,

Cada servicio se ejecuta en su propio proceso independiente, y los servicios se coordinan y cooperan entre sí para brindar a los usuarios el máximo valor. Ropa

Los servicios se comunican entre sí mediante un mecanismo de comunicación ligero (generalmente una API RESTful basada en HTTP)

, cada servicio gira en torno a una determinada

El negocio se puede construir de forma independiente y se puede construir de forma independiente en el entorno de producción, entorno similar a la producción, etc. Además, uniforme, centralizado

El mecanismo interno de gestión de servicios basado en datos de Ali, para un servicio específico, debe basarse en el contexto comercial, elegir el idioma y las herramientas apropiados para implementarlo.

construir, puede haber una administración centralizada muy liviana para coordinar estos servicios, los servicios pueden estar escritos en diferentes idiomas, y

Se pueden utilizar diferentes almacenes de datos.

3. ¿ Cuáles son las ventajas de Spring Cloud ?

Al usar Spring Boot para desarrollar microservicios distribuidos, nos enfrentamos a los siguientes problemas

(1) Complejidad asociada con los sistemas distribuidos: esta sobrecarga incluye problemas de red, sobrecarga de latencia, problemas de ancho de banda, problemas de seguridad.

(2) Descubrimiento de servicios: las herramientas de descubrimiento de servicios administran cómo los procesos y servicios en el clúster se encuentran y se comunican entre sí. se trata de un servicio

directorio, registrar servicios en ese directorio y luego poder encontrar y conectarse a servicios en ese directorio.

(3) Redundancia: problemas de redundancia en sistemas distribuidos.

(4) Equilibrio de carga: el equilibrio de carga mejora las cargas de trabajo en múltiples recursos informáticos, como computadoras, clústeres de computadoras, enlaces de red,

Distribución de unidades centrales de procesamiento, o unidades de disco.

(5) Problemas de rendimiento Problemas de rendimiento debido a varios gastos generales operativos.

(6) Complejidad de implementación: requisitos para las habilidades de DevOps.

4. ¿Qué es un disyuntor de servicio? ¿Qué es la degradación del servicio?

El mecanismo de fusible es un mecanismo de protección de enlace de microservicio para hacer frente al efecto de avalancha. Cuando un microservicio no está disponible o tarda demasiado en responder,

会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微

服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监

控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动

熔断机制。

服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端

可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,

比直接挂掉强。

Hystrix相关注解 @EnableHystrix:开启熔断 @HystrixCommand(fallbackMethod=”XXX”):声明

一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是1000毫秒),就会执行fallback函

数,返回错误提示。

5Eurekazookeeper都可以提供服务注册与发现的功能,请

说说两个的区别?

Zookeeper保证了CP(C:一致性,P:分区容错性),Eureka保证了AP(A:高可用) 1.当向注

册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接

down掉不可用。也就是说,服务注册功能对高可用性要求比较高,但zk会出现这样一种情况,当

master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取

阿里内部资料leader时间过长,30 ~ 120s,且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪。

在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够

恢复,但是漫长的选取时间导致的注册长期不可用是不能容忍的。

2.Eureka保证了可用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余

的节点仍然可以提供注册和查询服务。而Eureka的客户端向某个Eureka注册或发现时发生连接失

败,则会自动切换到其他节点,只要有一台Eureka还在,就能保证注册服务可用,只是查到的信息

可能不是最新的。除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%的节点没有正常

的心跳,那么Eureka就认为客户端与注册中心发生了网络故障,此时会出现以下几种情况:

①、

Eureka不在从注册列表中移除因为长时间没有收到心跳而应该过期的服务。 ②、Eureka仍然能够

接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可用)

③、当

网络稳定时,当前实例新的注册信息会被同步到其他节点。

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样

使整个微服务瘫痪

6SpringBootSpringCloud的区别?

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整

合并管理起来,

为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策

竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目,

但是SpringCloud离不开SpringBoot ,属于

依赖的关系.

SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

7、负载平衡的意义什么?

在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多

种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免

任何单一资源 的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和

可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

8、什么是Hystrix?它如何实现容错?

Hystrix是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避

免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。

通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。

阿里内部资料思考以下微服务

假设如果上图中的微服务9失败了,那么使用传统方法我们将传播一个异常。但这仍然会导致整个

系统崩溃。

随着微服务数量的增加,这个问题变得更加复杂。微服务的数量可以高达1000.这是hystrix出现的

地方 我们将使用Hystrix在这种情况下的Fallback方法功能。我们有两个服务employee-consumer

使用由employee-consumer公开的服务。

简化图如下所示

现在假设由于某种原因,employee-producer公开的服务会抛出异常。我们在这种情况下使用

Hystrix定义了一个回退方法。这种后备方法应该具有与公开服务相同的返回类型。如果暴露服务中

出现异常,则回退方法将返回一些值。

9、什么是Hystrix断路器?我们需要它吗?

由于某些原因,employee-consumer公开服务会引发异常。在这种情况下使用Hystrix我们定义了

一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。

阿里内部资料如果fifirstPage method() 中的异常继续发生,则Hystrix电路将中断,并且员工使用者将一起跳过

fifirtsPage方法,并直接调用回退方法。 断路器的目的是给第一页方法或第一页方法可能调用的其他

方法留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更

好的恢复机会 。

10、说说 RPC 的实现原理

首先需要有处理网络连接通讯的模块,负责连接建立、管理和消息的传输。其次需要有编 解码的模

块,因为网络通讯都是传输的字节码,需要将我们使用的对象序列化和反序列 化。剩下的就是客户

端和服务器端的部分,服务器端暴露要开放的服务接口,客户调用服 务接口的一个代理实现,这个

代理实现负责收集数据、编码并传输给服务器然后等待结果 返回。

11eureka自我保护机制是什么?

当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户

端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保

护模式。

12,什么是Ribbon

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。feign默认集成了ribbon。

阿里内部资料13,什么是 feigin ?它的优点是什么?

1.feign采用的是基于接口的注解 2.feign整合了ribbon,具有负载均衡的能力 3.整合了Hystrix,具

有熔断的能力

使用: 1.添加pom依赖。 2.启动类添加@EnableFeignClients 3.定义一个接口

@FeignClient(name=“xxx”)指定调用哪个服务

14. ¿ Cuál es la diferencia entre Ribbon y Fingir ?

1.Ribbon llama a otros servicios, pero de diferentes maneras. 2. Las anotaciones de la clase de inicio son diferentes, Ribbon es @RibbonClient fingir

¿Qué es @EnableFeignClients 3. La ubicación especificada por el servicio es diferente La cinta se declara en la anotación @RibbonClient y Fingir

Es usar la declaración @FeignClient en la interfaz que define el método abstracto. 4. El método de llamada es diferente, Ribbon necesita construir http por sí mismo

solicitud, simular solicitud http

Artículos Dubbo

De hecho, con respecto a las preguntas de la entrevista de Dubbo, creo que el mejor documento debería ser el sitio web oficial, porque el sitio web oficial tiene una versión en chino, que se ocupa de muchos lectores.

Amigos que tienen dificultades para leer documentos en inglés. Pero el sitio web oficial tiene mucho contenido, así que aquí hay una combinación del sitio web oficial y las entrevistas habituales, y hay relativamente muchas preguntas.

Los temas han sido ordenados.

1. Cuénteme sobre el proceso de solicitud de servicio de Dubbo .

Flujo de trabajo básico:

La descripción del rol en la imagen de arriba de la información interna de Ali:

2. Hable sobre el principio de funcionamiento de Dubbo

El principio de funcionamiento se divide en 10 capas:

La primera capa: capa de servicio, capa de interfaz, implementada para proveedores de servicios y consumidores (dejada para que la implementen los desarrolladores);

La segunda capa: capa de configuración, capa de configuración, principalmente para varias configuraciones de Dubbo, configuración relacionada con Dubbo;

La tercera capa: capa de proxy, la capa de proxy de servicio, genera de forma transparente el stub del cliente y el esqueleto de la orden de servicio, y llama a la interfaz

Puerto, no hay clase de implementación, por lo que hay que generar agentes, y luego la comunicación en red entre agentes, encargados del balanceo, etc.;

La cuarta capa: capa de registro, capa de registro de servicios, responsable del registro y descubrimiento de servicios;

La quinta capa de datos internos de Ali: capa de clúster, capa de clúster, enrutamiento encapsulado y balanceo de carga de múltiples proveedores de servicios, combinando múltiples instancias en una

servicio;

La sexta capa: capa de monitor, capa de monitoreo, monitorea los tiempos de llamada y el tiempo de llamada de la interfaz rpc;

La séptima capa: capa de protocolo, capa de llamada remota, encapsula la llamada rpc;

La octava capa: capa de intercambio, capa de intercambio de información, modo de respuesta de solicitud de encapsulación, síncrono a asíncrono;

Novena capa: capa de transporte, capa de transporte de red, mina abstracta y netty como interfaz unificada;

La décima capa: capa de serialización, capa de serialización de datos.

Esta es una pregunta de entrevista muy engañosa, pero a muchos entrevistadores les gusta preguntar, ¿realmente quieres memorizarla? Es bueno si puedes recitar eso, sugiero

No lo memorice, solo piense en qué tecnologías deberían estar involucradas en el proceso de llamada de servicio de Dubbo, y está bien unir estas tecnologías.

difusión de entrevistas

Si le pidieran que diseñara un marco RPC, ¿qué haría? De hecho, puede resumir los puntos técnicos involucrados en el principio de funcionamiento anterior.

Solo descárgalo.

3. ¿ Qué protocolos admite Dubbo ?

Hay otros tres tipos, simplemente familiarizados con ellos: protocolo Memcached, protocolo Redis y protocolo Rest.

La figura anterior enumera básicamente los métodos de serialización.

Para obtener más información, consulte: Sitio web oficial de Dubbo: http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dub

bo.html.

4. El centro de registro no funciona, ¿puede el consumidor llamar al proveedor ?

Poder. Porque al comienzo de la inicialización, el consumidor extraerá todas las direcciones del proveedor y otra información que necesita para el caché local.

Guarde, para que el centro de registro pueda continuar comunicándose cuando cuelgue. Pero si el proveedor está caído, no se puede llamar.

Palabras clave de datos internos de Ali: lista de servicios de caché local del consumidor.

5. ¿Cómo realizar el servicio fuera de línea de percepción dinámica?

La suscripción al servicio de datos internos de Ali generalmente tiene dos métodos: tirar y empujar:

El modo de extracción requiere que el cliente extraiga periódicamente la configuración del registro;

El modo push utiliza el centro de registro para enviar activamente datos al cliente.

El centro de registro de datos internos Dubbo ZooKeeper de Alibaba adopta el método de notificación de eventos y extracción de clientes. Cuando el servicio se suscribe por primera vez, extraerá

Corresponda a la cantidad total de datos en el directorio y luego registre un observador en el nodo suscrito. Una vez que los datos cambien en el nodo de directorio,

ZooKeeper notificará a los clientes a través del observador. Después de recibir la notificación, el cliente volverá a obtener la cantidad total de datos en el directorio.

Y vuelve a registrarte como observador. Usando este modo, el servicio Dubbo puede lograr un descubrimiento de servicio dinámico.

Nota: ZooKeeper proporciona una función de "detección de latidos", que periódicamente enviará una solicitud a cada proveedor de servicios (en realidad establecerá

es una conexión a largo plazo de socket), si no hay respuesta durante mucho tiempo, el centro de servicio pensará que el proveedor de servicios se ha "colgado" y lo enviará

eliminar.

6. ¿ Estrategia de equilibrio de carga de Dubbo ?

aleatorio (predeterminado): vienen al azar

Entrenamiento rotativo: ven de uno en uno

Actividad: actividad de la máquina para cargar

Hash consistente: caer en la misma máquina

7. Estrategia de tolerancia a fallas de Dubbo

modo de clúster de conmutación por error

Una vez que el proveedor deja de funcionar y vuelve a intentarlo, la solicitud se distribuirá a otros proveedores. El valor predeterminado es dos veces y el número de reintentos se puede establecer manualmente.

Se recomienda establecer el número de reintentos de operaciones de escritura en 0.

modo de conmutación por recuperación

La recuperación automática de fallas devolverá un resultado vacío al consumidor del servicio después de que falle la llamada. Y a través de la tarea programada para llamar a la llamada fallida

Reintentar, adecuado para realizar operaciones como la notificación de mensajes.

modo de clúster a prueba de fallas

Fail-fast solo realizará una única llamada, lanzando una excepción inmediatamente después de la falla. Adecuado para operaciones idempotentes y operaciones de escritura, similar a la conmutación por error

El caso en el que el número de reintentos se establece en 0 en el modo de clúster.

modo de clúster a prueba de fallas

A prueba de fallas significa que cuando ocurre una excepción durante la llamada, la excepción solo se imprimirá en lugar de lanzarse. Adecuado para escribir en el registro de auditoría

etcétera.

bifurcación del modo de clúster

Llame a varios servidores en paralelo y regrese siempre que uno tenga éxito. Por lo general, se usa para operaciones de lectura con altos requisitos de tiempo real, pero necesita desperdiciar más

Recursos de servicio. El número máximo de paralelismo se puede establecer con forks="2".

modo de clúster de difusión

Broadcast llama a todos los proveedores uno por uno, y si alguno informa un error, informará un error. Por lo general, se usa para notificar a todos los proveedores que actualicen el caché o los registros

y otra información de recursos locales.

Información interna de Ali 8. ¿ Cuáles son las estrategias de proxy dinámico de Dubbo ?

De forma predeterminada, la generación de códigos de bytes dinámicos de javassist se usa para crear clases de proxy, pero puede configurar su propio proxy dinámico a través del mecanismo de extensión SPI.

Estrategia.

9. Cuéntame sobre la diferencia entre Dubbo y Spring Cloud .

Esta es una pregunta que les gusta hacer a muchos entrevistadores, creo que no tienen nada que ver, pero si quieres preguntar la diferencia, hablemos.

Bar.

Al responder, gira principalmente en torno a cuatro puntos clave: método de comunicación, centro de registro, monitoreo, disyuntor y el resto como distribución Spring.

Debe conocer la puerta de enlace de configuración y servicio.

forma de comunicación

Dubbo usa comunicación RPC; Spring Cloud usa el método HTTP RestFul.

centro de registro

Dubbo usa ZooKeeper (recomendado oficialmente) y Redis, Multicast, Registro simple, pero no recomendado. ;

Spring Cloud utiliza Spring Cloud Netflix Eureka.

monitor

Dubbo usa Dubbo-monitor; Spring Cloud usa Spring Boot admin.

interruptor automático

Dubbo 在断路器这方面还不完善,Spring Cloud 使用的是 Spring Cloud Netflflix Hystrix。

分布式配置、网关服务、服务跟踪、消息总线、批量任务等。

Dubbo 目前可以说还是空白,而 Spring Cloud 都有相应的组件来支撑。

10Zookeeper Dubbo 的关系?

Zookeeper的作用

zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简

单来说就是ip地址和服务名称的对应关系。当然也可以通过硬编码的方式把这种对应关系在调用方

业务代码中实现,但是如果提供服务的机器挂掉调用者无法知晓,如果不更改代码会继续请求挂掉

的机器提供服务。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系

从列表中删除。至于支持高并发,简单来说就是横向扩展,在不更改代码的情况通过添加机器来提

高运算能力。通过添加新的机器向zookeeper注册服务,服务的提供者多了能服务的客户就多了。

阿里内部资料dubbo

是管理中间层的工具,在业务层到数据仓库间有非常多服务的接入和服务提供者需要调度,dubbo

提供一个框架解决这个问题。 注意这里的dubbo只是一个框架,至于你架子上放什么是完全取决于

你的,就像一个汽车骨架,你需要配你的轮子引擎。这个框架中要完成调度必须要有一个分布式的

注册中心,储存所有服务的元数据,你可以用zk,也可以用别的,只是大家都用zk。

zookeeperdubbo的关系

Dubbo 的将注册中心进行抽象,它可以外接不同的存储媒介给注册中心提供服务,有

ZooKeeper,Memcached,Redis 等。

La introducción de ZooKeeper como medio de almacenamiento también introduce las características de ZooKeeper. El primero es balanceo de carga, registro único

La capacidad de carga del corazón es limitada. Cuando el tráfico alcanza cierto nivel, es necesario desviarlo. El equilibrio de carga existe para el desvío.

Sí, un grupo de ZooKeeper puede lograr fácilmente el equilibrio de carga con la aplicación web correspondiente; sincronización de recursos, solo con carga

El equilibrio no es suficiente, los datos y los recursos entre los nodos deben sincronizarse, los clústeres de ZooKeeper naturalmente tienen esa función; nombrar

Servicio, la estructura de árbol se utiliza para mantener la lista de direcciones de servicio global. Cuando el proveedor de servicios se inicia, envía

Escriba su propia dirección URL en el nodo especificado /dubbo/${serviceName}/directorio de proveedores, y esta operación completa el servicio

liberación de servicio. Otras características incluyen elecciones de mástil, bloqueos distribuidos, etc.

Artículos de Nginx

1. Describa brevemente qué es Nginx y cuáles son sus ventajas y funciones.

Nginx es un servidor web y un servidor proxy direccional para los protocolos HTTP, HTTPS, SMTP, POP3 e IMAP. porque

Es conocido por su estabilidad, rico conjunto de funciones, archivos de configuración de muestra y bajo consumo de recursos del sistema.

Nginx --- Ngine X, es un servidor HTTP y servidor proxy inverso gratuito, gratuito, de código abierto y de alto rendimiento;

También es un servidor proxy IMAP, POP3, SMTP; Nginx es conocido por su alto rendimiento, estabilidad, funciones ricas y simple

Conocido por la configuración y el bajo consumo de recursos.

La información interna de Alibaba significa que el propio Nginx puede alojar sitios web (similares a Tomcat), realizar el procesamiento del servicio Http y también puede usarse como

Servidor proxy inverso, equilibrador de carga y caché HTTP.

Nginx resuelve el problema C10K del servidor (es decir, la cantidad de clientes conectados en un segundo es 10k o 10,000). su entorno

El diseño no utiliza subprocesos para procesar solicitudes como los servidores tradicionales, sino un mecanismo más avanzado, un mecanismo basado en eventos, que es un

Una estructura asíncrona impulsada por eventos.

ventaja:

( 1 ) Más rápido Esto se manifiesta en dos aspectos: por un lado, en circunstancias normales, una sola solicitud obtendrá una respuesta más rápida; por otro lado,

Durante los períodos pico (como decenas de miles de solicitudes simultáneas), Nginx puede responder a las solicitudes más rápido que otros servidores web.

( 2 ) Alta escalabilidad, el diseño de Nginx multiplataforma es extremadamente escalable, está completamente compuesto de múltiples funciones diferentes, diferentes niveles, diferentes tipos

Está compuesto por módulos con un acoplamiento extremadamente bajo. Por lo tanto, al corregir errores o actualizar un determinado módulo, puede concentrarse en el módulo en sí,

No te preocupes por nada más. Además, en el módulo HTTP también se diseña un módulo de filtro HTTP: se procesa un módulo HTTP normal

Después de la solicitud, habrá una serie de módulos de filtro HTTP para reprocesar el resultado de la solicitud. De esta forma, cuando desarrollamos un nuevo módulo HTTP

, no solo puede usar diferentes niveles o diferentes tipos de módulos, como el módulo central HTTP, el módulo de eventos, el módulo de registro, etc., sino también

Una gran cantidad de módulos de filtro HTTP existentes se pueden reutilizar intactos. Este excelente diseño de bajo acoplamiento ha creado un enorme Nginx

Los módulos de terceros, por supuesto, los módulos públicos de terceros son tan fáciles de usar como los módulos lanzados oficialmente. Los módulos Nginx están todos integrados

Se ejecuta en el archivo binario, independientemente del módulo lanzado oficialmente o del módulo de terceros. Esto hace que los módulos de terceros sean

Tiene un rendimiento excelente y aprovecha al máximo la característica de alta concurrencia de Nginx. Por lo tanto, muchos sitios web de alto tráfico tienden a desarrollar sus propios

Un módulo personalizado con características propias de negocio.

( 3 ) Alta confiabilidad: para el proxy inverso, la probabilidad de tiempo de inactividad es muy pequeña La alta confiabilidad es la condición más básica para que elijamos Nginx, porque

Debido a que la confiabilidad de Nginx es obvia para todos, muchos sitios web de alto tráfico usan Nginx a gran escala en sus servidores centrales.

La alta confiabilidad de Nginx proviene del excelente diseño de su código de marco central y la simplicidad del diseño del módulo; además, el código oficial de uso común

Los módulos son muy estables, cada proceso de trabajo es relativamente independiente y el proceso maestro puede "tirar" rápidamente cuando falla un proceso de trabajo.

iniciar" nuevo proceso de niño trabajador para prestar servicios.

( 4 ) Bajo consumo de memoria En general, 10 000 conexiones HTTP Keep-Alive inactivas consumen solo 2,5 MB en Nginx

Memoria, que es la base para que Nginx admita un alto número de conexiones simultáneas.

( 5 ) Una sola máquina soporta más de 100.000 conexiones simultáneas ¡Esta es una característica muy importante! Con el rápido desarrollo de Internet y el uso de

Con el crecimiento exponencial del número de usuarios, las principales empresas y sitios web deben hacer frente a solicitudes simultáneas masivas. Uno puede soportar más de 100.000 y

El servidor que envía la solicitud sin duda será el favorito de todos. Teóricamente, el límite superior de conexiones simultáneas admitidas por Nginx depende de la memoria, 100.000

Lejos de tapado. Por supuesto, poder manejar más solicitudes simultáneas de manera oportuna está estrechamente relacionado con las características comerciales.

( 6 ) El diseño de separación del proceso de gestión principal de implementación en caliente y el proceso de trabajo del trabajador permite a Nginx proporcionar una función de implementación en caliente, a saber

El archivo ejecutable de Nginx se puede actualizar bajo la premisa de servicio ininterrumpido 7×24. Por supuesto, también admite actualizaciones sin detener el servicio.

Funciones como nuevos elementos de configuración y reemplazo de archivos de registro.

Información interna de Ali ( 7 ) El acuerdo de licencia BSD más libre Esta es una poderosa fuerza impulsora para el rápido desarrollo de Nginx. El acuerdo de licencia de BSD no solo permite a los usuarios

Gratis para usar Nginx, también permite a los usuarios usar o modificar directamente el código fuente de Nginx en sus propios proyectos y luego publicar. Esto ha atraído a innumerables

Los desarrolladores continúan contribuyendo con su cerebro a Nginx. Por supuesto, las 7 características anteriores no son todas de Nginx, y tiene innumerables módulos de funciones oficiales.

Los bloques y los módulos funcionales de terceros permiten que Nginx cumpla con la mayoría de los escenarios de aplicaciones. Estos módulos funcionales se pueden superponer para lograr más

Funciones potentes y complejas, algunos módulos también admiten la integración de Nginx y Perl, Lua y otros lenguajes de secuencias de comandos, lo que mejora en gran medida la eficiencia del desarrollo.

Tasa. Estas características hacen que los usuarios consideren más a Nginx cuando buscan un servidor web. La razón principal para elegir Nginx es que puede

Mantenga un servicio eficiente mientras admite un alto número de solicitudes simultáneas.

2. ¿Cómo maneja Nginx una solicitud HTTP ?

Nginx es un servidor web de alto rendimiento que puede manejar una gran cantidad de solicitudes simultáneas al mismo tiempo. Combina mecanismo multiproceso y mecanismo asíncrono.

, el mecanismo asíncrono utiliza un método asíncrono sin bloqueo. A continuación, presentaré el mecanismo de subprocesos múltiples de Nginx y el método asíncrono sin bloqueo.

mecanismo.

1. Mecanismo multiproceso

Cada vez que el servidor recibe un cliente, el proceso maestro del servidor (proceso maestro) genera un proceso secundario (

proceso de trabajo) sale para establecer una conexión con el cliente para interactuar hasta que la conexión se desconecta y el proceso secundario finaliza.

La ventaja de usar procesos es que cada proceso es independiente entre sí y no necesita estar bloqueado, lo que reduce el impacto del uso de bloqueos en el rendimiento y reduce

La complejidad de la programación reduce los costes de desarrollo. En segundo lugar, el uso de procesos independientes puede evitar que los procesos se afecten entre sí.

Cuando un proceso finaliza de manera anormal, otros procesos funcionan con normalidad y el proceso maestro iniciará rápidamente un nuevo proceso de trabajo para garantizar el servicio.

No habrá interrupciones, minimizando así el riesgo.

La desventaja es que el sistema operativo necesita realizar copias de memoria y otras operaciones para generar un proceso secundario, lo que generará cierta sobrecarga en términos de recursos y tiempo. cuando

Cuando hay una gran cantidad de solicitudes, el rendimiento del sistema se degradará.

2. Mecanismo asíncrono de no bloqueo

Cada proceso de trabajo utiliza un método asíncrono sin bloqueo y puede manejar varias solicitudes de clientes.

Cuando un proceso de trabajo recibe una solicitud del cliente, llama a IO para su procesamiento. Si el resultado no se puede obtener de inmediato, lo procesará.

Otras solicitudes (es decir, sin bloqueo); y el cliente no necesita esperar una respuesta durante este período, y puede manejar otras cosas (es decir, diferentes

paso).

Cuando regresa el IO, se notifica al proceso de trabajo; se notifica al proceso y suspende temporalmente la transacción procesada actualmente para responder al cliente

preguntar.

3、列举一些Nginx的特性

1. Nginx服务器的特性包括:

2. 反向代理/L7负载均衡器

3. 嵌入式Perl解释器

4. 动态二进制升级

5. 可用于重新编写URL,具有非常好的PCRE支持

阿里内部资料4、请列举NginxApache 之间的不同点

5、在Nginx中,如何使用未定义的服务器名称来阻止处理请求?

只需将请求删除的服务器就可以定义为:

Server{

listen 80;

server_name "";

return 444;

}

这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊

的Nginx的非标准代码444被返回,从而终止连接。

一般推荐 worker 进程数与CPU内核数一致,这样一来不存在大量的子进程生成和管理任务,避免

了进程之间竞争CPU 资源和进程切换的开销。而且 Nginx 为了更好的利用 多核特性 ,提供了 CPU

亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来

Cache 的失效。

对于每个请求,有且只有一个工作进程 对其处理。首先,每个 worker 进程都是从 master进程

fork 过来。在 master 进程里面,先建立好需要 listen 的 socket(listenfd)

之后,然后再 fork 出

多个 worker 进程。

阿里内部资料所有 worker 进程的 listenfd 会在新连接到来时变得可读 ,为保证只有一个进程处理该连接,所有

El proceso de trabajo se adelanta a accept_mutex antes de registrar el evento de lectura de listenfd, y el proceso que toma el mutex registra la lectura de listenfd

evento, llame a accept en el evento de lectura para aceptar la conexión.

Cuando un proceso de trabajo acepta la conexión, comienza a leer la solicitud, analizar la solicitud, procesar la solicitud y generar datos

Después de eso, regrese al cliente y finalmente desconéctese. Una solicitud tan completa se vería así. Podemos ver que un

Las solicitudes son manejadas completamente por procesos de trabajo y solo en un proceso de trabajo.

Durante la ejecución del servidor Nginx,

El proceso maestro y los procesos de trabajo requieren la interacción del proceso. La interacción depende de la canalización implementada por Socket

para cumplir

6. Explique cuáles son los procesos Master y Worker en el servidor Nginx .

Después de que se inicia el proceso maestro del programa principal, recibe y procesa señales externas a través de un bucle for;

El proceso principal genera procesos secundarios trabajadores a través de la función fork(), y cada proceso secundario ejecuta un bucle for para implementar el servidor Nginx

Recibir y procesar eventos.

7. Explique el proxy directo y el proxy inverso en el proxy

En primer lugar, un servidor proxy generalmente se refiere a una máquina en la LAN que envía una solicitud a un servidor en Internet a través de un servidor proxy.

El servidor generalmente actúa sobre el cliente. Por ejemplo: software de elusión GoAgent. Cuando nuestro cliente realiza operaciones sobre la pared, utilizamos

Es el proxy de reenvío que se utiliza. A través del proxy de reenvío, se ejecuta un software en nuestro cliente para reenviar nuestra solicitud HTTP.

A otros servidores diferentes para realizar la distribución de peticiones.

El servidor proxy inverso actúa en el lado del servidor, recibe la solicitud del cliente en el lado del servidor y luego distribuye la solicitud a servicios específicos.

El servidor lo procesa y luego retroalimenta los resultados correspondientes del servidor al cliente. Nginx es un software de servidor proxy inverso.

Como se puede ver en la figura anterior: el cliente debe configurar un servidor proxy de reenvío, por supuesto, la premisa es conocer la dirección IP del servidor proxy de reenvío,

También está el puerto del agente. El proxy inverso es justo lo contrario del proxy directo, y el servidor proxy es como el servicio original para el cliente.

servidor, y el cliente no requiere ninguna configuración especial. El cliente al espacio de nombres (name-space) del proxy inverso

El contenido envía una solicitud normal, y luego el proxy inverso determinará dónde transferir la solicitud (servidor de origen) y devolverá el contenido obtenido a

cliente.

8. Explicar el propósito de Nginx

El mejor uso del servidor Nginx es implementar contenido HTTP dinámico en la web, utilizando el servidor de aplicaciones SCGI, WSGI, para

Controlador FastCGI para scripts. También actúa como un equilibrador de carga.

Artículos MQ

1. Por qué usar MQ

Núcleo: desacoplamiento , asíncrono , recorte de picos

Ali información interna 1 ) Desacoplamiento: El sistema A envía datos a los tres sistemas BCD y los envía a través de llamadas de interfaz. ¿Qué pasa si el sistema E también quiere estos datos? Eso

¿Qué pasa si el sistema C ya no es necesario? El responsable del Sistema A casi colapsa... El Sistema A está seriamente acoplado con otros sistemas desordenados

Combinado, el sistema A genera una pieza de datos críticos, y muchos sistemas requieren que el sistema A envíe estos datos. si uso

MQ, el Sistema A genera un dato y lo envía a MQ, cuyo sistema necesita datos para consumir en MQ por sí mismo. si es nuevo

Si el sistema necesita datos, se pueden consumir directamente desde MQ; si un sistema no necesita estos datos, cancele el mensaje de mensaje MQ

La tarifa puede ser. De esta manera, el sistema A no necesita pensar a quién enviar datos, no necesita mantener este código y no necesita

Considere si la llamada es exitosa, el tiempo de espera de falla, etc.

Es un sistema o un módulo que llama a múltiples sistemas o módulos, las llamadas entre ellos son muy complicadas y el mantenimiento es problemático.

molestar. Pero, de hecho, esta llamada no necesita llamar directamente a la interfaz de forma síncrona, si se usa MQ para desacoplarla de forma asíncrona.

2)异步:A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地

写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 +

450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请

求。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一

个请求到返回响应给用户,总时长是 3 + 5 = 8ms。

3)削峰:减少高峰时期对服务器压力。

欢迎关注微信公众号:Java后端技术全栈

2MQ有什么优缺点

优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。

缺点有以下几个:

系统可用性降低 系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩

溃,你不就完了?

系统复杂度提高 硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?

怎么保证消息传递的顺序性?问题一大堆。

一致性问题 A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是

BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致

了。

3. ¿ Cuáles son las diferencias entre Kafka , ActiveMQ , RabbitMQ y RocketMQ?

¿No?

Para el rendimiento, Kafka y RocketMQ admiten un alto rendimiento, y ActiveMQ y RabbitMQ son un orden de magnitud inferior a ellos. para

RabbitMQ es el más bajo en términos de latencia.

1. Del grado de actividad comunitaria

Información interna de Ali De acuerdo con la información actual en Internet, entre RabbitMQ, activeM y ZeroMQ, en general, RabbitMQ es el primero

seleccionar.

2. Comparación de mensajes persistentes

Se admiten tanto ActiveMq como RabbitMq. Los mensajes persistentes se refieren principalmente a que nuestra máquina se cuelga por circunstancias como fuerza mayor.

El mecanismo por el cual la información no se perderá.

3. Realización técnica integral

Fiabilidad, enrutamiento flexible, agrupamiento, transacciones, colas de alta disponibilidad, ordenación de mensajes, seguimiento de problemas, herramientas de gestión visual, complementos

sistema y así sucesivamente.

RabbitMq/Kafka es el mejor, ActiveMq es el siguiente y ZeroMq es el peor. Por supuesto, ZeroMq también puede hacerlo, pero debes

Es necesario escribir código manualmente para implementar, y la cantidad de código no es pequeña. Especialmente fiabilidad: persistencia, confirmación de entrega, confirmación del editor y alta disponibilidad.

sexo.

4. Alta concurrencia

Sin duda, RabbitMQ es el más alto, porque su lenguaje de implementación es el lenguaje erlang que nace con alta concurrencia y alta disponibilidad.

5. Una comparación de preocupaciones, RabbitMQ y Kafka

RabbitMq es más maduro que Kafka, en términos de usabilidad, estabilidad y confiabilidad, RabbitMq es mejor que Kafka (teoría

superior).

Además, el posicionamiento de Kafka es principalmente en términos de registros, etc.

Debido a que la intención original del diseño de Kafka es procesar registros, puede considerarse como un

El sistema de registro (mensajes) es un componente importante y está muy orientado, por lo que se recomienda elegir RabbitMq en términos de negocios.

Además, el rendimiento (rendimiento, TPS) de Kafka es mucho mayor que el de RabbitMq.

4. ¿Cómo garantizar una alta disponibilidad?

RabbitMQ es más representativo, porque se basa en maestro-esclavo (no distribuido) para alta disponibilidad, usamos RabbitMQ

Como ejemplo, explique cómo realizar la alta disponibilidad del primer MQ. RabbitMQ tiene tres modos: modo independiente, modo de clúster común,

Modo de clúster duplicado.

El modo independiente es el nivel de demostración. Por lo general, lo inicia localmente por diversión. Nadie usa el modo independiente para la producción.

El modo de clúster ordinario significa iniciar varias instancias de RabbitMQ en varias máquinas, una para cada máquina. tu creaste

la cola solo se colocará en una instancia de RabbitMQ , pero cada instancia sincronizará los metadatos de la cola (los metadatos se pueden identificar como

Para obtener información de configuración de la cola, la instancia donde se encuentra la cola se puede encontrar a través de los metadatos). Cuando consumes, en realidad

Si está conectado a otra instancia, esa instancia extraerá datos de la instancia donde se encuentra la cola. Este plan es principalmente para

Alto rendimiento significa que múltiples nodos en el clúster sirven las operaciones de lectura y escritura de una determinada cola.

Modo de clúster de duplicación de datos internos de Alibaba: este modo es el llamado modo de alta disponibilidad de RabbitMQ. A diferencia del modo de clúster normal, en

En el modo de clúster espejo, la cola que cree, independientemente de los metadatos o los mensajes en la cola, existirá en varias instancias , solo

Es decir, cada nodo RabbitMQ tiene una imagen completa de la cola, incluyendo todos los datos de la cola. Sin embargo

Después de eso, cada vez que escriba un mensaje en la cola, el mensaje se sincronizará automáticamente con las colas de varias instancias. RabbitMQ tiene muchos

Una buena consola de administración es agregar una política en segundo plano. Esta política es una política de modo de clúster duplicado. Cuando se especifica, se puede

Si se requiere que los datos se sincronicen con todos los nodos, también se puede requerir que se sincronicen con un número específico de nodos. Al crear una cola nuevamente, aplique esto

Esta estrategia sincronizará automáticamente los datos con otros nodos. En este caso, la ventaja es que si alguna de sus máquinas se cae

Está bien, otras máquinas (nodos) también contienen los datos completos de esta cola, y otros consumidores pueden ir a otros

Los nodos van a consumir datos. La desventaja es que, en primer lugar, la sobrecarga de rendimiento es demasiado alta. Los mensajes deben sincronizarse con todas las máquinas, lo que lleva a

¡La presión y el consumo de ancho de banda de la red son pesados! Los datos de una cola de RabbitMQ se colocan en un nodo, debajo del clúster espejo,

Además cada nodo pone los datos completos de esta cola.

Una de las interpretaciones arquitectónicas más básicas de Kafka: consta de múltiples intermediarios, cada intermediario es un nodo; se crea un

tema, este tema se puede dividir en varias particiones, cada partición puede existir en diferentes corredores, cada uno

La partición pone una parte de los datos. Esta es una cola de mensajes distribuida natural, es decir, los datos de un tema están dispersos en

En varias máquinas, cada máquina pone una parte de los datos . Después de Kafka 0.8, se proporciona un mecanismo HA, que es réplica (replicación

producto)

mecanismo de copia Los datos de cada partición se sincronizarán con otras máquinas para formar sus propias copias de réplicas múltiples. todo

La réplica elegirá un líder, luego tanto la producción como el consumo se ocuparán de este líder, y luego se harán otras réplicas.

seguidor. Al escribir, el líder se encargará de sincronizar los datos a todos los seguidores, y al leer, leer directamente al líder

Los datos anteriores son suficientes. ¿Solo puede leer y escribir líder? Es muy simple, si puede leer y escribir a cada seguidor a voluntad, entonces debe preocuparse por

De acuerdo con el problema de la consistencia, la complejidad del sistema es demasiado alta y es fácil equivocarse. Kafka distribuirá uniformemente todos

Las réplicas se distribuyen en diferentes máquinas para mejorar la tolerancia a fallas. Porque si un corredor cae, está bien, entonces

La partición en un intermediario tiene copias en otras máquinas. Si hay un líder de partición en él, entonces

Entonces, en este momento, un nuevo líder será reelegido de entre los seguidores, y todos podrán continuar leyendo y escribiendo al nuevo líder. esto es

Hay algo llamado alta disponibilidad. Al escribir datos, el productor escribe en el líder y luego el líder escribe los datos en el disco local.

Luego, otros seguidores toman la iniciativa de extraer datos del líder. Una vez que todos los seguidores hayan sincronizado los datos, se enviará

El acuse de recibo se envía al líder.Después de que el líder recibe todos los acuses de recibo de los seguidores, devolverá un mensaje de éxito de escritura al productor. (cuando

Por supuesto, este es solo uno de los modos, y este comportamiento se puede ajustar adecuadamente) Al consumir, solo leerá del líder, pero solo

Cuando un mensaje ha sido devuelto sincrónicamente y con éxito por todos los seguidores, el consumidor leerá el mensaje.

5. ¿Cómo garantizar la transmisión confiable de mensajes? qué hacer si se pierde el mensaje

El problema de la pérdida de datos puede aparecer en productores, MQ y consumidores.

Pérdida del productor: cuando el productor envía datos a RabbitMQ, los datos pueden perderse a la mitad debido a problemas de red

Todo es posible. En este momento, puede optar por utilizar la función de transacción proporcionada por RabbitMQ, es decir, el productor comienza antes de enviar datos

Canal de transacción de RabbitMQ.txSeleccione y luego envíe un mensaje, si RabbitMQ no recibe correctamente el mensaje, entonces

El productor recibirá un error de excepción y, en este momento, la transacción channel.txRollback se puede revertir y luego intentar enviar el mensaje nuevamente, si se recibe

了消息,那么可以提交事务channel.txCommit。吞吐量会下来,因为太耗性能。所以一般来说,如

果你要确保说写 RabbitMQ 的消息别丢,可以开启confifirm模式,在生产者那里设置开启confifirm模

式之后,你每次写的消息都会分配一个唯一的 id,然后如果写入了 RabbitMQ 中,RabbitMQ 会给

阿里内部资料你回传一个ack消息,告诉你说这个消息 ok 了。如果 RabbitMQ 没能处理这个消息,会回调你一个

nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每

个消息 id 的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。事务机制和

cnofifirm机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是

confifirm机制是异步的,你发送个消息之后就可以发送下一个消息,然后那个消息RabbitMQ 接收

了之后会异步回调你一个接口通知你这个消息接收到了。所以一般在生产者这块避免数据丢失,都

是用confifirm机制的。

MQ中丢失:就是 RabbitMQ 自己弄丢了数据,这个你必须开启 RabbitMQ 的持久化,就是消息写

入之后会持久化到磁盘,哪怕是 RabbitMQ 自己挂了,恢复之后会自动读取之前存储的数据,一般

数据不会丢。设置持久化有两个步骤:创建 queue 的时候将其设置为持久化,这样就可以保证

RabbitMQ 持久化 queue 的元数据,但是不会持久化 queue 里的数据。第二个是发送消息的时候

将消息的 deliveryMode 设置为 2,就是将消息设置为持久化的,此时 RabbitMQ 就会将消息持久

化到磁盘上去。必须要同时设置这两个持久化才行,RabbitMQ 哪怕是挂了,再次重启,也会从磁

盘上重启恢复 queue,恢复这个 queue 里的数据。持久化可以跟生产者那边的confifirm机制配合起

Vamos, el productor será notificado del acuse de recibo solo después de que el mensaje se conserve en el disco, por lo que incluso antes de que se conserve en el disco,

RabbitMQ cuelga, los datos se pierden y el productor no puede recibir el acuse de recibo, también puede reenviarlo usted mismo. Tenga en cuenta que incluso si le da

RabbitMQ ha habilitado el mecanismo de persistencia.También existe la posibilidad de que este mensaje se haya escrito en RabbitMQ, pero aún no ha llegado.

Y persista en el disco, desafortunadamente, en este momento RabbitMQ cuelga, lo que hará que se pierdan algunos datos en la memoria.

Perdido del lado del consumidor: Cuando consumes, acabas de consumirlo y aún no lo procesaste, como resultado, el proceso se cuelga, como reiniciar, entonces es vergonzoso.

RabbitMQ cree que ha consumido todos los datos y los datos se pierden. En este momento, debe usar el mecanismo de acuse de recibo proporcionado por RabbitMQ, simplemente

En otras palabras, si desactiva el reconocimiento automático de RabbitMQ, puede llamarlo a través de una API y luego, cada vez que lo confirme en su propio código.

Cuando se complete el procesamiento, vuelva a confirmarlo en el programa. En este caso, si no ha terminado de procesar, ¿no hay acuse de recibo? Eso

RabbitMQ cree que no ha terminado de procesar. En este momento, RabbitMQ asignará este consumo a otros consumidores.

Motivo, la noticia no se perderá.

6. Cómo asegurar la secuencia de mensajes

Primero mire la escena donde el pedido estará desordenado: RabbitMQ: una cola, múltiples consumidores, que no está obviamente desordenado;

Solución de datos internos de Ali:

7. ¿Cómo resolver el problema del retraso y la caducidad de la cola de mensajes? La cola de mensajes está llena de

¿Qué debería hacer después? Hay millones de mensajes que llevan horas atrasados, ¿cómo solucionarlo?

Método de procesamiento de la acumulación de mensajes: Expansión temporal de emergencia:

Primero solucione el problema del consumidor para garantizar que se restablezca su velocidad de consumo y luego detenga los cnoconsumidores existentes. crear uno nuevo

El tema y la partición son 10 veces el número original, y se establece temporalmente el número de colas que son 10 veces el número original. Luego escribe una distribución temporal

El programa consumidor de datos, este programa se implementa para consumir la acumulación de datos y no realiza un procesamiento posterior al consumo que requiere mucho tiempo, de manera directa y uniforme.

Polling escribe 10 veces el número de colas establecidas temporalmente. Luego, solicite temporalmente 10 veces la cantidad de máquinas para implementar consumidores, cada una

批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资

源扩大 10 倍,以正常的 10 倍速度来消费数据。 等快速消费完积压数据之后,得恢复原先部署的

架构,重新用原先的 consumer 机器来消费消息。 MQ中消息失效:假设你用的是 RabbitMQ,

RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被

RabbitMQ 给清理掉,这个数据就没了。那这就是第二个坑了。这就不是说数据会大量积压在 mq

里,而是大量的数据会直接搞丢。我们可以采取一个方案,就是批量重导,这个我们之前线上也有

类似的场景干过。就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,比

如大家一起喝咖啡熬夜到晚上12点以后,用户都睡觉了。这个时候我们就开始写程序,将丢失的那

批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回

阿里内部资料来。也只能是这样了。假设 1 万个订单积压在 mq 里面,没有处理,其中 1000 个订单都丢了,你

只能手动写程序把那 1000 个订单给查出来,手动发到 mq 里去再补一次。

mq消息队列块满了:如果消息积压在 mq 里,你很长时间都没有处理掉,此时导致 mq 都快写满

了,咋办?这个还有别的办法吗?没有,谁让你第一个方案执行的太慢了,你临时写程序,接入数

据来消费,消费一个丢弃一个,都不要了,快速消费掉所有的消息。然后走第二个方案,到了晚上

再补数据吧。

8、让你来设计一个消息队列,你会怎么设计

比如说这个消息队列系统,我们从以下几个角度来考虑一下:

首先这个 mq 得支持可伸缩性吧,就是需要的时候快速扩容,就可以增加吞吐量和容量,那怎么

搞?设计个分布式的系统呗,参照一下 kafka 的设计理念,broker -> topic -> partition,每个

La partición pone una máquina y almacena parte de los datos. Si los recursos no son suficientes ahora, simple, agregue una partición al tema,

Luego, realice la migración de datos y agregue máquinas, ¿puede almacenar más datos y proporcionar un mayor rendimiento?

En segundo lugar, debe considerar si los datos de este mq deben aterrizarse en el disco, ¿verdad? Eso debe ser necesario, y el disco se puede usar para garantizar que la cantidad de procesos no se cuelgue.

La evidencia se pierde. ¿Cómo se cayó cuando se soltó el disco? Escritura secuencial, de modo que no haya una sobrecarga de direccionamiento para la lectura y escritura aleatoria del disco y la lectura secuencial del disco.

El rendimiento de la escritura es muy alto, que es la idea de Kafka.

En segundo lugar, ¿consideras la disponibilidad de tu mq? Para ello, consulte el kafka de alto nivel explicado en el enlace anterior de disponibilidad.

salvaguardias disponibles. Múltiples copias -> líder y seguidor -> el corredor cuelga y reelige al líder para servir al mundo exterior.

¿Puede admitir pérdida de datos 0? Sí, consulte la solución de pérdida de datos cero de Kafka que mencionamos anteriormente.

Estructura de datos y algoritmo

en otros dos folletos.

artículos de Linux

1. ¿ Qué símbolo se usa para representar el camino absoluto? ¿Cuál es el directorio actual y el directorio superior?

¿Cuál es el directorio principal ? ¿Qué comando se usa para cambiar de directorio?

Ruta absoluta:

Como /etc/init.d

Directorio actual y directorio principal: ./ ../

Directorio de inicio: ~/

Cambiar directorio: cd

Ali información interna 2. ¿Cómo verificar el proceso actual? ¿Cómo realizar la salida? ¿Cómo verificar la ruta actual?

Ver el proceso actual: ps

ps -l enumera la información del proceso relacionada con este inicio de sesión; ps -aux consulta la información del proceso en la memoria; ps -aux | grep * consulta

* Información detallada del proceso; top para ver la información dinámica del proceso en memoria; kill -9 pid para matar el proceso.

Salida de ejecución: salir

Ver la ruta actual: pwd

3. Verifique los comandos en el archivo

vi nombre de archivo # Vista de modo de edición, se puede modificar

cat filename#mostrar todo el contenido del archivo

más nombre de archivo#Mostrar el contenido del archivo en las páginas

menos nombre de archivo # Similar a más, es mejor pasar la página hacia adelante

nombre del archivo de cola #Solo ver la cola, también puede especificar el número de líneas

encabezado nombre del archivo #Solo ver el encabezado, también puede especificar el número de líneas

4. Enumere varios comandos de Linux de uso común

Muestra la lista de archivos: ls [parámetro -a -l]

Crear y eliminar directorios: mkdir rmdir

Se utiliza para mostrar las últimas líneas del archivo: tail, por ejemplo: tail -n 1000: muestra las últimas 1000 líneas

Embalaje: alquitrán -xvf

Empaquetar y comprimir: tar -zcvf

Buscar cadenas: grep

Mostrar el directorio actual: pwd Crear un archivo vacío: toque

Editor: vimvi

5. ¿Cómo suele consultar los registros?

Hay muchos comandos para ver registros en Linux: tail, cat, tac, head, echo, etc. Este artículo solo presenta algunos métodos de uso común.

1 cola

La forma más común de ver

Formato de comando : cola [ parámetros requeridos ] [ parámetros de opción ] [ archivo ]

Todos los datos internos -f leer en un bucle -q no mostrar información de procesamiento -v mostrar información de procesamiento detallada -c<número> mostrar el número de bytes -n<número de fila> mostrar el número de filas -

q, --quiet, --silent Nunca mostrar el encabezado -s del nombre de archivo dado, --sleep-interval=S se usa con -f para indicar que el intervalo entre cada repetición

Duerme cada S segundos

Por ejemplo:

tail -n 10 test.log Consulta el registro de las últimas 10 líneas al final del registro;

tail -n +10 test.log consulta todos los registros después de 10 líneas;

tail -fn 10 test.log Bucle para ver las últimas 1000 líneas de registros en tiempo real (el más utilizado)

Generalmente, también se usa junto con la búsqueda grep, por ejemplo:

tail -fn 1000 test.log | grep 'palabra clave'

Si la cantidad de datos en una consulta única es demasiado grande, puede pasar la página para verlos, por ejemplo:

tail -n 4700 aa.log |more -1000 se puede mostrar en varias pantallas (ctrl + f o la barra espaciadora puede ser una tecla de acceso directo)

2 cabeza

Es lo contrario de la cola, la cabeza es para ver cuántas líneas de troncos antes.

head -n 10 test.log consulta las primeras 10 líneas de registros en el archivo de registro;

head -n -10 test.log Consulta el archivo de registro para todos los registros excepto las últimas 10 líneas;

Otros parámetros de la cabeza se refieren a la cola.

3 , gato

cat se muestra continuamente en la pantalla desde la primera línea hasta la última línea

Para mostrar todo el archivo a la vez:

$ gato nombre de archivo

Crear un archivo desde el teclado:

$gato > nombre de archivo

Combinar varios archivos en uno:

$cat archivo1 archivo2 > archivo solo puede crear archivos nuevos, no editar archivos existentes

Agregue el contenido de un archivo de registro a otro:

Datos internos de Alibaba $cat -n archivo de texto1 > archivo de texto2

Borrar un archivo de registro:

$gato: >archivo de texto2

Nota: > significa crear, >> significa agregar. No te confundas.

Otros parámetros del gato se refieren a la cola.

4 , más

El comando more es un filtro de texto basado en el editor vi, que muestra el contenido del archivo de texto página por página en pantalla completa y admite vi

La acción de segmentación por palabra clave para . Hay varias teclas de acceso directo integradas en la lista más, las más utilizadas son H (obtener información de ayuda), Enter (hacia abajo

desplazarse una línea), espacio (desplazarse hacia abajo una pantalla), Q (comando de salida). El comando more lee el archivo de adelante hacia atrás, por lo que al inicio

carga todo el archivo.

该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示

的该文件的百分比:–More–(XX%)

more的语法:more 文件名

Enter 向下n行,需要定义,默认为1行

Ctrl f 向下滚动一屏

空格键 向下滚动一屏

Ctrl b 返回上一屏

= 输出当前行的行号

:f 输出文件名和当前行的行号

v 调用vi编辑器

!命令 调用Shell,并执行命令

q退出more

5sed

这个命令可以查找日志文件特定的一段 , 根据时间的一个范围查询,可以按照行号和时间范围查询

按照行号

sed -n '5,10p' filename 这样你就可以只查看文件的第5行到第10行。

按照时间段

sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log

6less

阿里内部资料less命令在查询日志时,一般流程是这样的

less log.log

shift + G 命令到文件尾部 然后输入 ?加上你要搜索的关键字例如 ?1213

按 n 向上查找关键字

shift+n 反向查找关键字

less与more类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而且 less 在查

看之前不会加载整个文件。

less log2013.log 查看文件

ps -ef | less ps查看进程信息并通过less分页显示

history | less 查看命令历史使用记录并通过less分页显示

less log2013.log log2014.log 浏览多个文件

常用命令参数:

less与more类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而且 less 在查

看之前不会加载整个文件。

less log2013.log 查看文件

ps -ef | less ps查看进程信息并通过less分页显示

history | less 查看命令历史使用记录并通过less分页显示

less log2013.log log2014.log 浏览多个文件

常用命令参数:

-b <缓冲区大小> 设置缓冲区的大小

-g 只标志最后搜索的关键词

-i 忽略搜索时的大小写

-m 显示类似more命令的百分比

-N 显示每行的行号

-o <nombre de archivo> Guarda la salida de less en el archivo especificado

-Q No utilice sonido de advertencia

-s muestra líneas en blanco consecutivas en una línea

/cadena: función para buscar "cadena" hacia abajo

?cadena: función para buscar "cadena" hacia arriba

n: repite la búsqueda anterior (relacionada con / o ?)

N: Repita la búsqueda anterior en sentido inverso (relativo a / o ?)

b retroceder una página

h Mostrar la interfaz de ayuda

q sale del comando menos

Generalmente, reviso el registro para cooperar con otros comandos de la aplicación

Historial de datos internos de Ali // todos los registros históricos

history | grep XXX // registros que contienen ciertas instrucciones en el historial

historia | más // registros de vista de página

history -c // Borrar todo el historial

!!Repite el ultimo comando

Después de consultar los registros, seleccione: !323

Artículos del cuidador del zoológico

1. Dime, ¿ qué es Zookeeper ?

Traducción literal: La traducción literal del nombre es el animal administrador. El animal hace referencia a software distribuido como Hadoop. Se reflejan los tres caracteres del administrador.

Las características de ZooKeeper: mantenimiento, coordinación, gestión, seguimiento.

Breve descripción: Algún software que desee convertir en un clúster o distribuido, puede usar ZooKeeper para ayudarlo a realizarlo.

Características:

Consistencia eventual: Los datos vistos por el cliente son eventualmente consistentes.

Fiabilidad: El servidor guarda el mensaje, por lo que siempre existe.

En tiempo real: ZooKeeper no puede garantizar que dos clientes obtengan los datos recién actualizados al mismo tiempo.

Independencia (la espera es irrelevante): Los diferentes clientes no se afectan directamente entre sí.

Atomicidad: la actualización tiene éxito o falla, no hay un tercer estado.

Nota : cuando responda las preguntas de la entrevista, no responda en una sola oración. Puede describir su comprensión de los conceptos, características y otros aspectos.

A continuación, incluso si cree que no está completamente en lo cierto, puede hablar sobre ello. Al entrevistador no le gusta interrumpirlo. Su propósito es dejar que el entrevistador

El oficial piensa que eres bueno para comunicarte. Por supuesto, si no lo sabe, no finja saberlo y diga demasiadas ideas poco profesionales.

2. ¿ Cuáles son los escenarios de aplicación de ZooKeeper ?

Publicación de datos y suscripción.

Publicar y suscribir es la llamada gestión de configuración, como su nombre lo indica, es publicar datos en los nodos de ZooKeeper para que los suscriptores los obtengan dinámicamente.

Datos para realizar una gestión centralizada y una actualización dinámica de la información de configuración. Por ejemplo, la información de configuración global, las listas de direcciones, etc. son muy adecuadas para usar

usar.

Un escenario común para la publicación/suscripción de datos dentro de Ali es el centro de configuración, donde el editor publica datos en uno o una serie de ZooKeeper

En el nodo, los suscriptores pueden suscribirse a los datos para lograr el propósito de obtener datos de forma dinámica.

La información de configuración generalmente tiene varias características:

1. KV con pequeña cantidad de datos

2. El contenido de los datos cambiará dinámicamente durante el tiempo de ejecución

3. Uso compartido de máquinas en clúster, configuración coherente

ZooKeeper utiliza una combinación de empujar y tirar.

1. Push: el servidor enviará la notificación del evento de Wathcer al cliente registrado con el nodo de monitoreo

2. Extracción: después de que el cliente reciba la notificación, irá activamente al servidor para extraer los datos más recientes.

servicio de nombres

Como servicio de nombres distribuido, un servicio de nombres se refiere a obtener la dirección de un recurso o servicio a través de un nombre específico, usando ZooKeeper.

Cree una ruta global, que se puede usar como un nombre, apuntando al clúster en el clúster, la dirección del servicio proporcionado o

o un objeto remoto y así sucesivamente.

El diagrama de estructura de nombres del servicio de nombres unificado es el siguiente:

Toda la información interna 1. En un entorno distribuido, a menudo es necesario nombrar aplicaciones/servicios de manera uniforme para facilitar la identificación de diferentes servicios.

Similar a la correspondencia entre los nombres de dominio y las IP, las IP no son fáciles de recordar, pero los nombres de dominio son fáciles de recordar.

Obtenga la dirección, el proveedor y otra información de recursos o servicios por nombre.

2. Organice los nombres de servicios/aplicaciones en una estructura jerárquica.

El nombre del servicio y la información de la dirección se pueden escribir en ZooKeeper y el cliente puede obtener la lista de servicios disponibles a través de ZooKeeper.

gestión de la configuración

El programa se distribuye y se implementa en diferentes máquinas, y la información de configuración del programa se coloca en el znode de ZooKeeper.Cuando se produce una configuración

Al cambiar, es decir, cuando cambia el znode, puede cambiar el contenido de un nodo de directorio en zk y usar watch para notificar a cada uno.

cliente para cambiar la configuración.

El diagrama de la estructura de gestión de la configuración de ZooKeeper es el siguiente:

1. En un entorno distribuido, la administración y sincronización de archivos de configuración es un problema común.

阿里内部资料一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群。

对配置文件修改后,希望能够快速同步到各个节点上。

2、配置管理可交由ZooKeeper实现。

可将配置信息写入ZooKeeper上的一个Znode。

各个节点监听这个Znode。

一旦Znode中的数据被修改,ZooKeeper将通知各个节点。

集群管理

所谓集群管理就是:是否有机器退出和加入、选举master。

集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集,后者则是对

集群进行操作与控制。开发和运维中,面对集群,经常有如下需求:

1. 希望知道集群中究竟有多少机器在工作

2. 对集群中的每台机器的运行时状态进行数据收集

3. 对集群中机器进行上下线的操作

集群管理结构图如下所示:

1、分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。

2、可交由ZooKeeper实现。

可将节点信息写入ZooKeeper上的一个Znode。

监听这个Znode可获取它的实时状态变化。

3、典型应用

阿里内部资料Hbase中Master状态监控与选举。

利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有

多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功

分布式通知与协调

1、分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。

a)NameNode需知道各个Datanode的状态。

b)JobTracker需知道各个TaskTracker的状态。

2、心跳检测机制可通过ZooKeeper来实现。

3、信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统。

分布式锁

处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。

分布式锁具有以下特性:写锁、读锁、时序锁。

写锁:在zk上创建的一个临时的无编号的节点。由于是无序编号,在创建时不会自动编号,导致只

能客户端有一个客户端得到锁,然后进行写入。

读锁:在zk上创建一个临时的有编号的节点,这样即使下次有客户端加入是同时创建相同的节点

时,他也会自动编号,也可以获得锁对象,然后对其进行读取。

时序锁:在zk上创建的一个临时的有编号的节点根据编号的大小控制锁。

分布式队列

分布式队列分为两种:

1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队

列。

a)一个job由多个task组成,只有所有任务完成后,job才运行完成。

b)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦

临时节点数目达到task总数,则表明job运行完成。

2、队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。

3、说说Zookeeper的工作原理?

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做

Zab协议。

阿里内部资料Zab协议有两种模式,它们 分别是恢复模式(选主)和广播模式(同步)。

Zab协议 的全称是 Zookeeper Atomic Broadcast** (Zookeeper原子广播)。Zookeeper 是通过

Zab 协议来保证分布式事务的最终一致性。Zab协议要求每个 Leader 都要经历三个阶段:发现,同

步,广播。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server

完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的

系统状态。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议

(proposal)都在被提出的时候加 上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用

来标识leader关系是否改变,每次一个leader被选出来,它都会有一 个新的epoch,标识当前属于

那个leader的统治时期。低32位用于递增计数。

epoch:可以理解为皇帝的年号,当新的皇帝leader产生后,将有一个新的epoch年号。

每个Server在工作过程中有三种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻。

LEADING:当前Server即为选举出来的leader。

FOLLOWING:leader已经选举出来,当前Server与之同步。

4,请描述一下 Zookeeper 的通知机制是什么?

Zookeeper 允许客户端向服务端的某个 znode 注册一个 Watcher 监听,当服务端的一些指定事件

触发了这个 Watcher ,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客

户端根据 Watcher 通知状态和事件类型做出业务上的改变。

大致分为三个步骤:

客户端注册 Watcher

1、调用 getData、getChildren、exist 三个 API ,传入Watcher 对象。 2、标记请求

request ,封装 Watcher 到 WatchRegistration 。 3、封装成 Packet 对象,发服务端发送

request 。 4、收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理。 5、

请求返回,完成注册。

服务端处理 Watcher

1、服务端接收 Watcher 并存储。 2、Watcher 触发 3、调用 process 方法来触发 Watcher 。

客户端回调 Watcher

1,客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调Watcher 。 2,客户端

的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了。

El cliente de datos interno de Ali creará un evento de vigilancia para un determinado znode. Cuando el znode cambie, estos clientes recibirán

Notificación a zk, y luego el cliente puede realizar cambios comerciales en función de los cambios de znode.

5. ¿ La notificación de vigilancia de Zookeeper al nodo es permanente?

No, único . Ya sea un servidor o un cliente, una vez que se activa un Watcher, Zookeeper lo eliminará de

almacenamiento correspondiente. Este diseño reduce efectivamente la presión sobre el servidor; de lo contrario, para los nodos que se actualizan con mucha frecuencia, el servicio

El final enviará continuamente notificaciones de eventos al cliente, lo que ejerce mucha presión tanto en la red como en el servidor.

6. ¿ Cuáles son los roles en el clúster de Zookeeper ?

En un clúster, se requieren al menos 3. O garantizar 2N + 1 unidades, que es un número impar. ¿Por qué se garantizan los números impares? principalmente para las elecciones

algoritmo.

7. ¿ Cuáles son los estados de trabajo de los servidores en el clúster de Zookeeper ?

MIRANDO

Busque el estado del líder, cuando el servidor esté en este estado, pensará que no hay un líder en el clúster actual, por lo que debe ingresar

Estado de elección de líder

SIGUIENTE

Estado de seguidor; indica que el rol actual del servidor es Seguidor

PRINCIPAL

Estado de líder; indica que el rol actual del servidor es Líder

OBSERVANDO

Estado de observador; indica que el rol actual del servidor es observador

阿里内部资料8Zookeeper 集群中是怎样选举leader的?

当Leader崩溃了,或者失去了大多数的Follower,这时候 Zookeeper 就进入恢复模式,恢复模式需

要重新选举出一个新的Leader,让所有的Server都恢复到一个状态LOOKING

Zookeeper 有两种选举算法:基于 basic paxos 实现和基于 fast paxos 实现。默认为 fast paxos

由于篇幅问题,这里推荐:选举流程

9Zookeeper 是如何保证事务的顺序一致性的呢?

Zookeeper 采用了递增的事务 id 来识别,所有的 proposal (提议)都在被提出的时候加上了

zxid 。 zxid 实际上是一个 64 位数字。

高 32 位是 epoch 用来标识 Leader 是否发生了改变,如果有新的 Leader 产生出来, epoch 会自

增。 低 32 位用来递增计数。 当新产生的 proposal 的时候,会依据数据库的两阶段过程,首先会

向其他的 Server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始

执行。

10ZooKeeper 集群中个服务器之间是怎样通信的?

Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接,同时为每个

Follower/Observer 都创建一个叫做 LearnerHandler 的实体。

LearnerHandler es el principal responsable de la comunicación en red entre el líder y el seguidor/observador, incluida la sincronización de datos,

Reenvío de solicitudes y votación de propuestas, etc.

El servidor líder guarda todos los manejadores de aprendizaje de seguidores/observadores.

11. ¿ Cómo se implementa el bloqueo distribuido de ZooKeeper?

Si hay N clientes, como el cliente 1 y el cliente 2, que compiten por un bloqueo distribuido de Zookeeper. Aproximadamente de la siguiente manera:

1. Todos aparecen y crean directamente nodos ordenados temporales uno tras otro bajo un nodo de bloqueo

2. Si no es el primer nodo, agregue un oyente a su nodo anterior

3. Siempre que el nodo anterior libere el bloqueo, se colocará en cola al frente, lo que equivale a un mecanismo de cola.

Los datos internos de Ali y otro propósito de usar nodos secuenciales temporales es que si un cliente se bloquea accidentalmente después de crear un nodo secuencial temporal

No importa si el cliente está inactivo, Zookeeper eliminará automáticamente el nodo de secuencia temporal correspondiente cuando detecte que el cliente está inactivo, lo que equivale a automáticamente

Libere el bloqueo o cancele automáticamente su propia cola.

Los bloqueos locales se pueden implementar con JDK, pero los bloqueos distribuidos deben usar componentes distribuidos. Como ZooKeeper, Redis.

Hay una gran parte del código en línea, y las entrevistas generalmente no están escritas. Permítanme hablar sobre algunos puntos clave.

Algunos puntos a tener en cuenta son los siguientes.

Problema de interbloqueo: la cerradura no puede convertirse en interbloqueo debido a un accidente, por lo que se utiliza el nodo temporal de ZK.Si la conexión del cliente falla, la cerradura se bloqueará.

liberado automáticamente.

Problema de espera de bloqueo: los bloqueos tienen requisitos de cola, por lo que se requieren los nodos secuenciales de ZK.

Problema de administración de bloqueo: cuando un usuario libera el bloqueo, se debe notificar a otros usuarios, por lo que se requiere monitoreo.

Efecto de rebaño del monitoreo: por ejemplo, si hay 1000 competidores de bloqueo y se libera el bloqueo, se notificará a 1000 competidores y luego se juzgará

Al final, el que tenía el número de serie más pequeño consiguió el candado. Los otros 999 competidores se vuelven a registrar para escuchar. Este es el efecto rebaño, señala

Si algo sucede, todo el rebaño se alarmará. Cada competidor solo debe monitorear el nodo frente a él. Por ejemplo, si el número 2 abre la cerradura, entonces

Entonces solo el 3 fue notificado.

12、了解Zookeeper的系统架构吗?

ZooKeeper 的架构图中我们需要了解和掌握的主要有:

(1)ZooKeeper分为服务器端(Server)

和客户端(Client),客户端可以连接到整个

ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端

连接)。

(2)客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及

发送心跳。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 ZooKeeper服务器。客户端

第一次连接到 ZooKeeper服务时,接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会

话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

(3)上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集

群(或者是由伪集群组成);

(4)组成ZooKeeper服务的服务器必须彼此了解。它们维护一个内存中的状态图像,以及持久存

储中的事务日志和快照,

只要大多数服务器可用,ZooKeeper服务就可用;

阿里内部资料(5)ZooKeeper 启动时,将从实例中选举一个 leader,Leader 负责处理数据更新等操作,一个

更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。每个Server 在内存中存储了

一份数据。

(6)Zookeeper是可以集群复制的,集群间通过Zab协议(Zookeeper Atomic Broadcast)来保

持数据的一致性;

(7)Zab协议包含两个阶段:leader election阶段和Atomic Brodcast阶段。

a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给

líder, y dígale todas las actualizaciones al seguidor a través de brodcast.

b) Cuando el líder se cae o el líder pierde la mayoría de los seguidores, se necesita reelegir un nuevo líder para que todos

Algunos servidores se restauran a un estado correcto.

c) Cuando el líder es elegido y la mayoría de los servidores completan la sincronización de estado con el líder, la elección del líder

El proceso ha terminado y entrará en el proceso de Atomic brodcast.

d) Atomic Brodcast sincroniza la información entre el líder y el seguidor para garantizar que el líder y el seguidor tengan el mismo sistema

estado.

13. ¿ Por qué Zookeeper está diseñado así?

El propósito del diseño de ZooKeeper es proporcionar servicios de coordinación distribuida secuencialmente consistentes, de alto rendimiento y alta disponibilidad, y garantizar la consistencia final de los datos.

sexo.

Alto rendimiento (modelo de datos simple)

1. Organizar los nodos de datos en una estructura de árbol;

2. Todos los nodos de datos se almacenan en la memoria;

3. Seguidor y observador procesan directamente solicitudes no transaccionales;

Alta disponibilidad (construir clústeres)

1. Si más de la mitad de las máquinas sobreviven, el servicio puede funcionar normalmente

2. Elección automática de líder

Consistencia secuencial (orden de las operaciones de transacción)

1. Cada solicitud de transacción se enviará al líder para su procesamiento

2. A cada transacción se le asignará una identificación incremental única a nivel mundial (zxid, 64 bits: época + identificación de incremento automático)

eventual consistencia

1. Asegurar la confiabilidad de la presentación de transacciones al proponer la votación

2. El método de votación propuesto solo puede garantizar que más de la mitad de los nodos puedan ver los datos más recientes después de que el cliente reciba el envío exitoso de la transacción.

14. ¿Sabes qué roles hay en Zookeeper ?

Modelo de sistema de datos internos de Alibaba:

líder

El servidor Leader proporciona servicios de lectura y escritura para los clientes. Responsable de la iniciación y resolución de votaciones, así como de la actualización del estado del sistema.

aprendiz

跟随者( follower ) Follower服务器为客户端提供读服务,参与Leader选举过程,参与写操

作“过半写成功”策略。

观察者( observer ) Observer服务器为客户端提供读服务,不参与Leader选举过程,不参与

写操作“过半写成功”策略。用于在不影响写性能的前提下提升集群的读性能。

客户端(client) :服务请求发起方。

15、你熟悉Zookeeper节点ZNode和相关属性吗?

节点有哪些类型?

Znode两种类型 :

持久的(persistent):客户端和服务器端断开连接后,创建的节点不删除(默认)。

短暂的(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。

Znode有四种形式 :

持久化目录节点(PERSISTENT):客户端与Zookeeper断开连接后,该节点依旧存在持久化顺

序编号目录节点(PERSISTENT_SEQUENTIAL)

客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编

号:临时目录节点(EPHEMERAL)

客户端与Zookeeper断开连接后,该节点被删除:临时顺序编号目录节点

(EPHEMERAL_SEQUENTIAL)

客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

「注意」:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计

数器,由父节点维护。

阿里内部资料节点属性有哪些

一个znode节点不仅可以存储数据,还有一些其他特别的属性。接下来我们创建一个/test节点分析

一下它各个属性的含义。

[zk: localhost:2181(CONNECTED) 6] get /test

456

cZxid = 0x59ac //

ctime = lun 30 de marzo 15:20:08 CST 2020

mZxid = 0x59ad

mtime = lun 30 de marzo 15:22:25 CST 2020

pZxid = 0x59ac

cversión = 0

versión de datos = 2

aclVersión = 0

propietario efímero = 0x0

longitud de datos = 3

numChildren = 0

descripción de propiedad

16. Describa brevemente el proceso de selección de maestros de Zookeeper

El núcleo de los datos internos de Ali, Zookeeper, es la transmisión atómica, que garantiza la sincronización entre servidores. El protocolo que implementa este mecanismo se llama

Protocolo Zab. El protocolo Zab tiene dos modos, que son el modo de recuperación (elección maestra) y el modo de transmisión (sincronización). cuando comienza el servicio o

O después de que el líder falla, Zab ingresa al modo de recuperación, cuando se elige al líder, y la mayoría de los Servidores completan el

Después de sincronizar el estado del líder, finaliza el modo de recuperación. La sincronización de estado garantiza que el líder y el servidor tengan el mismo estado del sistema

estado. La elección del líder es la clave para garantizar la consistencia de los datos distribuidos.

Hay dos escenarios principales para las elecciones: inicialización y líder no disponible.

Cuando se produzca una de las dos situaciones siguientes en un servidor del clúster zk, comenzará la elección del líder.

(1) El servidor se inicializa y se inicia.

(2) La conexión con el líder no se puede mantener durante la ejecución del servidor.

Cuando una máquina ingresa al proceso de elección de líder, el clúster actual también puede estar en los siguientes dos estados.

(1) Ya hay un líder en el clúster.

(2) De hecho, no hay líder en el grupo.

En primer lugar, en el primer caso, por lo general cierta máquina en el clúster se inicia relativamente tarde, antes de que se inicie, el clúster ha estado funcionando normalmente, es decir, ha

Ya hay un servidor líder. Cuando la máquina intente elegir un líder, se le informará la información del líder del servidor actual, que

Solo es necesario establecer una conexión con la máquina líder y realizar la sincronización de estado.

El punto clave es que el líder no está disponible y el sistema de selección de líderes en este momento.

La información de votación contiene dos datos básicos.

sid :即server id,用来标识该机器在集群中的机器序号。

zxid :即zookeeper事务id号。

ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id,,该id称为zxid.,由于zxid的递

增性质, 如果zxid1小于zxid2,,那么zxid1肯定先于zxid2发生。创建任意节点,或者更新任意节点的

数据,

或者删除任意节点,都会导致Zookeeper状态发生改变,从而导致zxid的值增加。

以(sid,zxid)的形式来标识一次投票信息。

例如:如果当前服务器要推举sid为1,zxid为8的服务器成为leader,那么投票信息可以表示为

(1,8)

集群中的每台机器发出自己的投票后,也会接受来自集群中其他机器的投票。每台机器都会根据一

定的规则,来处理收到的其他机器的投票,以此来决定是否需要变更自己的投票。

规则如下 :

(1)初始阶段,都会给自己投票。

(2)当接收到来自其他服务器的投票时,都需要将别人的投票和自己的投票进行pk,规则如下:

阿里内部资料节点

sid

server1

1

server2

2

server3

3

优先检查zxid。zxid比较大的服务器优先作为leader。如果zxid相同的话,就比较sid,sid比较大的

服务器作为leader。

所有服务启动时候的选举流程

三台服务器 server1、server2、server3:

1. server1 启动,一台机器不会选举。

2. server2 启动,server1 和 server2 的状态改为 looking,广播投票

3. server3 启动,状态改为 looking,加入广播投票。

4. 初识状态,互不认识,大家都认为自己是王者,投票也投自己为 Leader。

5. 投票信息说明,票信息本来为五元组,这里为了逻辑清晰,简化下表达。

Por primera vez zxid = 0, y sid es el nombre de cada nodo, este sid se configura en zoo.cfg y no se repetirá.

1. Zxid inicial = 0, votos del servidor 1 (1, 0), votos del servidor 2 (2, 0), votos del servidor 3 (3, 0)

2. Cuando el servidor 1 recibe el voto (2, 0), primero verificará la legitimidad del voto y luego pk su propio voto. La lógica de pk es

Primero compare zxid, server1 (zxid) = server2 (zxid) = 0, zxid es igual y luego compare sid, server1 (sid) <

server2(sid), pk El resultado es que el voto de server2 gana. server1 actualiza su voto a (2, 0), server1

Vuelva a votar.

3. TODO Si es 2 o 3 al final aquí debe determinarse a través de experimentos.

4. Cuando el servidor 2 recibe el voto del servidor 1, primero verificará la legitimidad del voto y luego pk, su propio voto gana y el servidor no necesita actualizarse.

Nuevo voto propio, después de pk, reenviar un voto.

5. Contar los votos.Después de pk, se contarán los votos.Si más de la mitad de los nodos emiten el mismo voto, se determina que el Líder ha sido elegido.

6. Una vez finalizada la elección, el estado del nodo seleccionado cambia de MIRANDO a LÍDER, y el estado de otros nodos que participan en la elección cambia de MIRANDO a LÍDER.

pasa a ser SIGUIENTE. Si hay un nodo Observador, si el Observador no participa en la elección, entonces su

El estado ha sido OBSERVANDO, sin cambios.

hablando en general

Comience a votar -> el estado del nodo se convierte en MIRANDO -> cada nodo se elige a sí mismo -> recibe votos para PK -> gana Big Sid -> actualizar

Boleta -> Votar de nuevo -> Contar los votos, el resultado de la elección con más de la mitad de los votos -> El estado del nodo se actualiza a su propio estado de función.

17. ¿Por qué el número de grupos de Zookeeper es generalmente impar?

阿里内部资料首先需要明确zookeeper选举的规则:leader选举,要求 可用节点数量 > 总节点数量/2 。

比如:标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效。同样,Zookeeper

选择领导者节点也是在超过一半节点同意时才有效。最后,Zookeeper是否正常是要根据是否超过

一半的节点正常才算正常。这是基于CAP的一致性原理。

zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用

的。

也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以

2个zookeeper的死亡容忍度为0;

同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度

为1;

同理:

2->0;两个zookeeper,最多0个zookeeper可以不可用。

3->1;三个zookeeper,最多1个zookeeper可以不可用。

4->1;四个zookeeper,最多1个zookeeper可以不可用。

5->2;五个zookeeper,最多2个zookeeper可以不可用。

6->2;两个zookeeper,最多0个zookeeper可以不可用。

....

会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不

必要的zookeeper呢。

zookeeper的选举策略也是需要半数以上的节点同意才能当选leader,如果是偶数节点可能导致票

数相同的情况。

18、知道Zookeeper监听器的原理吗?

1. 创建一个Main()线程。

2. 在Main()线程中创建两个线程,一个负责网络连接通信(connect),一个负责监听

(listener)。

阿里内部资料3. 通过connect线程将注册的监听事件发送给Zookeeper。

4. Agregue el evento de escucha registrado a la lista de oyentes registrados de Zookeeper.

5. Cuando Zookeeper detecta que hay cambios en los datos o en la ruta, envía este mensaje al subproceso de escucha.

6. El método process() se llama dentro del hilo Listener

19. Hable sobre el mecanismo de control de permisos de ACL en Zookeeper

UGO(Usuario/Grupo/Otros)

Actualmente se utiliza en el sistema de archivos Linux/Unix y también es el método de control de permisos más utilizado. es un derecho de sistema de archivos de grano grueso

modo de control limitado.

Lista de control de acceso ACL (Lista de control de acceso)

Incluyendo tres aspectos:

Modo de permiso (esquema)

(1) IP: control de permisos desde la granularidad de la dirección IP

(2) Compendio: el más utilizado, use el identificador de permiso similar a nombre de usuario: contraseña para configurar permisos, que es fácil de distinguir entre diferentes

Aplicaciones para el control de permisos

(3) Mundo: el método de control de permisos más abierto, que es un modo de resumen especial con solo una etiqueta de permiso

Saber "mundo:cualquiera"

(4) Súper: súper usuario

objeto autorizado

El objeto de autorización se refiere al usuario al que se le otorga la autorización o una entidad específica, como una dirección IP o una luz de máquina.

Permiso

(1) CREAR: Autoridad de creación de nodos de datos, que permite que los objetos autorizados creen nodos secundarios bajo este Znode

(2) ELIMINAR: permiso de eliminación de nodos secundarios, lo que permite que el objeto autorizado elimine los nodos secundarios del nodo de datos

(3) LECTURA: el permiso de lectura del nodo de datos, que permite que el objeto autorizado acceda al nodo de datos y lea su contenido de datos o la lista de nodos secundarios

esperar

(4) ESCRIBIR: autoridad de actualización del nodo de datos, lo que permite que el objeto autorizado actualice el nodo de datos

(5) ADMIN: autoridad de gestión del nodo de datos, que permite que los objetos autorizados realicen operaciones de configuración relacionadas con ACL en el nodo de datos

20. ¿ Cuáles son los modos de implementación de Zookeeper ?

Zookeeper tiene tres modos de implementación:

Información interna de Ali 1. Implementación independiente: se ejecuta en un clúster;

2. 集群部署:多台集群运行;

3. 伪集群部署:一台集群启动多个 Zookeeper 实例运行。

21Zookeeper集群支持动态添加机器吗?

其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:

全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。

逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常

用的方式。

3.5 版本开始支持动态扩容。

22、描述一下 ZAB 协议

ZAB 协议是 ZooKeeper 自己定义的协议,全名 ZooKeeper 原子广播协议。

ZAB 协议有两种模式:Leader 节点崩溃了如何恢复和消息如何广播到所有节点。

整个 ZooKeeper 集群没有 Leader 节点的时候,属于崩溃的情况。比如集群启动刚刚启动,这时节

点们互相不认识。比如运作 Leader 节点宕机了,又或者网络问题,其他节点 Ping 不通 Leader 节

点了。这时就需要 ZAB 中的节点崩溃协议,所有节点进入选举模式,选举出新的 Leader。整个选

举过程就是通过广播来实现的。选举成功后,一切都需要以 Leader 的数据为准,那么就需要进行

数据同步了。

23ZAB Paxos 算法的联系与区别?

相同点:

(1)两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行

(2)Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提案进行提交

(3)ZAB 协议中,每个 Proposal 中都包含一个 epoch 值来代表当前的 Leader周期,Paxos 中名

字为 Ballot

不同点:

ZAB 用来构建高可用的分布式数据主备系统(Zookeeper),Paxos 是用来构建分布式一致性状态

机系统。

24ZooKeeper 宕机如何处理?

ZooKeeper 本身也是集群,推荐配置奇数个服务器。因为宕机就需要选举,选举需要半数 +1 票才

能通过,为了避免打成平手。进来不用偶数个服务器。

阿里内部资料如果是 Follower 宕机了,没关系不影响任何使用。用户无感知。如果 Leader 宕机,集群就得停止

对外服务,开始选举,选举出一个 Leader 节点后,进行数据同步,保证所有节点数据和 Leader 统

一,然后开始对外提供服务。

为啥投票需要半数 +1,如果半数就可以的话,网络的问题可能导致集群选举出来两个 Leader,各

有一半的小弟支持,这样数据也就乱套了。

25、 描述一下 ZooKeeper session 管理的思想?

分桶策略:

简单地说,就是不同的会话过期可能都有时间间隔,比如 15 秒过期、15.1 秒过期、15.8 秒过期,

ZooKeeper 统一让这些 session 16 秒过期。这样非常方便管理,看下面的公式,过期时间总是

ExpirationInterval 的整数倍。

计算公式:

ExpirationTime = currentTime + sessionTimeout

ExpirationTime = (ExpirationTime / ExpirationInrerval + 1) * ExpirationInterval ,

见图片:

El tiempo de espera de sesión configurado predeterminado es 2 tickTime~20 tickTime.

26. ¿Cuál es la diferencia entre el balanceo de carga de ZooKeeper y el balanceo de carga de Nginx ?

Guardián del zoológico :

No existe un problema de un solo punto, y el mecanismo zab garantiza que un solo punto de falla pueda reelegir a un Líder

Solo responsable del registro y descubrimiento de servicios, no para el reenvío, reduciendo un intercambio de datos (comunicación directa entre el consumidor y el servidor)

Debe implementar el algoritmo de equilibrio de carga correspondiente usted mismo

Información interna de Ali Nginx :

Hay un problema de punto único, la carga de punto único es alta y el volumen de datos es grande, y KeepAlived necesita la asistencia para lograr una alta disponibilidad

Cada carga actúa como un rol de reenvío intermediario, que a su vez es un servidor proxy inverso

Algoritmo de equilibrio de carga incorporado

27. Hablar sobre la serialización de ZooKeeper

Publicación por entregas:

Los datos de la memoria deben serializarse al guardarlos en el disco duro.

Los datos de la memoria, transmitidos a otros nodos a través de la red, deben serializarse.

El protocolo de serialización utilizado por ZK es Jute, que proporciona la interfaz Record. La interfaz proporciona dos métodos:

serializar método de serialización

deserialize método de deserialización

El método que se va a serializar se puede almacenar en el objeto de flujo en estos dos métodos.

28. ¿ Qué es Zxid en Zookeeper y qué hace ?

Zxid, que es la identificación de la transacción, para garantizar la coherencia secuencial de la transacción, ZooKeeper utiliza la transacción incremental Zxid para identificar la transacción.

servicio. Zxid se agregará a la propuesta. Zxid es un número de 64 bits, y Epoch utiliza sus 32 bits superiores para identificar cambios de dinastía.

Por ejemplo, cada época electoral cambiará. Los 32 bits inferiores se utilizan para contar.

Época: Se puede entender como la edad o ciclo del cúmulo actual, cada Líder es como un emperador y tiene su propio número de año.

Por cada cambio de dinastía, después de que cambie el Líder, se agregará 1 a la era anterior. De esta manera, incluso si el antiguo Líder falla

Después de la recuperación, nadie más lo escucha, porque el Seguidor solo obedece las órdenes del Líder de la era actual. Bienvenido a prestar atención al público de WeChat

Número público: pila completa de tecnología back-end de Java

29. Explicar el mecanismo de persistencia de ZooKeeper

¿Qué es la persistencia?

Datos, almacenados en disco o en un archivo.

Después de que la máquina se reinicie, los datos no se perderán. El mapeo de memoria -> disco es algo similar a la serialización.

Persistencia de ZooKeeper :

Instantánea SnapShot, grabando la cantidad total de datos en la memoria

TxnLog Registro de transacciones incrementales, registrando cada registro de adición, eliminación y modificación (la verificación no es un registro de transacciones y no provocará cambios en los datos)

¿Por qué la persistencia es una molestia? ¿No hay una disponible?

La desventaja de la instantánea es que el archivo es demasiado grande y el archivo de la instantánea no tendrá los datos más recientes. La desventaja del registro de transacciones incremental es que tarda mucho tiempo en ejecutarse,

Demasiados registros, demasiado lento para cargar. Una combinación de los dos funciona mejor.

Modo de instantánea de datos internos de Alibaba :

Los datos almacenados en la memoria de ZooKeeper en la estructura de datos DataTree se almacenan periódicamente en el disco.

Dado que el archivo de instantánea es una copia de seguridad completa regular de los datos, los datos del archivo de instantánea no suelen ser los más recientes.

ver imagen:

30. ¿ Cuál es la tupla quíntuple de información de votación en la elección de Zookeeper ?

Líder: SID del Líder electo

Zxid: el ID de transacción del líder elegido

Sid: SID del servidor actual

choiceEpoch: la ronda actual de votaciones

peerEpoch: Época del servidor actual

Época > Zxid > Sid

Tanto Epoch como Zxid pueden ser iguales, pero Sid debe ser diferente, por lo que los dos votos definitivamente darán como resultado PK.

31. Cuéntame sobre el cerebro dividido en Zookeeper .

En pocas palabras, Split-Brain es, por ejemplo, cuando hay dos nodos en su clúster, ambos saben que en este

Se debe elegir un maestro en el grupo. Luego, cuando no haya problemas con la comunicación entre los dos, se llegará a un consenso.

conocimiento, seleccione uno de ellos como maestro. Pero si hay un problema con la comunicación entre ellos, ambos nodos sentirán que no hay

Hay un maestro, por lo que cada uno se elige a sí mismo como maestro, por lo que habrá dos maestros en el clúster.

La información interna de Ali tiene un tema muy importante para Zookeeper, es decir, qué tipo de situación se usa para juzgar la muerte de un nodo.

¿abajo? En un sistema distribuido, todos estos son juzgados por el monitor, pero también es difícil para el monitor juzgar el estado de otros nodos.

estado, la única forma confiable es el latido del corazón, Zookeeper también usa el latido del corazón para determinar si el cliente todavía está vivo.

Usar ZooKeeper para hacer Leader HA es básicamente de la misma manera: cada nodo intenta registrar un símbolo de líder temporal

Nodos, otros que no se han registrado con éxito se convierten en seguidores y monitorean los nodos temporales creados por el líder a través del mecanismo de vigilancia.

Zookeeper utiliza el mecanismo de latido interno para determinar el estado del líder. Una vez que el líder tiene un accidente, Zookeeper puede aprender y responder rápidamente.

Y notifique a otros seguidores, y otras flores responderán más tarde, completando así un cambio, este modo también es

Los modos más comunes se implementan básicamente de esta manera. Pero aquí hay un problema muy serio, si no te das cuenta te llevará a

En un corto período de tiempo, el sistema tiene un cerebro dividido, porque el tiempo de espera del latido del corazón puede ser causado por el líder colgando, pero también puede ser causado por el nodo del cuidador del zoológico.

Hay un problema con la red entre los nodos, lo que lleva a la falsa muerte del líder. El líder no está realmente muerto, pero la relación con ZooKeeper

Un problema con la red hace que Zookeeper piense que está inactivo y luego notifica a otros nodos para que cambien, de modo que uno de los seguidores

Se convirtió en líder, pero el líder original no ha muerto. En este momento, el cliente también recibe la noticia del cambio de líder, pero aún habrá

Algunos retrasos, el cuidador del zoológico necesita comunicarse y debe ser notificado uno por uno. En este momento, todo el sistema es muy caótico. Tal vez algunos clientes ya lo hayan hecho.

Después de recibir la notificación para conectarse con el nuevo líder, algunos clientes aún están conectados con el antiguo líder, si hay dos clientes al mismo tiempo

Es necesario actualizar los mismos datos del líder, y sucede que los dos clientes están conectados al líder nuevo y antiguo respectivamente en este momento, aparecerá

Problema muy serio.

Aquí un pequeño resumen:

Fingir muerte : el líder se considera muerto debido al tiempo de espera de los latidos del corazón (causado por razones de red), pero el líder todavía está vivo

con. Cerebro dividido : debido a la animación suspendida, se iniciará una nueva elección de líder para elegir un nuevo líder, pero la red de líderes anterior se vuelve a conectar.

Como resultado, hay dos líderes, algunos clientes se conectan con el antiguo líder y otros clientes se conectan con el nuevo líder.

32. ¿ Qué causa el cerebro dividido de Zookeeper ?

La razón principal es que el clúster de Zookeeper y el cliente de Zookeeper no pueden sincronizarse por completo al evaluar el tiempo de espera, es decir, pueden

Posteriormente, si el clúster se descubre antes que el cliente, se producirá la situación anterior. Al mismo tiempo, se notifica a cada cliente después del descubrimiento y el cambio

También hay una secuencia de velocidad. En general, la probabilidad de esta situación es muy pequeña y el nodo líder debe desconectarse de la red del clúster de Zookeeper, pero

No hay problema con la red entre otros roles de clúster, y se deben cumplir las condiciones anteriores, pero una vez que ocurra, causará graves consecuencias.

Como resultado, los datos son inconsistentes.

33. ¿Cómo resuelve Zookeeper el problema del cerebro dividido?

Para resolver el problema de Split-Brain, generalmente existen los siguientes métodos: Método de quórums (quórum): por ejemplo, 3 nodos

En el clúster, Quórums = 2, es decir, el clúster puede tolerar la falla de un nodo. En este momento, se puede elegir un líder y el clúster aún puede

disponible. Por ejemplo, para un clúster con 4 nodos, sus Quórums = 3, y los Quórums deben exceder 3, lo que equivale a que la tolerancia del clúster sigue siendo 1.

Si fallan 2 nodos, todo el clúster sigue siendo inválido. Este es el método predeterminado utilizado por el cuidador del zoológico para evitar el "cerebro dividido".

Modo de comunicaciones redundantes (comunicación redundante): se utilizan múltiples modos de comunicación en el clúster para evitar un modo de comunicación

Un error impide que los nodos del clúster se comuniquen.

Método de vallado (recurso compartido): por ejemplo, si puede ver el recurso compartido, significa que está en el clúster y puede obtener el bloqueo del recurso compartido.

Si el líder no puede ver los recursos compartidos, no está en el clúster.

La información interna de Ali es realmente muy simple para evitar la situación de "cerebro dividido" del cuidador del zoológico. Cuando se cambia el nodo seguidor, la sección líder anterior ya no se verifica.

Cambie inmediatamente después de que ocurra un problema, pero duerma durante un período de tiempo suficiente para asegurarse de que el antiguo líder haya sido informado del cambio y haya realizado los cambios relevantes.

El trabajo de limpieza de apagado y luego registrarse como maestro puede evitar este tipo de problema.Este tiempo de suspensión generalmente se define como el mismo que

El período de tiempo de espera definido por zookeeper es suficiente, pero el sistema puede no estar disponible durante este período, pero es inconsistente con respecto a los datos.

Merece la pena por las consecuencias.

1. ZooKeeper adopta Quórums de forma predeterminada para evitar el fenómeno de "cerebro dividido". Es decir, solo más de la mitad de los nodos del clúster votan

Para elegir un líder. De esta manera se puede asegurar la unicidad del líder, o se elige al único líder, o la elección falla

fracaso. El papel de los quórumes en zookeeper es el siguiente:

El número mínimo de nodos en el clúster se usa para elegir un líder para garantizar que el clúster esté disponible.

Informe a los clientes que la cantidad mínima de nodos en el clúster ha guardado los datos antes de que los datos se guarden de manera segura. Una vez que estos nodos mantienen

Habiendo guardado los datos, se le notificará al cliente que se ha guardado de forma segura y puede continuar con otras tareas. mientras que los nodos restantes en el clúster

Esos datos también se guardan al final.

假设某个leader假死,其余的followers选举出了一个新的leader。这时,旧的leader复活并且仍然

认为自己是leader,这个时候它向其他followers发出写请求也是会被拒绝的。因为每当新leader产

生时,会生成一个epoch标号(标识当前属于那个leader的统治时期),这个epoch是递增的,

followers如果确认了新的leader存在,知道其epoch,就会拒绝epoch小于现任leader epoch的所

有请求。那有没有follower不知道新的leader存在呢,有可能,但肯定不是大多数,否则新leader

无法产生。Zookeeper的写也遵循quorum机制,因此,得不到大多数支持的写是无效的,旧

leader即使各种认为自己是leader,依然没有什么作用。

zookeeper除了可以采用上面默认的Quorums方式来避免出现"脑裂",还可以可采用下面的预防措

施: 2、添加冗余的心跳线,例如双线条线,尽量减少“裂脑”发生机会。 3、启用磁盘锁。正在服务

一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个

不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服

务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于

是有人在HA中设计了"智能"锁。即正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才

启用磁盘锁。平时就不上锁了。 4、设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全

断开时,2个节点都各自ping一下 参考IP,不通则表明断点就出在本端,不仅"心跳"、还兼对外"服

务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够

Haga ping al final de la IP de referencia para iniciar el servicio. Es más seguro, la parte que no puede hacer ping a la IP de referencia simplemente se reinicia para liberar completamente

Aquellos recursos compartidos que aún pueden estar ocupados.

34. ¿Cuénteme acerca de las compensaciones realizadas en el problema del CAP de Zookeeper ?

Consistencia C : Zookeeper es un sistema de consistencia sólida. Para garantizar una disponibilidad sólida,

Los datos de "más de la mitad del éxito es el éxito" son los mismos que

El método paso a paso puede provocar incoherencias en los datos de algunos nodos. Entonces Zookeeper también proporciona la operación de sincronización () para hacer todos los nodos

Sincronización de datos, se trata de la elección de C y A para el usuario, porque el uso de sincronización () está destinado a prolongar el tiempo de sincronización, la disponibilidad

Habrá algunas pérdidas.

Disponibilidad de datos internos de Ali R : Los datos de Zookeeper se almacenan en la memoria, y cada nodo puede leer las solicitudes en consecuencia, con un buen rendimiento de respuesta.

Zookeeper garantiza que los datos estén siempre disponibles sin bloqueos. Y más de la mitad de los nodos tienen los datos más recientes.

Tolerancia de partición P : Demasiados nodos de seguidores aumentarán el retraso de la sincronización de datos (más de la mitad de los seguidores deben terminar de escribir y enviar

pagar). Al mismo tiempo, la velocidad de convergencia del proceso electoral será más lenta y la disponibilidad se verá reducida. Zookeeper alivia el problema mediante la introducción de nodos de observación

Para este problema, después de agregar nodos de observador, el clúster puede aceptar más nodos para solicitudes de clientes y los observadores no participan en la votación.

La disponibilidad y la escalabilidad se pueden mejorar, pero la sincronización de datos de múltiples nodos siempre es un problema, por lo que se reducirá la consistencia.

35. ¿Por qué el seguimiento del reloj es único?

Si el servidor cambia con frecuencia y hay muchos clientes de monitoreo, todos los clientes deben ser notificados de cada cambio, dando a la red y

Los servidores causan mucho estrés.

Generalmente, el cliente ejecuta getData(node ​​A, true).Si se cambia o elimina el nodo A, el cliente obtendrá su

ver el evento, pero después de que el nodo A haya cambiado nuevamente y el cliente no haya configurado el evento de vigilancia, ya no enviará al cliente

enviar.

En aplicaciones prácticas, en muchos casos, nuestro cliente no necesita saber cada cambio del servidor, solo necesito los últimos datos

Poder.

redis _

1 , por qué usar caché

El propósito de usar caché es mejorar el rendimiento de lectura y escritura. En escenarios comerciales reales, es más para mejorar el rendimiento de lectura y lograr un mejor rendimiento.

Puede traer una mayor concurrencia. El rendimiento de lectura y escritura de Redis es mucho mejor que el de Mysql, por lo que podemos almacenar en caché los datos calientes en Mysql

Guárdelo en Redis para mejorar el rendimiento de lectura y reducir la presión de lectura de Mysql.

Bienvenido a prestar atención a la cuenta pública de WeChat: pila completa de tecnología de back-end de Java

2. ¿Cuáles son los beneficios de usar Redis ?

Tiene los siguientes beneficios:

La velocidad de lectura es rápida, porque los datos se almacenan en la memoria, por lo que la adquisición de datos es rápida;

Admite una variedad de estructuras de datos, incluidas cadenas, listas, conjuntos, conjuntos ordenados, hashes, etc.;

Las transacciones son compatibles y las operaciones obedecen a la atomicidad, es decir, las operaciones sobre los datos se ejecutan o no son compatibles;

También tiene otras funciones ricas, como cola, replicación maestro-esclavo, clúster, persistencia de datos y otras funciones.

3 ,

¿ Qué es Redis ?

Ali información interna Redis es un sistema de almacenamiento basado en memoria de código abierto (con licencia BSD) que admite múltiples estructuras de datos.

middleware de almacenamiento y mensajería. Las estructuras de datos que admite son cadenas, hashes, listas, conjuntos

(conjuntos), conjuntos ordenados (conjuntos ordenados), etc., además de admitir mapas de bits, hiperloglogs y geoespaciales (

geoespacial) consulta de radio de índice y otras funciones.

Tiene replicación integrada (Replicación), secuencias de comandos LUA (secuencias de comandos Lua), evento controlado por LRU (desalojo de LRU), evento

Servicios (Transacciones) y diferentes niveles de funciones de persistencia de disco (persistencia), y a través de Redis Sentinel (Sentry) y

Clúster (Cluster) para garantizar una alta disponibilidad de la memoria caché (Alta disponibilidad).

4. ¿ Por qué usar Redis en lugar de Memcache ?

Lo que debe venir a la mente en este momento es hacer una diferencia entre Memcache y Redis.

Tanto Redis como Memcache almacenan datos en la memoria y ambos son bases de datos de memoria. Pero Memcache también se puede usar para almacenar en caché

Otras cosas, como fotos, videos, etc.

Memcache solo admite el tipo de datos de la estructura clave-valor, y Redis no solo admite datos de tipo clave-valor simples,

Al mismo tiempo, también proporciona almacenamiento de estructuras de datos como listas, conjuntos y hash.

Memoria virtual: Redis puede intercambiar algunos valores que no se han utilizado durante mucho tiempo en el disco cuando se agota la memoria física

Distribuido: configure el clúster de Memcache, use magent para hacer un maestro y varios esclavos; Redis puede hacer un maestro y varios esclavos. puede ser uno maestro

de

Seguridad de datos almacenados: después de que Memcache cuelga, los datos desaparecen; Redis se puede guardar en el disco con regularidad (persistencia)

El valor único máximo de Memcache es 1m y el valor único máximo de Redis es 512m.

Recuperación de desastres: después de que Memcache se cuelga, los datos no se pueden recuperar; después de que se pierden los datos de Redis, se pueden recuperar a través de aof

Redis admite de forma nativa el modo de clúster. En la versión Redis 3.0, la conveniencia oficial puede admitir el modo de clúster. Memcached no

Hay un modo de clúster nativo, que debe realizar el cliente y luego escribir datos en los fragmentos del clúster.

El modelo de E/S de red de Memcached es un modelo de red de multiplexación de E/S sin bloqueo y de subprocesos múltiples, y su prototipo es similar a nignx. mientras redis

Utilizando el modelo de multiplexación de E/S de subproceso único, encapsulé un marco de procesamiento de eventos AeEvent simple, la clase de implementación principal

epoll, kqueue y select están más cerca del modelo inicial de Apache.

5. ¿ Por qué el modelo de subproceso único de Redis es tan eficiente?

1. Implementación de lenguaje C, alta eficiencia

2. Operación de memoria pura

3. Basado en el mecanismo de modelo de multiplexación IO sin bloqueo

4. Si usa un solo hilo, puede evitar el problema frecuente de cambio de contexto de múltiples hilos

5. Estructura de datos enriquecida (el nombre completo adopta una estructura hash, la velocidad de lectura es muy rápida y se han realizado algunas optimizaciones en el almacenamiento de datos, como sub

solicitar mesa, saltar mesa, etc.)

6 , habla sobre el modelo de subprocesamiento de Redis

Esta pregunta de la información interna de Ali se debe a que Redis se menciona en la respuesta anterior a la pregunta basada en el modelo de multiplexación de E/S sin bloqueo. Si esta pregunta vuelve

Si no puedes responderla, significa que la respuesta anterior te está cavando un hueco, porque si no puedes responderla, la impresión que el entrevistador tiene de ti puede ser diferente.

Un poco de descuento.

Redis utiliza internamente el controlador de eventos de archivos , que es de subproceso único , por lo que

Redis se denomina modelo de subproceso único. Utiliza el mecanismo de multiplexación IO para monitorear múltiples sockets al mismo tiempo, de acuerdo con los eventos en el socket.

para seleccionar el controlador de eventos correspondiente para su procesamiento.

La estructura de un controlador de eventos de archivo consta de 4 partes:

1. Múltiples enchufes.

2. Programa de multiplexación IO.

3. Despachador de eventos de archivos.

4. Controladores de eventos (controlador de respuesta de conexión, controlador de solicitud de comando, controlador de respuesta de comando).

Múltiples sockets pueden generar diferentes operaciones al mismo tiempo, y cada operación corresponde a un evento de archivo diferente, pero el programa de multiplexación IO

Escuchar múltiples sockets pondrá los eventos generados por el socket en la cola, y el despachador de eventos sacará un evento de la cola cada vez

evento y entregar el evento al controlador de eventos correspondiente para su procesamiento.

Veamos un proceso de comunicación entre el cliente y Redis:

Hablemos brevemente de esta imagen:

1. El cliente Socket01 solicita establecer una conexión con Redis Server Socket, y Server Socket generará un

Evento AE_READABLE, después de que el multiplexor IO escucha el evento generado por el socket del servidor, empuja el evento a la cola

medio. El despachador de eventos del archivo obtiene el evento de la cola y lo entrega al controlador de respuesta de la conexión. El controlador de respuesta de conexión crea un

Socket01 que puede comunicarse con el cliente y conectar el evento AE_READABLE del Socket01 con el procesador de solicitud de comando

copla.

2. Suponiendo que el cliente envíe una solicitud de valor de clave establecida en este momento, Socket01 en Redis generará

evento AE_READABLE, el multiplexor IO empuja el evento a la cola y el despachador de eventos obtiene el evento de la cola

dado que el evento anterior AE_READABLE de Socket01 se ha asociado con el controlador de solicitud de comando, el despachador de eventos

Pase el evento al controlador de solicitud de comando para su procesamiento. El procesador de solicitud de comando lee el valor de clave establecido de Socket01 y

Complete la configuración del valor de la clave establecida en la memoria. Una vez completada la operación, enviará el evento AE_WRITABLE de Socket01 a

Asociación de controlador de respuesta.

3. Si el cliente está listo para recibir el resultado devuelto en este momento, Socket01 en Redis generará un

El evento AE_WRITABLE también se inserta en la cola, el despachador de eventos encuentra el controlador de respuesta de comando asociado y el comando responde

El procesador de datos interno de Ali ingresa el resultado de esta operación en Socket01, como ok, y luego libera Socket01

Asociación de eventos AE_WRITABLE con controladores de respuesta de comando.

Esto completa una comunicación. No tengas miedo de este texto, léelo junto con la imagen, hazlo una o dos veces, si no funciona, puedes consultar la información en línea.

Mirándolo juntos, debemos resolverlo, de lo contrario, la jactancia en el frente será en vano.

7,为什么 Redis 需要把所有数据放到内存中?

Redis 将数据放在内存中有一个好处,那就是可以实现最快的对数据读取,如果数据存储在硬盘

中,磁盘 I/O 会严重影响 Redis 的性能。而且 Redis 还提供了数据持久化功能,不用担心服务器重

启对内存中数据的影响。其次现在硬件越来越便宜的情况下,Redis 的使用也被应用得越来越多,

使得它拥有很大的优势。

8Redis 的同步机制了解是什么?

Redis 支持主从同步、从从同步。如果是第一次进行主从同步,主节点需要使用 bgsave 命令,再将

后续修改操作记录到内存的缓冲区,等 RDB 文件全部同步到复制节点,复制节点接受完成后将

RDB 镜像记载到内存中。等加载完成后,复制节点通知主节点将复制期间修改的操作记录同步到复

制节点,即可完成同步过程。

9 pipeline 有什么好处,为什么要用 pipeline

使用 pipeline(管道)的好处在于可以将多次 I/O 往返的时间缩短为一次,但是要求管道中执行的

指令间没有因果关系。

用 pipeline 的原因在于可以实现请求/响应服务器的功能,当客户端尚未读取旧响应时,它也可以

处理新的请求。如果客户端存在多个命令发送到服务器时,那么客户端无需等待服务端的每次响应

才能执行下个命令,只需最后一步从服务端读取回复即可。

10,说一下 Redis 有什么优点和缺点

优点

速度快:因为数据存在内存中,类似于 HashMap , HashMap 的优势就是查找和操作的时间复杂

度都是O (1) 。

支持丰富的数据结构:支持 String ,List,Set,Sorted Set,Hash 五种基础的数据结构。

持久化存储:Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担心的

万一 Redis 挂掉,数据会消失掉

高可用:内置 Redis Sentinel ,提供高可用方案,实现主从故障自动转移。 内置 Redis

Cluster ,提供集群方案,实现基于槽的分片方案,从而支持更大的 Redis 规模。

丰富的特性:Key过期、计数、分布式锁、消息队列等。

缺点

阿里内部资料由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然

Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定

期删除数据。

如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗

现网的带宽。不过 Redis 2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步

的。比如,新上线的备机。

修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中, Redis

不能提供服务。

11 Redis 缓存刷新策略有哪些?

12Redis 持久化方式有哪些?以及有什么区别?

Redis 提供两种持久化机制 RDB 和 AOF 机制:

RDB 持久化方式

是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入

一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

优点:

只有一个文件 dump.rdb ,方便持久化。

容灾性好,一个文件可以保存到安全的磁盘。

Para maximizar el rendimiento, bifurque el proceso secundario para completar la operación de escritura y deje que el proceso principal continúe procesando los comandos, de modo que se maximice el IO. hoja de uso

El único proceso secundario se utiliza para la persistencia y el proceso principal no realizará ninguna operación de E/S, lo que garantiza el alto rendimiento de Redis)

En comparación con el gran conjunto de datos, es más eficiente comenzar que AOF.

defecto:

La seguridad de los datos es baja. RDB se persiste a intervalos. Si Redis falla entre la persistencia, se producirán datos

perdido. Por lo tanto, este método es más adecuado cuando los requisitos de datos no son rigurosos.

AOF=Agregar - solo método de persistencia de archivos

Los datos internos de Alibaba significan que todos los registros de la línea de comandos se almacenan de forma persistente en el formato del protocolo de solicitud de comandos de Redis y se guardan como archivos AOF.

ventaja:

(1) Seguridad de datos, la persistencia de AOF se puede configurar con el atributo appendfsync, siempre hay, y se registrará cada vez que se realice una operación de comando

en el archivo AOF una vez.

(2) Escriba archivos a través del modo de adición, incluso si el servidor está inactivo en el medio, puede usar la herramienta redis-check-aof para resolver los datos

Problemas de consistencia.

(3) El modo de reescritura del mecanismo AOF. Antes de reescribir el archivo AOF (cuando el archivo es demasiado grande, los comandos se fusionarán y reescribirán

Write), puede eliminar algunos de los comandos (como el mal uso de flushall)

defecto:

(1) Los archivos AOF son más grandes que los archivos RDB y la velocidad de recuperación es más lenta.

(2) Cuando el conjunto de datos es grande, es menos eficiente que el inicio de RDB.

13. Hay dos tipos de persistencia, entonces, ¿cómo elegir?

1. No use solo RDB, porque eso hará que pierda muchos datos.

2. No use solo AOF, porque hay dos problemas en ese sentido: primero, puede usar AOF para la copia de seguridad en frío sin RDB para la recuperación de la copia de seguridad en frío.

En segundo lugar, RDB genera instantáneas de datos de manera simple y aproximada cada vez, lo que es más robusto y puede evitar copias de seguridad complejas como AOF.

Errores en los mecanismos de copia de seguridad y recuperación.

3. Redis admite la habilitación de dos métodos de persistencia al mismo tiempo.Podemos usar los mecanismos de persistencia AOF y RDB de manera integral.

Use AOF para asegurarse de que los datos no se pierdan, como la primera opción para la recuperación de datos; use RDB para hacer diferentes grados de copia de seguridad en frío, en AOF

Cuando todos los archivos se pierden o dañan y no están disponibles, RDB también se puede usar para una recuperación rápida de datos.

4. Si se usan los mecanismos de persistencia RDB y AOF al mismo tiempo, cuando se reinicie Redis, se usará AOF para

Cree datos, porque los datos en AOF son más completos.

14. ¿Cómo usar Redis para implementar la cola de mensajes?

Generalmente, la estructura de la lista se usa como la cola, rpush produce mensajes y lpop consume mensajes. Cuando no hay noticias de lpop, es necesario

dormir y volver a intentarlo más tarde.

El entrevistador puede preguntar si puede usar el sueño. list también tiene una instrucción llamada blpop, cuando no hay noticias,

Bloquear hasta que llegue el mensaje.

El entrevistador también puede preguntar si es posible producir una vez y consumir varias veces. Usando el modo de suscriptor de pub / subtema, puede lograr 1: N

cola de mensajes.

El entrevistador también puede preguntar cuáles son las desventajas del pub/sub. Cuando el consumidor se desconecta, el mensaje producido se perderá, por lo que debe usar

Colas de mensajes profesionales como rabbitmq, etc.

El entrevistador de datos internos de Ali también puede preguntar cómo implementa Redis una cola de demora . Supongo que a estas alturas estarías tentado de matar a golpes al entrevistador si hubieras

Si es un bate de béisbol, ¿por qué preguntas con tanto detalle? Pero estabas muy contenido, y luego respondiste con calma: usa

sortedset, tome la marca de tiempo como la puntuación y el contenido del mensaje como la clave para llamar a zadd para producir el mensaje, y el consumidor usa

El comando zrangebyscore obtiene sondeos de datos hace N segundos para su procesamiento.

Difusión de entrevistas : muchos entrevistadores se acercan y preguntan directamente:

¿ Cómo implementa Redis una cola retrasada ?

15 , hable sobre su comprensión de las transacciones de Redis

什么是 Redis 事务?原理是什么?

Redis 中的事务是一组命令的集合,是 Redis 的最小执行单位。它可以保证一次执行多个命令,每

个事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。服务端在执行事务

的过程中,不会被其他客户端发送来的命令请求打断。

它的原理是先将属于一个事务的命令发送给 Redis,然后依次执行这些命令。

Redis 事务的注意点有哪些?

需要注意的点有:

Redis 事务是不支持回滚的,不像 MySQL 的事务一样,要么都执行要么都不执行;

Redis 服务端在执行事务的过程中,不会被其他客户端发送来的命令请求打断。直到事务命令

全部执行完毕才会执行其他客户端的命令。

Redis 事务为什么不支持回滚?

Redis 的事务不支持回滚,但是执行的命令有语法错误,Redis 会执行失败,这些问题可以从程序层

面捕获并解决。但是如果出现其他问题,则依然会继续执行余下的命令。这样做的原因是因为回滚

需要增加很多工作,而不支持回滚则可以保持简单、快速的特性。

16Redis 为什么设计成单线程的?

多线程处理会涉及到锁,并且多线程处理会涉及到线程切···换而消耗 CPU。采用单线程,避免了不

必要的上下文切换和竞争条件。其次 CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或

者网络带宽。

17,什么是 bigkey?会存在什么影响?

bigkey 是指键值占用内存空间非常大的 key。例如一个字符串 a 存储了 200M 的数据。

bigkey 的主要影响有:

网络阻塞;获取 bigkey 时,传输的数据量比较大,会增加带宽的压力。

Bloqueo de tiempo de espera; debido a que bigkey ocupa un espacio relativamente grande, la eficiencia de la operación será relativamente baja, lo que resultará en la posibilidad de bloqueo

el sexo aumentó.

Los datos internos de Alibaba conducen a un espacio de memoria desequilibrado; una llave grande almacena una gran cantidad de datos y la misma clave se almacena en el mismo nodo o servidor

El almacenamiento tendrá un cierto impacto.

18. ¿ Con qué modos de clúster de Redis está familiarizado?

1. Centinela Redis

Cuando el volumen es pequeño, elija Redis Sentinel, y un Redis maestro único es suficiente para respaldar el negocio.

2. Clúster Redis

La solución de agrupación en clúster proporcionada oficialmente por Redis, cuando el volumen es grande, elija Redis Cluster y use más contenido a través de la fragmentación

vivir.

3. Twemprox

Twemprox es un servidor proxy de Redis y Memcached de código abierto de Twtter, utilizado principalmente para administrar Redis y Memcached

Los clústeres de Memcached reducen la cantidad de conexiones directas al servidor de caché.

4. Códigos

Codis es un middleware proxy. Cuando el cliente envía instrucciones a Codis, Codis es responsable de reenviar las instrucciones a los siguientes

Redis para ejecutar y devolver el resultado al cliente. Una instancia de Codis se puede conectar a varias instancias de Redis y también se puede iniciar

Para admitir varias instancias de Codis, cada nodo de Codis es igual, lo que puede aumentar la demanda general de QPS y también

Juega una función de recuperación de desastres.

5. Fragmentación de clientes

Se usaba mucho antes de que apareciera Redis Cluster, pero ahora rara vez lo usa. Se implementa en la capa de código empresarial.

Varias instancias de Redis no relacionadas, en la capa de código, realizan cálculos hash en la clave y luego van a la instancia de Redis correspondiente para operar

hacer datos Este método tiene requisitos relativamente altos para el código de capa hash, y las consideraciones incluyen el esquema de algoritmo alternativo después de que falla el nodo,

Recuperación automática de scripts después de un choque de datos, monitoreo de instancias, etc.

19. ¿Ha utilizado alguna vez un clúster de Redis Cluster ?¿Cuál es el principio del clúster?

Clúster Redis usado, su principio es:

所有的节点相互连接

集群消息通信通过集群总线通信,集群总线端口大小为客户端服务端口 + 10000(固定值)

节点与节点之间通过二进制协议进行通信

客户端和集群节点之间通信和通常一样,通过文本协议进行

集群节点不会代理查询

数据按照 Slot 存储分布在多个 Redis 实例上

集群节点挂掉会自动故障转移

可以相对平滑扩/缩容节点

阿里内部资料Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对

key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号

在 0~16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

20Redis Cluster 集群方案什么情况下会导致整个集群不可

用?

Redis 没有使用哈希一致性算法,而是使用哈希槽。Redis 中的哈希槽一共有 16384 个,计算给定

密钥的哈希槽,我们只需要对密钥的 CRC16 取摸 16384。假设集群中有 A、B、C 三个集群节点,

不存在复制模式下,每个集群的节点包含的哈希槽如下:

节点 A 包含从 0 到 5500 的哈希槽;

节点 B 包含从 5501 到 11000 的哈希槽;

节点 C 包含从 11001 到 16383 的哈希槽;

这时,如果节点 B 出现故障,整个集群就会出现缺少 5501 到 11000 的哈希槽范围而不可用。

21Redis 集群架构模式有哪几种?

Redis 集群架构是支持单节点单机模式的,也支持一主多从的主从结构,还支持带有哨兵的集群部

署模式。

22,说说 Redis 哈希槽的概念?

El clúster de Redis no usa hash coherente, pero introduce el concepto de ranura de hash. Hay 16384 (2 ^ 14) ha en el grupo Redis

Ranura, cada clave pasa la verificación CRC16 y el módulo 16384 para determinar qué ranura colocar, cada nodo del clúster es responsable de una parte

ranura hash.

23. ¿ Cuáles son los problemas comunes de rendimiento y las soluciones de Redis ?

Los problemas de rendimiento comunes de Redis y sus soluciones son los siguientes:

Es mejor que Master no haga ningún trabajo persistente, como instantáneas de memoria RDB y archivos de registro AOF;

Si los datos son más importantes, un Esclavo activa los datos de copia de seguridad AOF y la política se configura para sincronizar una vez por segundo;

Para la velocidad de replicación maestro-esclavo y la estabilidad de la conexión, es mejor que Maestro y Esclavo estén en la misma red de área local;

Trate de evitar agregar bibliotecas esclavas a la biblioteca principal bajo mucha presión;

No use una estructura gráfica para la replicación maestro-esclavo. Es más estable usar una estructura de lista enlazada unidireccional, es decir: Maestro <- Esclavo1 <- Esclavo2 <-

Slave3….; Tal estructura es conveniente para resolver el problema del punto único de falla y realizar el reemplazo de Master por Slave. Si el maestro se cuelga

Ahora, puede habilitar inmediatamente a Slave1 para que sea el maestro, y los demás permanecen sin cambios.

24. Si hay 100 millones de claves en Redis , 10w de ellas se basan en cierto

comenzando con un prefijo fijo conocido, ¿cómo encontrarlos todos?

Ali información interna Podemos usar el comando de teclas y el comando de escaneo, pero encontraremos que es mejor usar el escaneo.

1. Usa el comando de teclas

Use directamente el comando de teclas para consultar, pero si se usa en un entorno de producción, habrá un problema, el comando de teclas es una consulta transversal

的,查询的时间复杂度为 O(n),数据量越大查询时间越长。而且 Redis 是单线程,keys 指令会导

致线程阻塞一段时间,会导致线上 Redis 停顿一段时间,直到 keys 执行完毕才能恢复。这在生产

环境是不允许的。除此之外,需要注意的是,这个命令没有分页功能,会一次性查询出所有符合条

件的 key 值,会发现查询结果非常大,输出的信息非常多。所以不推荐使用这个命令。

2. 使用 scan 命令

scan 命令可以实现和 keys 一样的匹配功能,但是 scan 命令在执行的过程不会阻塞线程,并且查

找的数据可能存在重复,需要客户端操作去重。因为 scan 是通过游标方式查询的,所以不会导致

Redis 出现假死的问题。Redis 查询过程中会把游标返回给客户端,单次返回空值且游标不为 0,则

说明遍历还没结束,客户端继续遍历查询。scan 在检索的过程中,被删除的元素是不会被查询出来

的,但是如果在迭代过程中有元素被修改,scan 不能保证查询出对应元素。相对来说,scan 指令

查找花费的时间会比 keys 指令长。

25,如果有大量的 key 需要设置同一时间过期,一般需要注意什

么?

如果有大量的 key 在同一时间过期,那么可能同一秒都从数据库获取数据,给数据库造成很大的压

力,导致数据库崩溃,系统出现 502 问题。也有可能同时失效,那一刻不用都访问数据库,压力不

够大的话,那么 Redis 会出现短暂的卡顿问题。所以为了预防这种问题的发生,最好给数据的过期

时间加一个随机值,让过期时间更加分散。

26,什么情况下可能会导致 Redis 阻塞?

Redis 产生阻塞的原因主要有内部和外部两个原因导致:

内部原因

Si la carga de la CPU del host Redis es demasiado alta, también provocará que el sistema se bloquee;

La persistencia de datos consume demasiados recursos;

Uso irrazonable de la API o las instrucciones de Redis, lo que genera problemas con Redis.

Causa externa

Las razones externas son causadas principalmente por el servidor, por ejemplo, el subproceso de la CPU del servidor es demasiado competitivo durante el proceso de conmutación, problemas de memoria, problemas de red, etc.

problemas de red, etc

27. ¿Quién actualizará primero la caché y la base de datos?

solución

Ali información interna 1. Cuando llegue la solicitud de escritura, almacene en caché la solicitud de escritura en la cola de caché y comience a ejecutar la operación específica de la solicitud de escritura (elimine los datos en el caché

datos, actualizar base de datos, actualizar caché).

2. Si llega otra solicitud de lectura durante el proceso de actualización de la base de datos, vuelva a almacenar la solicitud de lectura en la cola de caché (puede crear n colas

Columna, use el valor hash de la clave para tomar el módulo hash% n de la cantidad de colas y caiga en la cola correspondiente, la cola debe garantizar el orden)

Entre ellos, la garantía de secuencia espera la ejecución de la solicitud de escritura antes de que se complete la cola, y luego la solicitud de escritura antes de que la solicitud de lectura no elimine el caché.

Regrese directamente, los datos en la base de datos son el valor anterior en este momento, y son consistentes con los datos en el caché, y no habrá coherencia en el caché

El problema.

3. Si la solicitud de escritura elimina el caché con éxito, la base de datos se actualizará. Si la actualización falla, volverá directamente y la solicitud de escritura finaliza. En este momento

El valor en la base de datos sigue siendo el valor anterior.Después de que llega la solicitud de lectura, se encuentra que no hay datos en el caché.

solicitará directamente a la base de datos,

Al mismo tiempo, los datos se escriben en la memoria caché y no habrá ningún problema de coherencia de datos en este momento.

4. Después de actualizar los datos con éxito, actualice la memoria caché. Si la actualización de la memoria caché falla en este momento, no hay datos en la memoria caché y la base de datos es nueva.

valor, la solicitud de escritura finaliza, la solicitud de lectura sigue siendo la misma en este momento, y si no hay datos en el caché, los datos también se leerán de la base de datos.

Y almacenado en el caché, de hecho, no importa si la caché de actualización tiene éxito o falla,

No habrá problemas de coherencia de datos.

La solución anterior resuelve el problema de la inconsistencia de los datos, principalmente porque se utiliza la serialización y cada operación debe realizarse en orden. como

Si hay demasiada acumulación de un determinado elemento de la cola, puede filtrar la solicitud de lectura y solicitar al usuario que actualice la página y solicite nuevamente.

Problemas potenciales , dejemos que cada uno lo piense, porque este problema es divergente.

1. El tiempo de solicitud es demasiado largo, se acumula una gran cantidad de solicitudes de escritura en la cola y una solicitud de lectura no puede obtener los datos hasta que finalicen todas las escrituras.

2. Alta concurrencia de solicitudes de lectura

3. Los problemas de enrutamiento de datos de puntos de acceso conducen a solicitudes sesgadas.

28. ¿Cómo mejorar la tasa de aciertos de caché?

Los principales medios comúnmente utilizados son:

Cargue datos en el caché por adelantado;

Aumente el espacio de almacenamiento del caché y mejore los datos almacenados en caché;

Ajuste el tipo de datos de almacenamiento del caché;

Aumente la frecuencia de actualización de la memoria caché.

29. ¿Cómo resuelve Redis los conflictos clave ?

Redis Si las claves son las mismas, la última clave sobrescribirá a la anterior. Si desea resolver conflictos clave, es mejor nombrar el área clave

Por separado, puede separar los nombres según el nombre comercial y los parámetros para evitar conflictos causados ​​por claves repetidas.

30. ¿Cómo lidiar con Redis que informa memoria insuficiente?

Redis sin memoria se puede manejar así:

Modifique el parámetro maxmemory del archivo de configuración redis.conf para aumentar la memoria disponible de Redis;

Establecer la estrategia de eliminación de caché para mejorar la eficiencia del uso de la memoria;

Los datos internos de Ali utilizan el modo de clúster de Redis para aumentar la capacidad de almacenamiento.

31. Hable sobre el mecanismo de persistencia de Redis

Redis es una base de datos en memoria que admite persistencia. A través del mecanismo de persistencia, los datos en la memoria se sincronizan con el archivo del disco duro para garantizar que los datos

Persistencia. Cuando se reinicia Redis, el propósito de la recuperación de datos se puede lograr recargando los archivos del disco duro en la memoria. Implementación: solo

Cree un proceso secundario fork(), copie los datos de la base de datos del proceso principal actual en la memoria del proceso secundario y luego escríbalo en el proceso temporal.

En el archivo temporal, el proceso de persistencia finaliza y luego usa este archivo temporal para reemplazar el último archivo de instantánea, luego el proceso secundario sale y la memoria

liberado.

RDB es el método de persistencia predeterminado de Redis. Según una determinada estrategia de período de tiempo, los datos de la memoria se guardan en el disco duro en forma de instantánea.

archivo binario. Es decir, almacenamiento de instantáneas instantáneas, el archivo de datos generado correspondiente es dump.rdb, a través del parámetro guardar en el archivo de configuración

número para definir el período de la instantánea. (

Una instantánea puede ser una copia o una réplica de los datos que representa. )

AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySQL的binlog。

当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。 当两种方

式同时开启时,数据恢复Redis会优先选择AOF恢复。

32、缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问

一、缓存雪崩

我们可以简单的理解为:由于原有缓存失效,新缓存未到期间 (例如:我们设置缓存时采用了相同的

过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,

而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成

整个系统崩溃。 解决办法:

大多数系统设计者考虑用加锁(

最多的解决方案)或者队列的方式保

证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存

储系统上。还有一个简单方案就时讲缓存失效时间分散开。

二、缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用

户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次

无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。 解决办法;

最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不

存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 另外也有一个更为

简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然

把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设置的默认值

存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。

5TB的硬盘上放满了数据,请写一个算法将这些数据进行排重。如果这些数据是一些32bit大小的数

据该如何解决?如果是64bit的呢?

阿里内部资料对于空间的利用到达了一种极致,那就是Bitmap和布隆过滤器(Bloom Filter)。 Bitmap:

典型的就

是哈希表 缺点是,Bitmap对于每个元素只能记录1bit信息,如果还想完成额外的功能,恐怕只能靠

牺牲更多的空间、时间来完成了。

布隆过滤器(推荐)

就是引入了k(k>1)k(k>1)个相互独立的哈希函数,保证在给定的空间、误判率

下,完成元素判重的过程。 它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定

的误识别率和删除困难。 Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲

突”。 Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减

少冲突,我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那

么该元素肯定不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存

在于集合中。这便是Bloom-Filter的基本思想。 Bloom-Filter一般用于在大数据量的集合中判定某

元素是否存在。

三、缓存预热 缓存预热这个应该是一个比较常见的概念,相信很多小伙伴都应该可以很容易的理

解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请

求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

解决

思路: 1、直接写个缓存刷新页面,上线时手工操作下; 2、数据量不大,可以在项目启动的时候

自动进行加载; 3、定时刷新缓存;

4. Actualización de caché Además de la estrategia de invalidación de caché que viene con el servidor de caché (Redis tiene 6 estrategias para elegir de manera predeterminada),

También puede personalizar la eliminación de caché de acuerdo con las necesidades comerciales específicas.Existen dos estrategias comunes:

(1) Limpieza regular caducada

cache;

(2) Cuando un usuario lo solicite, juzgue si el caché utilizado por la solicitud ha caducado y, si caduca, vaya al sistema subyacente.

El sistema obtiene nuevos datos y actualiza la memoria caché. Ambos tienen sus propias ventajas y desventajas. La primera desventaja es que es más problemático mantener una gran cantidad de claves en caché. La segunda

La desventaja del segundo tipo es que cada vez que un usuario lo solicita, el caché debe considerarse inválido y la lógica es relativamente complicada. ¿Qué tipo de plan usas?

Puede pesarlo de acuerdo con sus propios escenarios de aplicación.

5. Degradación de la memoria caché Cuando el número de visitas aumenta considerablemente, los problemas del servicio (como un tiempo de respuesta lento o la falta de respuesta) o los servicios no centrales afectan el flujo principal.

Al mejorar el rendimiento del proceso, aún es necesario garantizar que el servicio aún esté disponible, incluso si es perjudicial para el servicio. El sistema puede realizar auto-

También puede degradar manualmente configurando los interruptores. El objetivo final de la degradación es mantener los servicios básicos disponibles, incluso si tienen pérdidas. y

Y algunos servicios no se pueden degradar (como agregar al carrito de compras, liquidación). Configure el esquema con el nivel de registro de referencia:

(1) General: Por ejemplo

Algunos servicios caducan ocasionalmente debido a fluctuaciones en la red o porque el servicio se está conectando y se pueden degradar automáticamente;

(2) ADVERTENCIA: Algunos servicios son

Si la tasa de éxito fluctúa dentro de un cierto período de tiempo (por ejemplo, entre el 95 % y el 100 %), se puede reducir de forma automática o manual y se enviará una alarma;

(3) Incorrecto

Error: por ejemplo, la tasa de disponibilidad es inferior al 90 %, o el grupo de conexiones de la base de datos explota, o el tráfico de repente se dispara al máximo que el sistema puede soportar.

Umbral, en este momento, se puede degradar automáticamente o degradar manualmente según la situación;

(4) Errores graves: como errores de datos debido a razones especiales

, se requiere una degradación manual de emergencia en este momento.

El propósito de la degradación del servicio es evitar la falla del servicio Redis, lo que causará el problema de la avalancha de la base de datos. Por lo tanto, para los ingrávidos

Si desea almacenar datos en caché, puede adoptar una estrategia de degradación del servicio. Por ejemplo, una práctica común es que si hay un problema con Redis, los datos no se eliminarán.

consulta de biblioteca, pero devuelve directamente el valor predeterminado al usuario.

33. ¿Qué son los datos calientes y los datos fríos?

阿里内部资料热点数据,缓存才有价值 对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,

不仅占用内存,而且价值不大。频繁修改的数据,看情况考虑使用缓存 对于上面两个例子,寿星列

表、导航信息都存在一个特点,就是信息修改频率不高,读取通常非常高的场景。 对于热点数据,

比如我们的某IM产品,生日祝福模块,当天的寿星列表,缓存以后可能读取数十万次。再举个例

子,某导航产品,我们将导航信息,缓存以后可能读取数百万次。 数据更新前至少读取两次,缓存

才有意义。这个是最基本的策略,如果缓存还没有起作用就失效了,那就没有太大价值了。 那存不

存在,修改频率很高,但是又不得不考虑缓存的场景呢?有!比如,这个读取接口对数据库的压力

很大,但是又是热点数据,这个时候就需要考虑通过缓存手段,减少数据库的压力,比如我们的某

助手产品的,点赞数,收藏数,分享数等是非常典型的热点数据,但是又不断变化,此时就需要将

数据同步保存到Redis缓存,减少数据库压力。

34MemcacheRedis的区别都有哪些?

1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

Redis有部份存在硬盘上,redis可以持久化其数据 2)、数据支持类型 memcached所有的值均是简

单的字符串,redis作为其替代者,支持更为丰富的数据类型 ,提供list,set,zset,hash等数据结

构的存储 3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一

样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移

acciones y solicitudes. 4) El tamaño del valor es diferente: Redis puede alcanzar un máximo de 1 gb, Memcache es solo 1 mb. 5) redis

La velocidad es mucho más rápida que memcached 6) Redis admite la copia de seguridad de datos, es decir, la copia de seguridad de datos en modo maestro-esclavo.

35. ¿Por qué Redis de un solo subproceso es tan rápido ?

(1) Operación de memoria pura (2) Operación de subproceso único, que evita cambios de contexto frecuentes (3) Se adopta un mecanismo de multiplexación de E/S sin bloqueo

36. Los tipos de datos de redis y los escenarios de uso de cada tipo de datos

Respuesta: Hay cinco tipos en total (1) Cadena Esto no es nada que decir, la operación de establecer/obtener más común, el valor puede ser Cadena o

es un número En general, haga algo de almacenamiento en caché de funciones de conteo complejas. (2) hash Aquí, el valor almacena objetos estructurados, lo cual es más conveniente

La conveniencia es operar uno de los campos. Cuando los blogueros realizan un inicio de sesión único, utilizan esta estructura de datos para almacenar la información del usuario.

CookieId se utiliza como clave y se establece 30 minutos como el tiempo de caducidad de la memoria caché, lo que puede simular muy bien un efecto similar al de una sesión. (3) lista de uso

La estructura de datos de List se puede utilizar como una cola de mensajes simple. Otra cosa es que puede usar el comando lrange para hacer en función de

La función de paginación de redis tiene un rendimiento excelente y una buena experiencia de usuario. También utilizo una escena, que es muy adecuada para tomar información de mercado. también es estudiante

escenarios de productor y consumidor. LISTA bien puede completar la cola, el principio de primero en entrar, primero en salir. (4) conjunto Porque el conjunto apila una pila

Una colección de valores únicos. Entonces puede hacer la función de deduplicación global. ¿Por qué no usar el Set que viene con la JVM para la deduplicación? porque nuestro departamento

El sistema generalmente se implementa en clústeres. Es problemático usar el conjunto que viene con la JVM. ¿Es necesario crear una deduplicación global para uno?

Servicio total, demasiado problema. Además, al usar operaciones como intersección, unión y diferencia, es posible calcular preferencias comunes, todas las preferencias,

Sus propias preferencias únicas y otras funciones. (5) conjunto ordenado conjunto ordenado tiene una puntuación de parámetro de peso más, y los elementos del conjunto se pueden ordenar por

partitura para arreglar. Se puede usar como una aplicación de clasificación, tomando operaciones TOP N.

37. Estrategia de caducidad de Redis y mecanismo de eliminación de memoria

Redis de datos internos de Ali adopta una estrategia de eliminación regular + eliminación diferida. ¿Por qué no usar una política de eliminación de tiempo?Borrado de tiempo, use un temporizador para ser responsable

Supervise la clave y elimínela automáticamente cuando caduque. Aunque la memoria se libera a tiempo, consume muchos recursos de la CPU. Bajo grandes solicitudes concurrentes, la CPU necesita

Se aplica tiempo para procesar solicitudes en lugar de eliminar claves, por lo que no se adopta esta estrategia. ¿Cómo funciona la eliminación regular + eliminación diferida?

¿Qué ? Eliminación regular, redis verifica cada 100 ms de forma predeterminada, si hay una clave caducada y, si hay una clave caducada, se eliminará. Se debería notar,

Redis no verifica todas las claves cada 100 ms, sino que las selecciona aleatoriamente para su inspección (si cada 100 ms, se verifican todas las claves

Compruebe, no está atascado). Por lo tanto, si solo se adopta la estrategia de eliminación regular, muchas claves no se eliminarán en ese momento. En

Sí, la eliminación diferida es útil. Es decir, cuando obtenga una clave, redis la verificará.Si la clave está configurada

Tiempo de caducidad Entonces, ¿está caducado? Si caduca, se eliminará en este momento. ¿No hay ningún otro problema con la eliminación regular + eliminación diferida?

No, si la clave no se elimina periódicamente. Entonces no solicitaste la clave inmediatamente, es decir, no surtió efecto el borrado perezoso. este

De esta manera, la memoria de redis será cada vez más alta. Entonces se debe adoptar el mecanismo de eliminación de memoria. Hay una línea de configuración en redis.conf

maxmemory-policy volátil-lru

Esta configuración está equipada con una estrategia de eliminación de memoria (¿qué, no la has configurado? Reflexiona sobre ti mismo) volatile-lru : desde cuando caduca la configuración

Seleccione los datos usados ​​menos recientemente del conjunto de datos provisionales (server.db[i].expires) para eliminar volatile-ttl : del tiempo de vencimiento establecido

Seleccione los datos que caducarán del conjunto de datos (server.db[i].expires) en el medio para eliminar volatile-random : del conjunto de caducidad

Seleccione aleatoriamente datos en el conjunto de datos de tiempo (server.db[i].expires) para eliminar allkeys-lru : del conjunto de datos

(server.db[i].dict) seleccione los datos usados ​​menos recientemente para eliminar allkeys-random : del conjunto de datos

(server.db[i].dict) selecciona arbitrariamente eliminación de datos no-enviction (desalojo): prohíbe el desalojo de datos y nuevas operaciones de escritura

Error ps: si no se establece la clave de caducidad, no se cumplen los requisitos previos (requisitos previos); entonces volatile-lru, volatile

El comportamiento de las estrategias random y volatile-ttl es básicamente el mismo que noeviction (no eliminado).

38. ¿ Por qué Redis es de subproceso único?

Las preguntas frecuentes oficiales dicen que debido a que Redis es una operación basada en la memoria, la CPU no es el cuello de botella de Redis, y lo más probable es que el cuello de botella de Redis sea la máquina.

El tamaño de la memoria o el ancho de banda de la red. Dado que el subproceso único es fácil de implementar y la CPU no se convertirá en un cuello de botella, es lógico utilizar un subproceso único.

Solución de subprocesos (¡después de todo, habrá muchos problemas con los subprocesos múltiples!) Redis utiliza tecnología de cola para cambiar el acceso concurrente a acceso en serie 1)

La gran mayoría de las solicitudes son operaciones de memoria puras (muy rápidas) 2) Subproceso único, lo que evita cambios de contexto innecesarios y condiciones de competencia

Artículo 3) Ventajas de IO sin bloqueo:

La velocidad es rápida, porque los datos se almacenan en la memoria, similar a HashMap, la ventaja de HashMap es la complejidad del tiempo de búsqueda y operación.

La complejidad es O(1)

Admite tipos de datos enriquecidos, cadena de soporte, lista, conjunto, conjunto ordenado, hash

Las transacciones son compatibles y las operaciones son atómicas. La llamada atomicidad significa que todos los cambios en los datos se ejecutan o no se ejecutan en absoluto.

Funciones enriquecidas: se pueden usar para almacenar en caché, mensajes, establecer el tiempo de caducidad por clave y se eliminará automáticamente después de la caducidad.

Problema de clave de contención concurrente

Los datos internos de Ali tienen múltiples subsistemas para establecer una clave al mismo tiempo. ¿A qué debemos prestar atención en este momento?

No se recomienda el mecanismo de transacción de redis. Debido a nosotros

El entorno de producción es básicamente un entorno de clúster de Redis y se han realizado operaciones de fragmentación de datos. Tiene varias operaciones clave involucradas en una transacción

A veces, estas claves múltiples no se almacenan necesariamente en el mismo servidor redis. Por lo tanto, el mecanismo de transacción de redis es de muy mal gusto. (1)

Si se opera sobre esta tecla, no se requiere el orden:

Prepare un candado distribuido, todos agarran el candado y simplemente realicen la operación de configuración después de agarrar el candado (2)

Si se opera sobre esta tecla, se requiere el orden:

Bloqueo distribuido + marca de tiempo. Suponiendo que el sistema B agarrará la cerradura primero, configure key1 en

{valorB 3:05}. Luego, el sistema A toma el candado y descubre que la marca de tiempo de su propio valor A es anterior a la marca de tiempo en el caché, por lo que no lo hace.

establecer la operación. etcétera. (3) Use la cola para cambiar el método establecido a acceso en serie, y redis también puede encontrar una alta concurrencia. Si está garantizado

La coherencia de lectura y escritura de claves es atómica para las operaciones de Redis y es una operación segura para subprocesos. No es necesario que tenga en cuenta los problemas de concurrencia. Interno de Redis

El departamento ya lo ha ayudado a lidiar con el problema de concurrencia.

39. Redis problemas comunes de rendimiento y soluciones ?

(1) Es mejor que el maestro no haga ningún trabajo persistente, como instantáneas de memoria RDB y archivos de registro AOF (2) Si los datos son pesados

Si un Esclavo inicia datos de copia de seguridad AOF, la estrategia se configura para sincronizar una vez por segundo (3) para la velocidad de replicación maestro-esclavo y la estabilidad de la conexión

Cualitativamente, es mejor que Maestro y Esclavo estén en la misma red de área local (4) trate de evitar agregar bibliotecas esclavas en la biblioteca maestra bajo alta presión (5) maestro-esclavo

No use una estructura gráfica para la replicación, es más estable usar una estructura de lista enlazada unidireccional, es decir: Maestro <- Esclavo1 <- Esclavo2 <-Esclavo3…

40. ¿Por qué el funcionamiento de Redis es atómico y cómo garantizar la atomicidad?

Para Redis, la atomicidad de un comando significa que una operación no se puede subdividir y la operación se ejecuta o no se ejecuta.

La razón por la que las operaciones de Redis son atómicas es porque Redis es de subproceso único. Todas las API proporcionadas por el propio Redis son operaciones atómicas.

De hecho, la transacción en Redis es para garantizar la atomicidad de las operaciones por lotes. ¿Los comandos múltiples también son atómicos en concurrencia?

diferente

Ciertamente,

Cambie get y set a operaciones de un solo comando, incr. Use transacciones de Redis, o use Redis+Lua== para lograrlo.

41. ¿ Entiende las transacciones de Redis ?

La función de transacción de Redis se realiza a través de las cuatro primitivas de MULTI, EXEC, DISCARD y WATCH. Redis

Todos los comandos se serializan y luego se ejecutan en orden. 1. Redis no admite reversión "Redis no revierte cuando falla una transacción, pero continúa

Continuar para ejecutar el resto de comandos",

Por lo tanto, las funciones internas de Redis pueden mantenerse simples y rápidas. 2. Si ocurre un error en un comando en una transacción

Si hay un error, no se ejecutarán todos los comandos 3. Si ocurre un error en una transacción, se ejecutará el comando correcto.

1) El comando MULTI se usa para iniciar una transacción, siempre devuelve OK. Después de ejecutar MULTI, el cliente puede continuar enviando

Envíe cualquier número de comandos, estos comandos no se ejecutarán inmediatamente, sino que se colocarán en una cola, cuando se llame al comando EXEC, todos

Solo se ejecutarán los comandos en la cola. 2) EXEC: Ejecuta los comandos en todos los bloques de transacciones. Devuelve el retorno de todos los comandos dentro del bloque de transacciones.

Los valores se enumeran en el orden en que se ejecutan los comandos. Devuelve nil cuando se interrumpe la operación. 3) Al llamar a DISCARD, el cliente

El final puede vaciar la cola de transacciones y renunciar a ejecutar la transacción,

Y el cliente saldrá del estado de transacción. 4) El comando RELOJ puede

Proporciona un comportamiento de comprobación y configuración (CAS) para las transacciones de Redis. Se pueden monitorear una o más claves, una vez que se modifica una de ellas

Cambie (o elimine), las transacciones posteriores no se ejecutarán y el monitoreo continúa hasta el comando EXEC.

42. Tipos de datos Redis y escenarios de uso

Cadena

La operación set/get más común para los datos internos de Alibaba, Value puede ser una cadena o un número. En general, haga algo de almacenamiento en caché de funciones de conteo complejas.

Picadillo

Aquí, Value almacena un objeto estructurado y es más conveniente operar uno de los campos. Estoy haciendo un inicio de sesión único

En este momento, use esta estructura de datos para almacenar información del usuario, use CookieId como clave y establezca 30 minutos como el tiempo de caducidad de la memoria caché, que puede

Simula muy bien el efecto de Session.

Lista

Usando la estructura de datos de List, puede realizar la función de una cola de mensajes simple. Además, puede utilizar el comando lrange para realizar tareas basadas en Redis.

La función de paginación tiene un excelente rendimiento y una buena experiencia de usuario.

Colocar

Porque Set apila una colección de valores únicos. Entonces puede hacer la función de deduplicación global. Nuestro sistema es generalmente departamento de clúster

Es problemático usar el Set que viene con la JVM. Además, al usar operaciones como intersección, unión y diferencia, es posible calcular el común

Bueno, todas las preferencias, tus propias preferencias únicas y otras funciones.

Conjunto ordenado

El conjunto ordenado tiene un parámetro de peso adicional Puntuación, y los elementos del conjunto se pueden organizar de acuerdo con la puntuación. Se puede utilizar como una aplicación de clasificación,

Tome las operaciones TOP(N). El conjunto ordenado se puede utilizar para tareas retrasadas.

Artículos distribuidos

1. ¿Cómo diseñar la idempotencia distribuida?

En la arquitectura de escenarios de alta concurrencia se debe garantizar la idempotencia. Por ejemplo, la función de pago, el usuario inicia el pago, si el fondo no tiene

Al realizar la verificación idempotente, el usuario simplemente hizo clic unas cuantas veces más con la mano temblorosa, por lo que el fondo puede recibir la misma solicitud de pedido varias veces. Es fácil no hacer idempotente

Es fácil dejar que los usuarios paguen repetidamente, por lo que los usuarios definitivamente no podrán soportarlo.

solución

1. La consulta y la eliminación no están dentro del alcance de la discusión idempotente. La consulta definitivamente no es idempotente. Eliminar: después de la primera eliminación exitosa, elimine más tarde

Además de devolver directamente 0, también devuelve éxito.

2. Cree un índice único: un índice único o un índice de combinación único para evitar datos sucios en datos nuevos (cuando hay un índice único en la tabla,

Cuando se agrega una excepción, simplemente vuelva a consultar, los datos ya deberían existir, solo devuelva el resultado).

3. Mecanismo de token: debido a clics repetidos, retransmisiones de red o retransmisiones de nginx, los datos se enviarán repetidamente. Interfaz

Antes de enviar los datos, es necesario solicitar un token del servicio back-end. El token se coloca en la memoria de Redis o JVM y es válido por un período de tiempo. después de la presentación

Verifique el token en segundo plano, elimine el token al mismo tiempo, genere un nuevo token y regrese. Redis necesita usar la operación de eliminación para juzgar el token, eliminarlo en

La función significa que se pasa la verificación del token.Si usa select+delete para verificar el token, habrá problemas de concurrencia, por lo que no se recomienda su uso.

4. Cerradura pesimista

El bloqueo pesimista de datos internos de Ali generalmente se usa junto con la transacción, el tiempo de bloqueo de datos puede ser muy largo, elija de acuerdo con la situación real (además de considerar

Considere si la identificación es la clave principal, si la identificación no es la clave principal o el motor de almacenamiento InnoDB, entonces se bloqueará toda la tabla).

5. Bloqueo optimista, agregue un campo de versión a la tabla de la base de datos, puede usar este campo para juzgar si se ha modificado

6. Bloqueos distribuidos, como bloqueos distribuidos de Redis y Zookeeper. El número único es la clave, y luego establezca el período de validez de la clave (para evitar el pago

Después de que falla el pago, el bloqueo no se libera), llega una solicitud para generar un bloqueo utilizando el número de pedido, y el bloqueo se libera después de que se completa la ejecución del código comercial.

7. Plan garantizado, primero verifique si existe el pedido, si no existe, realice el pago, si existe, directamente le devolverá el resultado del pago.

2. ¿ Cuáles son los pasos de una solicitud HTTP completa ?

1. Resolución DNS (descubrir su dirección IP a través del nombre de dominio accedido, búsqueda recursiva).

2. Solicitud HTTP, cuando se ingresa una solicitud, se establece una conexión Socket para iniciar un protocolo de enlace TCP de 3 vías.

Es ligeramente diferente para las solicitudes HTTPS. Espere hasta la sección HTTPS, estamos hablando.

3.1 El cliente envía un comando de solicitud (generalmente una solicitud GET o POST) al servidor.

Este es un contenido complementario, y la entrevista generalmente no necesita ser respondida.

La capa de red del cliente no necesita preocuparse por la capa de aplicación o la capa de transporte, lo principal es determinar cómo

Para llegar al servidor, puede pasar a través de múltiples enrutadores. Este es el trabajo realizado por el enrutador. No haré demasiado.

La descripción no es más que determinar la ruta para llegar al servidor consultando la tabla de enrutamiento.

La capa de enlace del cliente, el paquete se envía al enrutador a través de la capa de enlace y la dirección MAC de la dirección IP dada se busca a través del protocolo vecino.

dirección, y luego envíe una solicitud ARP para encontrar la dirección de destino, si obtiene una respuesta, puede usar el intercambio de solicitud-respuesta ARP

El paquete IP ahora está listo para la transmisión y el paquete IP se envía a la dirección del servidor.

3.2 El cliente envía información y datos del encabezado de la solicitud.

4.1 El servidor envía la información del encabezado de respuesta.

4.2 El servidor envía datos al cliente.

5. El servidor cierra la conexión TCP (ondas 4 veces).

La decisión de cerrar la conexión TCP aquí también está relacionada con el mecanismo HTTP Keep-Alive.

Al mismo tiempo, el cliente también puede iniciar activamente el cierre de la conexión TCP.

6. El cliente representa de acuerdo con el HTML, CSS y JS devueltos.

seleccione id, nombre de table_# donde id='##' para actualizar;

actualizar table_xxx set nombre=#nombre#,versión=versión+1 donde versión=#versión#

Información interna de Ali 3. Cuénteme sobre su comprensión de las transacciones distribuidas

La transacción distribuida es una dificultad técnica en la integración empresarial, y también es algo que está involucrado en cada arquitectura de sistema distribuido.

Especialmente en la arquitectura de microservicios, casi se puede decir que no se puede evitar.

En primer lugar, debemos averiguar: teoría ACID, CAP, BASE.

ÁCIDO

Hace referencia a los cuatro elementos básicos para la correcta ejecución de las transacciones de la base de datos:

1. atomicidad

2. Consistencia

3. Aislamiento

4. Durabilidad

GORRA

El principio CAP, también conocido como el teorema CAP, se refiere a la consistencia (Consistencia), disponibilidad,

(Disponibilidad), tolerancia de partición (Tolerancia de partición). El principio de la PAC establece que estos tres elementos deben como máximo

Darse cuenta de dos puntos al mismo tiempo, es imposible dar consideración a los tres.

Coherencia de datos internos de Alibaba: si todas las copias de seguridad de datos en el sistema distribuido tienen el mismo valor al mismo tiempo.

Disponibilidad: después de que fallan algunos nodos en el clúster, si el clúster en su conjunto aún puede responder a las solicitudes de lectura y escritura del cliente.

Tolerancia de partición: en términos de efectos prácticos, la partición es equivalente al requisito de límite de tiempo para la comunicación. Si el sistema no puede alcanzar el número dentro del límite de tiempo

De acuerdo con la coherencia, significa que se ha producido una partición y se debe elegir entre C y A para la operación actual.

teoría BÁSICA

La teoría BASE es el resultado de un compromiso entre consistencia y usabilidad en CAP. La idea central de la teoría es: no podemos

Consistencia fuerte, pero cada aplicación puede usar un método apropiado de acuerdo con sus propias características comerciales para que el sistema logre la consistencia final.

Básicamente disponible

Estado blando

Eventualmente consistente (consistencia final)

4. ¿Qué soluciones de transacciones distribuidas conoce?

Hay cinco que yo sepa:

1. Compromiso de dos fases (2PC)

2. Compromiso trifásico (3PC)

3. Transacción de compensación (TCC=Try-Confifirm-Cancel)

4. Tabla de colas de mensajes locales (MQ)

5. Modelo de transacción Sagas (coherencia eventual)

Después de hablar sobre los cinco tipos anteriores, el entrevistador generalmente continuará haciendo las siguientes preguntas (tal vez solo una o dos, o todas).

5. ¿Qué es la confirmación en dos fases?

La confirmación en dos fases 2PC es uno de los tipos de transacciones más potentes en las transacciones distribuidas. La confirmación en dos fases se confirma en dos fases:

La primera fase pregunta si cada fuente de datos transaccionales está lista.

La segunda fase realmente envía los datos a la fuente de datos transaccionales.

Para garantizar que la transacción pueda satisfacer a ACID, se debe presentar un coordinador (Coordinador). Otros nodos se llaman participantes.

(Partícipe). El coordinador es responsable de programar el comportamiento de los participantes y, en última instancia, decidir si estos participantes deben realizar la transacción.

El flujo de procesamiento es el siguiente:

Etapa 1 de datos internos de Alibaba

a) El coordinador envía el contenido de la transacción a todos los participantes, pregunta si la transacción se puede confirmar y espera una respuesta.

b) Cada participante realiza una operación de transacción, registra información de deshacer y rehacer en el registro de transacciones (pero no compromete la transacción).

c) Si el participante ejecuta con éxito, retroalimentar sí al coordinador, de lo contrario no retroalimentar.

etapa dos

Si el coordinador recibe un mensaje de error de un participante o se agota el tiempo de espera, envía un mensaje de reversión directamente a cada participante; de ​​lo contrario,

Envía un mensaje de confirmación. Los dos casos se manejan de la siguiente manera:

Caso 1 : cuando todos los participantes respondan que sí, envíe la transacción

a) El coordinador envía una solicitud a todos los participantes para comprometer formalmente la transacción (es decir, solicitud de compromiso).

b) El participante ejecuta la solicitud de compromiso y libera los recursos ocupados durante toda la transacción.

c) Cada participante retroalimenta el mensaje de finalización del acuse de recibo (respuesta) al coordinador.

d) Después de que el coordinador recibe los mensajes de acuse de recibo de todos los participantes, se completa el envío de la transacción.

Caso 2 : cuando un participante responde que no, revierte la transacción

a) El coordinador envía una solicitud de reversión (rollback request) a todos los participantes.

b) El participante utiliza la información de deshacer en la fase 1 para realizar una operación de reversión y liberar los recursos ocupados durante toda la transacción.

c) Cada participante retroalimenta el mensaje de confirmación de finalización al coordinador.

d) Después de que el coordinador recibe los mensajes de acuse de recibo de todos los participantes, la transacción se completa.

pregunta

Datos internos de Alibaba 1) Problemas de rendimiento : todos los participantes se encuentran en un estado de bloqueo síncrono durante la fase de envío de la transacción, lo que ocupa recursos del sistema y causa fácilmente cuellos de botella en el rendimiento.

2) Problemas de confiabilidad: si el coordinador tiene un único punto de falla o falla, el proveedor siempre estará bloqueado.

3) Problema de consistencia de datos: En la fase 2, si tanto el coordinador como los participantes cuelgan, puede causar inconsistencia de datos

Atentamente.

Ventajas: en la medida de lo posible para garantizar la gran consistencia de los datos, es adecuado para campos clave que requieren una alta consistencia de los datos. (En realidad, no hay garantía del 100%

fuertemente consistente).

Desventajas: La implementación es complicada, se sacrifica la disponibilidad y el rendimiento se ve muy afectado, no es adecuado para escenarios de alta concurrencia y alto rendimiento.

6. ¿Qué es un compromiso de tres fases?

La confirmación de tres fases es una versión mejorada de la confirmación de dos fases. Lo más importante que debe resolver 3PC es el problema de que el coordinador y los participantes cuelgan al mismo tiempo.

Por lo tanto, 3PC vuelve a dividir la fase de preparación de 2PC en dos, para que pueda presentarse en tres fases.

El flujo de procesamiento es el siguiente:

la etapa uno

a) El coordinador envía una solicitud canCommit que contiene el contenido de la transacción a todos los participantes, pregunta si la transacción se puede confirmar y espera a que todos los participantes

Respondió un participante.

b) Después de recibir la solicitud canCommit, si el participante cree que la operación de transacción se puede realizar, responderá que sí y entrará en el estado de preparación, de lo contrario

Entonces retroalimentación no.

etapa dos

El coordinador tiene las siguientes dos posibilidades según la respuesta de los participantes.

Caso 1 : todos los participantes responden que sí y el coordinador ejecuta previamente la transacción

a) El coordinador envía una solicitud de preCommit a todos los participantes y entra en la fase de preparación.

b) Después de recibir la solicitud de compromiso previo, el participante ejecuta la operación de transacción y registra la información de deshacer y rehacer en el registro de transacciones (pero no

confirmar transacción).

c) Cada participante retroalimenta un acuse de recibo o una no respuesta al coordinador, y espera la instrucción final.

Ali situación de información interna 2 : siempre que un participante responda que no, o el coordinador no pueda recibir comentarios de todos los proveedores después de esperar un tiempo de espera, se interrumpirá

asuntos

a) El coordinador envía una solicitud de cancelación a todos los participantes.

b) Independientemente de recibir una solicitud de cancelación del coordinador, o un tiempo de espera mientras espera la solicitud del coordinador, el participante abortará el evento.

servicio.

etapa tres

La transacción real que se compromete en esta etapa también se puede dividir en las dos situaciones siguientes.

Caso 1 : todos los participantes retroalimentan las respuestas y ejecutan confirmaciones de transacciones reales

a) Si el coordinador está trabajando, envíe una solicitud de compromiso a todos los participantes.

b) 参与者收到 do Commit 请求后,会正式执行事务提交,并释放整个事务期间占用的资源。

c) 各参与者向协调者反馈 ack 完成的消息。

d) 协调者收到所有参与者反馈的 ack 消息后,即完成事务提交。

情况2只要有一个参与者反馈 no,或者等待超时后协调组尚无法收到所有提供者的反馈,即回滚

事务。

a) 如果协调者处于工作状态,向所有参与者发出 rollback 请求。

b) 参与者使用阶段 1 中的 undo 信息执行回滚操作,并释放整个事务期间占用的资源。

c) 各参与者向协调组反馈 ack 完成的消息。

d) 协调组收到所有参与者反馈的 ack 消息后,即完成事务回滚。

优点:相比二阶段提交,三阶段提交降低了阻塞范围,在等待超时后协调者或参与者会中断事务。

避免了协调者单点问题。阶段 3 中协调者出现问题时,参与者会继续提交事务。

缺点:数据不一致问题依然存在,当在参与者收到 preCommit 请求后等待 do commite 指令时,

此时如果协调者请求中断事务,而协调者无法与参与者正常通信,会导致参与者继续提交事务,造

成数据不一致。

7、什么是补偿事务?

TCC (Try Confifirm Cancel)是服务化的二阶段编程模型,采用的补偿机制:

阿里内部资料TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补

偿(撤销)操作。

它分为三个步骤:

Try 阶段主要是对业务系统做检测及资源预留。

Confifirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confifirm阶段时,默

认 Confifirm阶段是不会出错的。即:只要Try成功,Confifirm一定成功。

Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。

举个例子,假入你要向 老田 转账,思路大概是:

我们有一个本地方法,里面依次调用步骤: 1、

首先在 Try 阶段,要先调用远程接口把 你 和 老田 的钱给冻结起来。 2、在 Confifirm 阶段,执行远

程调用的转账的操作,转账成功进行解冻。 3、如果第2步执行成功,那么转账成功,如果第二步执

行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。

优点:

性能提升:具体业务来实现控制资源锁的粒度变小,不会锁定整个资源。

数据最终一致性:基于 Confifirm 和 Cancel 的幂等性,保证事务最终完成确认或者取消,保证数据

的一致性。

可靠性:解决了 XA 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动

管理器也变成多点,引入集群。

缺点:TCC 的 Try、Confifirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开

发成本。

阿里内部资料8、消息队列是怎么实现的?

本地消息表(异步确保)

本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行

处理,这种思路是来源于ebay。我们可以从下面的流程图中看出其中的一些细节:

基本思路就是:

消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提

交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送

失败,会进行重试发送。

消息消费方,需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经

处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个

业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有

Lógica confiable de reposición de reconciliación de cuenta automática, esta solución sigue siendo muy práctica.

Este esquema sigue la teoría BASE y adopta la consistencia final, el autor piensa que estos esquemas son más adecuados para escenarios reales de negocios.

, es decir, no habrá una implementación compleja como 2PC (cuando la cadena de llamadas es muy larga, la disponibilidad de 2PC es muy baja), y no será como

Al igual que TCC, puede haber situaciones en las que no se pueda realizar la confirmación o la reversión.

ventaja:

Una implementación muy clásica que evita transacciones distribuidas y logra consistencia eventual. Hay soluciones listas para usar en .NET

caso.

defecto:

La tabla de mensajes estará acoplada al sistema de negocios.Si no hay una solución empaquetada, habrá muchas tareas con las que lidiar.

Mensaje de transacción de MQ

Según la información interna de Ali, algunos MQ de terceros admiten mensajes transaccionales, como RocketMQ. La forma en que admiten mensajes transaccionales también es similar a usar

El compromiso de dos fases, pero algunos MQ principales en el mercado no admiten mensajes de transacción, como RabbitMQ y Kafka.

apoyo.

Tomando el middleware RocketMQ de Ali como ejemplo, la idea es más o menos la siguiente:

En la primera etapa del mensaje Preparado, se obtendrá la dirección del mensaje. La segunda etapa ejecuta transacciones locales, y la tercera etapa pasa por la primera etapa

La dirección para acceder al mensaje y modificar el estado.

Es decir, en el método comercial, desea enviar dos solicitudes a la cola de mensajes, una para enviar un mensaje y otra para confirmar un mensaje. si mensaje de confirmación

Si el envío falla, RocketMQ escaneará periódicamente los mensajes de transacción en el grupo de mensajes.Cuando encuentre un mensaje Preparado, enviará

El remitente del mensaje confirma, por lo que el productor debe implementar una interfaz de verificación y RocketMQ determinará si se basa en la estrategia establecida por el remitente.

Ya sea para retroceder o continuar enviando mensajes de confirmación. Esto asegura que el envío del mensaje sea exitoso o falle al mismo tiempo que la transacción local.

Desafortunadamente, RocketMQ no tiene un cliente .NET. Para obtener más noticias sobre RocketMQ, puede consultar este blog

ventaja:

Logra una coherencia final sin depender de las transacciones de la base de datos local.

defecto:

Es difícil de implementar, MQ convencional no lo admite, no hay un cliente .NET y algunos códigos de los mensajes de transacción de RocketMQ no son de código abierto.

9. Luego hablas del modelo de transacción de Sagas

El modo Saga es una transacción asíncrona distribuida, una transacción de consistencia eventual y una transacción flexible.Hay dos formas diferentes de implementarlo

Las dos formas más populares de implementar transacciones de saga son:

1. Evento / coreografía Coreografía : cuando no hay un coordinador central (no hay un punto único de riesgo), cada servicio genera y escucha a otros

eventos de servicio y decidir si se deben tomar medidas.

Los datos internos de Ali deben implementar el primer servicio para ejecutar una transacción y luego publicar un evento. El evento es escuchado por uno o más servicios que

el servicio ejecuta una transacción local y publica (o no publica) un nuevo evento, mientras que el último servicio ejecuta una transacción local y no publica nada

evento, significa que la transacción distribuida finaliza, o el evento que publica no es escuchado por ningún participante de Saga, lo que significa que la transacción finaliza.

Descripción del flujo de procesamiento:

El servicio de pedidos guarda el nuevo pedido, establece el estado en estado pendiente y publica un evento denominado ORDER_CREATED_EVENT

evento.

El servicio de pago escucha ORDER_CREATED_EVENT y publica el evento BILLED_ORDER_EVENT.

El servicio de inventario escucha BILLED_ORDER_EVENT, actualiza el inventario y publica ORDER_PREPARED_EVENT.

El servicio de carga escucha ORDER_PREPARED_EVENT y luego entrega el producto. Finalmente, publica

PEDIDO_ENTREGADO_EVENTO。

Finalmente, el servicio de pedidos escucha ORDER_DELIVERED_EVENT y establece el estado del pedido en concluido.

Suponga que el servicio de inventario falla durante una transacción. Para retroceder:

El servicio de inventario genera PRODUCT_OUT_OF_STOCK_EVENT

El servicio de pedidos y el servicio de pago escuchan este evento para el servicio de inventario anterior:

①Los servicios de pago serán reembolsados ​​al cliente.

② El servicio de pedidos establece el estado del pedido como fallido.

Ventajas : la orquestación de eventos es una forma natural de implementar el patrón Saga; es simple, fácil de entender y no requiere mucho esfuerzo para construir, por lo que

Todos los actores están débilmente acoplados porque no tienen un acoplamiento directo entre sí. Si su transacción involucra de 2 a 4 pasos, entonces

Puede ser muy adecuado.

2. Orquestador de comando / coordinación : El coordinador central es responsable de la toma de decisiones y la ordenación lógica de negocios de los eventos de procesamiento centralizados.

El coordinador de saga Orchestrator se comunica con cada servicio en forma de comando/respuesta, diciéndoles qué acciones deben realizar.

El servicio de pedidos guarda el estado pendiente y le pide al Coordinador de Order Saga (OSO para abreviar) que inicie la transacción del pedido.

OSO envía un comando de ejecución de pago al servicio de cobranza, y el servicio de cobranza responde con un mensaje de Pago Ejecutado.

OSO envía un comando Preparar pedido al Servicio de inventario, y el Servicio de inventario responderá con un mensaje Pedido preparado.

OSO envía un comando de entrega de pedido al servicio de carga, y el servicio de carga responderá con un mensaje de Pedido entregado.

El Coordinador de Saga de Pedidos OSO debe conocer de antemano el proceso requerido para ejecutar la transacción "Crear Pedido" (mediante la lectura del XML de configuración del proceso de negocio BPM

conseguir). También es responsable de coordinar la retroalimentación distribuida mediante el envío de comandos a cada participante para deshacer las acciones anteriores si alguna falla.

rollo. Retroceder es mucho más fácil cuando tiene un coordinador central coordinando todo, porque el coordinador por defecto hace el flujo hacia adelante, retrocediendo

Simplemente realice el proceso inverso.

ventaja:

Evite las dependencias circulares entre servicios, porque el coordinador de la saga llamará al actor de la saga, pero el actor no llamará al coordinador.

Orquestación de transacciones distribuidas centralizadas.

Solo necesita ejecutar el comando/respuesta (de hecho, el mensaje de respuesta también es una especie de mensaje de evento), lo que reduce la complejidad de los participantes.

La complejidad de las transacciones permanece lineal a medida que se agregan nuevos pasos y las reversiones son más fáciles de administrar.

Ali información interna Si desea cambiar el objeto de destino de la segunda transacción antes de que se haya ejecutado la primera transacción, puede suspenderlo fácilmente en la coordinación

en el servidor hasta el final de la primera transacción.

10. ¿Cuántos esquemas existen para la generación distribuida de ID ?

Características de la identificación distribuida

Exclusividad: asegúrese de que el ID generado sea único en toda la red.

Incremento ordenado: asegúrese de que el ID generado se incremente secuencialmente en un número determinado para un determinado usuario o empresa.

Alta disponibilidad: asegúrese de que las identificaciones se puedan generar correctamente en cualquier momento.

Con hora: El ID contiene la hora, y puedes saber en qué día es la transacción de un vistazo.

Esquema de generación de ID distribuida

1. UUID

La idea central del algoritmo es combinar la tarjeta de red de la máquina, la hora local y un número aleatorio para generar un UUID.

Ventajas: generación local, generación simple, buen rendimiento, sin riesgo de alta disponibilidad

Desventajas: demasiado largo, almacenamiento redundante, desordenado e ilegible, baja eficiencia de consulta

2. ID de incremento automático de la base de datos

Utilice la estrategia de incremento automático de id de la base de datos, como auto_increment de MySQL. Y puede usar dos bases de datos para establecer diferentes

Tamaño de paso, una estrategia para generar ID únicos para lograr una alta disponibilidad.

Ventajas: Los ID generados por la base de datos están absolutamente ordenados y la implementación de alta disponibilidad es simple

Desventajas: se requiere una implementación independiente de las instancias de la base de datos, lo cual es costoso y tiene cuellos de botella en el rendimiento.

3. Genera ID en lotes

Los datos internos de Ali generan múltiples ID en lotes a pedido a la vez. Cada generación necesita acceder a la base de datos, modificar la base de datos al valor de ID más grande y almacenar las ID en la memoria.

Registre el valor actual y el valor máximo.

Ventajas: Evite acceder a la base de datos cada vez que se genera una identificación y ejerza presión, mejore el rendimiento

Desventajas: Pertenece a la estrategia de generación local, existe un único punto de falla, y el ID no es continuo por reinicio del servicio

4. Redis genera ID

Todas las operaciones de comandos de Redis son de subproceso único y proporciona comandos atómicos de incremento automático, como incr e increby, por lo que se puede garantizar

El ID generado por el certificado debe ser único y ordenado.

Ventajas: no depende de la base de datos, es flexible y conveniente, y el rendimiento es mejor que el de la base de datos; la identificación digital se ordena naturalmente y es adecuada para la paginación o necesita ser ordenada

Los resultados de la secuencia son muy útiles.

Desventajas: si no hay Redis en el sistema, se deben introducir nuevos componentes para aumentar la complejidad del sistema; se requiere trabajo de codificación y configuración

La cantidad es relativamente grande.

Teniendo en cuenta el cuello de botella de rendimiento de un solo nodo, se puede usar un clúster de Redis para obtener un mayor rendimiento. Si hay 5 máquinas en un clúster

Redis. Los valores que se pueden inicializar para cada Redis son 1, 2, 3, 4, 5 respectivamente, y luego el tamaño del paso es 5.

5. Twittersnowflflake算法重点

Twitter 利用 zookeeper 实现了一个全局ID生成的服务 Snowflflake

如上图的所示,Twitter 的 Snowflflake 算法由下面几部分组成:

1位符号位:

由于 long 类型在 java 中带符号的,最高位为符号位,正数为 0,负数为 1,且实际系统中所使用

的ID一般都是正数,所以最高位为 0。

41位时间戳(毫秒级):

需要注意的是此处的 41 位时间戳并非存储当前时间的时间戳,而是存储时间戳的差值(当前时间

戳 - 起始时间戳),这里的起始时间戳一般是ID生成器开始使用的时间戳,由程序来指定,所以41

位毫秒时间戳最多可以使用 (1 << 41) / (1000x60x60x24x365) = 69年 。

10位数据机器位:

阿里内部资料包括5位数据标识位和5位机器标识位,这10位决定了分布式系统中最多可以部署 1 << 10 = 1024

s个节点。超过这个数量,生成的ID就有可能会冲突。

12位毫秒内的序列:

这 12 位计数支持每个节点每毫秒(同一台机器,同一时刻)最多生成 1 << 12 = 4096个ID

加起来刚好64位,为一个Long型。

优点:高性能,低延迟,按时间有序,一般不会造成ID碰撞

缺点:需要独立的开发和部署,依赖于机器的时钟

6. 百度UidGenerator

UidGenerator es el generador de ID distribuido de código abierto de Baidu, basado en la implementación del algoritmo de copo de nieve, parece estar bien. No

Sin embargo, la mantenibilidad de los proyectos domésticos de código abierto es realmente preocupante.

7. Hoja de Meituán

Leaf es un generador de ID distribuido de código abierto de Meituan, que puede garantizar la unicidad global, la tendencia creciente, el aumento monótono y la seguridad de la información.

Se menciona la comparación de varios esquemas distribuidos, pero también se requiere middleware como bases de datos relacionales y Zookeeper.

11. ¿Qué son las soluciones idempotentes?

¿Qué es idempotente?

Descripción común: se debe devolver el mismo resultado para la misma solicitud, por lo que la interfaz de clase de consulta es una interfaz idempotente natural.

La respuesta real: la idempotencia se refiere a los efectos secundarios causados ​​por la misma solicitud (solicitud idéntica) que se ejecuta una o más veces.

Es lo mismo con (efectos secundarios).

¿Qué es idempotente?

El front-end llama a la interfaz de back-end para iniciar un tiempo de espera de pago y luego inicia un reintento nuevamente. Puede resultar en múltiples pagos.

También hay un mecanismo de reintento en Dubbo.

Múltiples clics en la página.

Lo que queremos es: la idempotencia de la interfaz es en realidad que la interfaz se puede llamar repetidamente. En el caso de múltiples llamadas por parte de la persona que llama, la interfaz eventualmente

Los resultados obtenidos son consistentes.

solución

Al insertar datos, inserte la tabla de deduplicación y use la función de índice único de la base de datos para garantizar una lógica única.

Bloqueo pesimista, seleccionar para actualizar, bloquea el registro correspondiente a la orden durante todo el proceso de ejecución. Nota: este tipo de lectura en DB es mayor que escribir

Use lo menos posible.

Los datos internos de Ali se consultan primero y luego los datos se modifican. Para admitir la idempotencia y la ejecución repetida para sistemas en segundo plano con baja concurrencia, o algunos trabajos de tareas, es fácil

El método de procesamiento único consiste en consultar primero algunos datos clave, juzgar si se ha ejecutado y realizar el procesamiento comercial. Nota

Nota: No utilice este método para procesos centrales de alta simultaneidad.

La máquina de estados es idempotente, cuando se diseñen negocios relacionados con documentos o negocios relacionados con tareas, definitivamente estará involucrada la máquina de estados, es decir, el orden de negocios.

De acuerdo con el estado anterior, el estado cambiará bajo diferentes circunstancias. Generalmente, hay una máquina de estados finitos. En este momento, si el estado

La máquina de estados ya está en el siguiente estado, en este momento hay un cambio al estado anterior, que teóricamente no se puede cambiar.

Entonces, se garantiza la idempotencia de la máquina de estados finitos.

Mecanismo de token para evitar el envío repetido de páginas:

Entorno de clúster: use token más redis (redis es de un solo subproceso, el procesamiento debe ponerse en cola) o

Entorno JVM único: use token más redis o token más memoria jvm

Antes de enviar los datos, debe solicitar un token del servicio, colocar el token en la memoria redis o jvm, establecer la hora válida del token y enviarlo en segundo plano.

Verifique el token, elimine el token al mismo tiempo, genere un nuevo token y regrese. Características del token: para aplicar, se puede usar una validez única y un límite actual.

Identificación única global: si usa una identificación única global, es para generar una identificación global basada en la operación y el contenido del negocio.

Según si existe el ID único global, se juzga si la operación se ha ejecutado. Si no existe, almacene la identificación global en el almacenamiento

Sistemas de almacenamiento, como bases de datos, redis, etc. Si existe, significa que el método ha sido ejecutado.

12. ¿Cuáles son los algoritmos comunes de equilibrio de carga?

13. ¿Qué algoritmos de limitación de corriente conoce?

Hay cuatro algoritmos comunes para los algoritmos de limitación de corriente:

Algoritmo de contador (ventana fija)

ventana deslizante

Algoritmo de cubeta con fugas

algoritmo de cubeta de fichas

Información interna de Ali 14. Hable sobre qué es el algoritmo de contador (ventana fija)

El algoritmo de contador es utilizar el contador para acumular el número de visitas en un período, y cuando se alcanza el valor límite actual establecido, se activa la estrategia de límite actual. Próximo

Al comienzo del ciclo, se borra y se vuelve a contar.

Este algoritmo es muy simple de implementar en un entorno independiente o distribuido, y es fácil de usar el autoincremento atómico incr y la seguridad de subprocesos de redis

lograr.

Este algoritmo generalmente se usa para la limitación actual de QPS y las estadísticas de visitas totales. Para el período de tiempo por encima del segundo nivel, habrá un problema muy grave.

El problema es el problema crítico, como se muestra en la siguiente figura:

Suponga que la capacidad de carga del servidor en 1 minuto es 100, por lo que el número de visitas en un ciclo está limitado a 100, pero al final del primer ciclo

En los últimos 5 segundos y los primeros 5 segundos del ciclo siguiente se vertieron 100 visitas, aunque no se superó el límite de cada ciclo

Sin embargo, el número total de visitas en 10 segundos ha llegado a 200, lo que ha superado con creces la capacidad de carga del servidor. Se puede ver que el contador cuenta

El método de limitación de corriente tiene grandes desventajas para la limitación de corriente con un ciclo relativamente largo.

15. Habla sobre qué es el algoritmo de ventana deslizante

滑动窗口算法是将时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动

删除过期的小周期。

如下图,假设时间周期为1min,将1min再分为2个小周期,统计每个小周期的访问数量,则可以看

到,第一个时间周期内,访问数量为75,第二个时间周期内,访问数量为100,超过100的访问则

被限流掉了

阿里内部资料由此可见,当滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精

确。

此算法可以很好的解决固定窗口算法的临界问题。

16、说说什么是漏桶算法

漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发

限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。

阿里内部资料17、说说什么是令牌桶算法

令牌桶算法是程序以r(r=时间周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到

达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略

阿里内部资料18、数据库如何处理海量数据?

对数据库进行:分库分表,主从架构,读写分离。

水平分库/分表,垂直分库/分表。

水平分库/表,各个库和表的结构一模一样。

垂直分库/表,各个库和表的结构不一样。

读写分离:主机负责写,从机负责读。

19、如何将长链接转换成短链接,并发送短信?

短 URL 从生成到使用分为以下几步:

有一个服务,将要发送给你的长 URL 对应到一个短 URL 上.例如 www.baidu.com -> www.t.cn/

1。

把短 url 拼接到短信等的内容上发送。

用户点击短 URL ,浏览器用 301 / 302 进行重定向,访问到对应的长 URL。

展示对应的内容。

Ali información interna 20 , ¿cómo convertir enlaces largos y enlaces cortos entre sí?

La idea es construir un generador de señales. Cada vez que entra una nueva URL larga, incrementamos en uno. Y devolver el nuevo valor Primero

La primera URL devuelve "www.x.cn/0" y la segunda devuelve "www.x.cn/1".

21. ¿Cómo almacenar la relación correspondiente entre enlace largo y enlace corto?

Si la cantidad de datos es pequeña y el QPS es bajo, se puede realizar utilizando directamente la clave principal de incremento automático de la base de datos. También puede cerrar la contraparte más reciente/más popular de

El sistema se almacena en la base de datos KV, lo que puede ahorrar espacio y acelerar la respuesta.

22. ¿Cómo mejorar la capacidad concurrente del sistema?

Utilizar sistemas distribuidos.

Implemente varios servidores y realice el equilibrio de carga.

Use un clúster de caché (Redis).

Base de datos subtabla de base de datos + separación de lectura y escritura.

Introducir el clúster de middleware de mensajes.

artículos de internet

1. ¿ Qué son los códigos de respuesta HTTP ? ¿Qué representan?

200: Éxito, el servidor web ha procesado correctamente la solicitud del cliente.

301: Redirección permanente, cuando el cliente solicita una URL, el servidor web redirigirá la solicitud actual a otra

URL, el motor de búsqueda rastreará el contenido de la página web redirigida y reemplazará la URL anterior con la URL redirigida.

302: Redirección temporal, el motor de búsqueda rastreará el contenido de la página web redirigida y conservará la URL anterior, porque el motor de búsqueda piensa

La URL redirigida es temporal.

400: la solicitud del cliente es incorrecta, principalmente porque los parámetros no son válidos y el servidor web no puede verificar los parámetros.

404: No encontrado, el servidor web no puede encontrar el recurso.

500: error del servidor web, se produjo un error cuando el servidor procesó la solicitud del cliente.

503: El servicio no está disponible y el servidor está caído.

504: tiempo de espera de puerta de enlace.

2. ¿Cuál es la diferencia entre Reenviar y Redireccionar ?

浏览器 URL 地址:Forward 是服务器内部的重定向,服务器内部请求某个 servlet,然后获取

响应的内容,浏览器的 URL 地址是不会变化的;Redirect 是客户端请求服务器,然后服务器给

客户端返回了一个 302 状态码和新的 location,客户端重新发起 HTTP 请求,服务器给客户端

响应 location 对应的 URL 地址,浏览器的 URL 地址发生了变化。

阿里内部资料数据的共享:Forward 是服务器内部的重定向,request 在整个重定向过程中是不变的,

request 中的信息在 servlet 间是共享的。Redirect 发起了两次 HTTP 请求分别使用不同的

request。

请求的次数:Forward 只有一次请求;Redirect 有两次请求。

3 Get Post 请求有哪些区别?

用途:

get 请求用来从服务器获取资源

post 请求用来向服务器提交数据

表单的提交方式:

get 请求直接将表单数据以 name1=value1&name2=value2 的形式拼接到 URL 上(http://www.

baidu.com/action?name1=value1&name2=value2),多个参数参数值需要用 & 连接起来并

且用 ? 拼接到 action 后面;

post 请求将表单数据放到请求头或者请求的消息体中。

传输数据的大小限制:

get 请求传输的数据受到 URL 长度的限制,而 URL 长度是由浏览器决定的;

post 请求传输数据的大小理论上来说是没有限制的。

参数的编码:

get 请求的参数会在地址栏明文显示,使用 URL 编码的文本格式传递参数;

post 请求使用二进制数据多重编码传递参数。

缓存:

get 请求可以被浏览器缓存被收藏为标签;

post 请求不会被缓存也不能被收藏为标签。

4. Hablar sobre la diferencia entre TCP y UDP , así como sus respectivas ventajas y desventajas

1. TCP está orientado a la conexión (por ejemplo, debe marcar para establecer una conexión antes de realizar una llamada): UDP no tiene conexión, es decir, no es necesario establecer una conexión antes de enviar datos.

atrapar.

2. TCP brinda servicios confiables. Es decir, los datos transmitidos a través de la conexión TCP están libres de errores, no se pierden, no se repiten y en orden

Llegada; UDP entrega en base al mejor esfuerzo, es decir, no se garantiza una entrega confiable. tcp pasa la suma de verificación, el control de retransmisión, la identificación del número de serie, la ventana deslizante

Puerto, respuesta de confirmación para lograr una transmisión confiable. También se puede controlar el control de retransmisión cuando se pierde el paquete, y el control de secuencia de los subpaquetes cuyo orden está fuera de orden.

3. UDP tiene un mejor rendimiento en tiempo real y una mayor eficiencia de trabajo que TCP.Es adecuado para transmisión de alta velocidad y comunicación en tiempo real o comunicación de transmisión.

carta.

4. Cada conexión TCP solo puede ser punto a punto; UDP admite comunicaciones interactivas uno a uno, uno a muchos, muchos a uno y muchos a muchos

Ali información interna 5. TCP tiene más requisitos sobre los recursos del sistema, mientras que UDP tiene menos requisitos sobre los recursos del sistema.

5 , hable sobre la diferencia entre HTTP y HTTPS

Los puertos son diferentes: los métodos de conexión de HTTP y HTTPS son diferentes, y los puertos inútiles también son diferentes. HTTP es 80 y HTTPS usa 443

Consumo de recursos: en comparación con HTTP, la comunicación HTTPS consume más recursos de CPU y memoria debido al procesamiento de cifrado y descifrado.

Encabezado: la comunicación HTTPS requiere certificados, y dichos certificados generalmente deben ser solicitados o pagados por una autoridad de certificación.

6. ¿Cuál es la relación entre HTTP , TCP y Socket ?

TCP/IP significa Protocolo de control de transmisión/Protocolo de Internet y se refiere a una familia de protocolos.

HTTP en sí mismo es un protocolo, un protocolo de transferencia para transferir hipertexto desde un servidor web a un navegador local.

Socket 是 TCP/IP 网络的 API ,其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在

Socket 接口后面。对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指

定的协议。

综上所述:

需要 IP 协议来连接网络

TCP 是一种允许我们安全传输数据的机制,使用 TCP 协议来传输数据的 HTTP 是 Web 服务器

和客户端使用的特殊协议。

HTTP 基于 TCP 协议,所以可以使用 Socket 去建立一个 TCP 连接。

7,说一下HTTP的长连接与短连接的区别

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

短连接

在HTTP/1.0中默认使用短链接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连

接,但任务结束就中断连接。如果客户端访问的某个HTML或其他类型的Web资源,如 JavaScript

文件、图像文件、 CSS 文件等。当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话.

长连接

从HTTP/1.1起,默认使用长连接,用以保持连接特性。在使用长连接的情况下,当一个网页打开完

成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭。如果客户端再次访问这个服务

器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时

间,可以在不同的服务器软件(如Apache)中设定这个时间。

8TCP 为什么要三次握手,两次不行吗?为什么?

阿里内部资料TCP 客户端和服务端建立连接需要三次握手,首先服务端需要开启监听,等待客户端的连接请

求,这个时候服务端处于“收听”状态;

客户端向服务端发起连接,选择 seq=x 的初始序列号,此时客户端处于“同步已发送”的状态;

El servidor recibe la solicitud de conexión del cliente, acepta la conexión y envía un reconocimiento al cliente. El número de reconocimiento es ack=x+1, lo que indica que el cliente

El final puede enviar el siguiente número de secuencia del paquete de datos a partir de x + 1, y seleccionar el número de secuencia inicial de seq = y al mismo tiempo, en este momento el servidor está en

En el estado "recibido sincronizado";

Después de recibir la confirmación del servidor, el cliente envía un mensaje de confirmación al servidor. El número de confirmación es ack=y+1, lo que significa que el servidor puede enviar

El número de serie del próximo paquete de datos que se enviará comienza desde y+1, y el cliente se encuentra en el estado de "conexión establecida" en este momento;

Después de recibir la confirmación del cliente, el servidor también ingresa al estado de "conexión establecida".

A partir del proceso de protocolo de enlace de tres vías, se puede ver que si solo hay dos protocolos de enlace, se puede confirmar el número de secuencia inicial del cliente y se puede confirmar el número de secuencia inicial del servidor.

Los números de serie no serán confirmados.

9. ¿ Dígame cómo se genera el paquete adhesivo TCP ? ¿Cómo resolver el problema de la bolsa pegajosa?

Cuando se habla de la diferencia entre TCP y UDP en la información interna de Ali anterior, se menciona que TCP transmite datos basados ​​en flujos de bytes y múltiples flujos de datos desde la capa de aplicación hasta la capa de transporte TCP.

Un paquete de datos es una serie de flujos de bytes sin límites, y el encabezado TCP no registra la longitud del paquete de datos, por lo que los datos de transmisión TCP

Al enviar datos, puede haber problemas para enviar paquetes pegajosos y desempaquetar; mientras que UDP transmite datos basados ​​en datagramas, y el encabezado UDP también registra datos

De acuerdo con la longitud informada, los límites de los diferentes paquetes de datos se pueden distinguir fácilmente.

A continuación, veamos varias situaciones de transmisión de datos TCP. En primer lugar, la primera situación es normal, no se envían paquetes pegajosos ni se produce desgarro.

Bolsa.

En el segundo caso, se produce un bloqueo de paquetes obvio, que es difícil de manejar para el receptor de datos.

En los dos casos siguientes, se produjo el fenómeno de pegado y desempaquetado de paquetes, y los paquetes de datos recibidos por el extremo receptor estaban incompletos o eran extra.

bloquear.

Causas del fenómeno de pegado y desembalaje:

El espacio restante en el búfer de envío de TCP no es suficiente para enviar un paquete de datos completo y se producirá el desempaquetado;

Los datos a enviar exceden el límite de la longitud máxima del paquete y TCP se descomprime al transmitir datos;

El paquete de datos que se enviará es más pequeño que el espacio restante del búfer de envío de TCP, y TCP llena el búfer de envío con varios paquetes de datos y los envía a la vez.

Vaya, se producirá un paquete pegajoso;

Si el extremo receptor no lee los paquetes de datos en el búfer de envío TCP a tiempo, se producirán paquetes pegajosos.

La solución para pegar y desempaquetar los datos internos de Ali:

发送端给数据包添加首部,首部中添加数据包的长度属性,这样接收端通过首部中的长度字段

就可以知道数据包的实际长度啦;

针对发送的数据包小于缓冲区大小的情况,发送端可以将不同的数据包规定成同样的长度,不

足这个长度的补充 0,接收端从缓冲区读取固定的长度数据这样就可以区分不同的数据包;

发送端通过给不同的数据包添加间隔符合确定边界,接收端通过这个间隔符合就可以区分不同

的数据包。

10TCP 如何保证可靠性

序列号和确认号机制:

TCP 发送端发送数据包的时候会选择一个 seq 序列号,接收端收到数据包后会检测数据包的完整

性,如果检测通过会响应一个 ack 确认号表示收到了数据包。

超时重发机制:

TCP 发送端发送了数据包后会启动一个定时器,如果一定时间没有收到接受端的确认后,将会重新

发送该数据包。

对乱序数据包重新排序:

从 IP 网络层传输到 TCP 层的数据包可能会乱序,TCP 层会对数据包重新排序再发给应用层。

丢弃重复数据:

从 IP 网络层传输到 TCP 层的数据包可能会重复,TCP 层会丢弃重复的数据包。

流量控制:

TCP 发送端和接收端都有一个固定大小的缓冲空间,为了防止发送端发送数据的速度太快导致接收

端缓冲区溢出,发送端只能发送接收端可以接纳的数据,为了达到这种控制效果,TCP 用了流量控

制协议(可变大小的滑动窗口协议)来实现。

11OSI 的七层模型都有哪些?

OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组

织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系

统提供了一种功能结构的框架。

应用层:各种应用程序协议,比如 HTTP、HTTPS、FTP、SOCKS 安全套接字协议、DNS 域名

sistema, GDP Gateway Discovery Protocol, y más.

Capa de presentación: cifrado y descifrado, conversión y traducción, compresión y descompresión, como el protocolo ligero de presentación LPP.

Capa de sesión: los usuarios en diferentes máquinas establecen y administran sesiones, como el protocolo de capa de conexión segura SSL, el protocolo de seguridad de la capa de transporte TLS

protocolo, protocolo de llamada a procedimiento remoto RPC y más.

Capa de transmisión de datos interna de Alibaba: acepta datos de la capa superior, divide los datos cuando es necesario y entrega los datos a la capa de red para garantizar

Estos segmentos de datos llegan efectivamente al par, como el Protocolo de control de transmisión TCP, el Protocolo de datagramas UDP.

Capa de red: Controla el funcionamiento de la subred: direccionamiento lógico, transmisión de paquetes, selección de enrutamiento, como IP, IPV6, SLIP, etc.

Capa de enlace de datos: direccionamiento físico, mientras se convierte el flujo de bits original en una ruta de transmisión lógica, como el protocolo de transmisión de compresión XTP,

Protocolo de tunelización punto a punto PPTP y más.

Capa física: transmisión de flujo de bits sin procesar en canales de comunicación de interfaz de temporización mecánicos, electrónicos, como IEEE802.2, etc.

Ali información interna 12 , ¿qué sucedió después de ingresar " www.woaijava.com " en el navegador ?

por favor elabora

El proceso de encontrar la dirección IP desde el nombre de dominio → dirección IP ha pasado sucesivamente a través de la memoria caché del navegador, la memoria caché del sistema, el archivo de hosts, la memoria caché del enrutador, etc.

Almacenar y buscar recursivamente en el servidor de nombres de dominio raíz.

Establecer una conexión TCP/IP (proceso específico de protocolo de enlace de tres vías)

El navegador envía una solicitud HTTP

Después de ser reenviada por el enrutador y pasar por el firewall del servidor, la solicitud HTTP llega al servidor

El servidor procesa la solicitud HTTP y devuelve un archivo HTML

El navegador analiza el archivo HTML y lo muestra en el lado del navegador

Nota aquí:

El protocolo HTTP es un protocolo de capa de aplicación basado en TCP/IP, y primero se debe establecer una conexión TCP/IP para las solicitudes de datos HTTP.

Puede entenderse de esta manera: HTTP es un automóvil, que proporciona una forma específica de encapsulación o visualización de datos; Socket es un motor, que proporciona

La capacidad de comunicarse a través de la red.

La comunicación entre dos computadoras no es más que la comunicación de datos entre dos puertos. La forma en que se mostrarán los datos específicos depende del

Se definen diferentes protocolos de capa de aplicación.

13. ¿Cómo lograr el dominio cruzado?

Cuando el navegador ejecuta el script JS, detectará si el protocolo, el nombre de dominio y el número de puerto al que accede el script son consistentes con la URL actual, como

Si es inconsistente, es entre dominios. No se permiten dominios cruzados. Esta restricción se denomina política del mismo origen del navegador. En términos simples, el navegador

No permita que los scripts cargados en un origen interactúen con recursos en otros orígenes. Entonces, ¿cómo lograr un dominio cruzado?

JSONP, CORS, proxy

1 método JSONP

Script, img, iframe, enlace, video, audio y otras etiquetas con atributos src pueden solicitar y ejecutar recursos en todos los dominios,

JSONP aprovecha esta "laguna" para lograr el dominio cruzado.

Mira la forma en que se escribe jQuery.

<script>

var scriptTag = document.createElement('script');

scriptTag.tipo = "texto/javascript";

scriptTag.src = "http://10.10.0.101:8899/jsonp?callback=f";

documento.head.appendChild(scriptTag);

</script>

$.ajax({

// solicitar nombre de dominio

URL: 'http://10.10.0.101:8899/iniciar sesión',

El JSONP de datos internos de Ali es muy simple de implementar entre dominios, pero solo admite la solicitud GET. Y después de recibir la solicitud JSONP en el lado del servidor, debe configurar

Agregue el atributo Access-Control-Allow-Origin al encabezado de la solicitud y el valor del atributo es *, lo que significa que todos los nombres de dominio pueden acceder.

El navegador analizará normalmente; de ​​lo contrario, se informará un error 406.

Método 2 CORS

CORS (Cross-Origin Resource Sharing) es el intercambio de recursos de origen cruzado, que debe ser compatible tanto con el navegador como con el servidor.

El método de solicitud se divide en solicitud simple y solicitud no simple.

当浏览器发出的 XMLHttpRequest 请求的请求方式是 POST 或者 GET,请求头中只包含 Accept、

Accept-Language、Content-Language、Last-Event-ID、Content-Type(application/x-www

form-urlencoded、multipart/form-data、text/plain)时那么这个请求就是一个简单请求。

对于简单的请求,浏览器会在请求头中添加 Origin 属性,标明本次请求来自哪个源(协议 + 域名 +

端口)。

GET

// 标明本次请求来自哪个源(协议+域名+端口)

Origin: http://127.0.0.1:8080

// IP

Host: 127.0.0.1:8080

// 长连接

Connection: keep-alive

Content-Type: text/plain

如果 Origin 标明的域名在服务器许可范围内,那么服务器就会给出响应:

// 请求方式

type:'GET',

// 数据类型选择 jsonp

dataType:'jsonp',

// 回调方法名

jsonpCallback:'callback',

});

// 回调方法

function callback(response) {

console.log(response);

}

response.setHeader("Access-Control-Allow-Origin", "*");

阿里内部资料 // 该值上文提到过,表示允许浏览器指定的域名访问,要么为浏览器传入的 origin,要么为 * 表示

所有域名都可以访问

Access-Control-Allow-Origin: http://127.0.0.1:8080

// 表示服务器是否同意浏览器发送 cookie

Access-Control-Allow-Credentials: true

// Especifique los campos que se pueden obtener con el método XMLHttpRequest#getResponseHeader()

Acceso-Control-Exposición-Encabezados: xxx

Tipo de contenido: texto/html; conjunto de caracteres = utf-8

Access-Control-Allow-Credentials: verdadero significa que el servidor acepta que el navegador envíe cookies, y el navegador también necesita

La configuración admite el envío de cookies, de lo contrario, incluso si el servidor admite el navegador, no se enviará.

La otra es una solicitud no simple, el método de solicitud es PUT o DELETE, o el contenido se agrega al encabezado de la solicitud.

Tipo: aplicación/json Solicitud de atributos y valores de atributos.

Este tipo de solicitud enviará una solicitud HTTP de verificación previa antes de que el navegador envíe oficialmente la solicitud XMLHttpRequest, preguntando al servidor cuándo

Si el nombre de dominio de la página web anterior está en la lista de permisos del servidor, la solicitud de comunicación se enviará formalmente solo después de la confirmación del servidor.

Información del encabezado de la solicitud de verificación previa:

// El método de solicitud de la solicitud de verificación previa es OPCIONES

OPCIONES

// Indique de qué fuente proviene esta solicitud (protocolo + nombre de dominio + puerto)

Origen: http://127.0.0.1:8080

// Indicar el método de solicitud que se utilizará para la próxima solicitud de CORS

Método de solicitud de control de acceso: PUT

// Indicar los atributos de información del encabezado que se enviarán en la próxima solicitud de CORS

Access-Control-Request-Headers: X-Custom-Header

// PI

Anfitrión: 127.0.0.1:8080

// Conexión larga

Conexión: mantener vivo

Si el servidor responde a la solicitud de verificación previa sin ninguna información de encabezado relacionada con CORS, significa que no se admiten dominios cruzados.

Se realizará una respuesta entre dominios y la información del encabezado de la respuesta es la siguiente:

HTTP/1.1 200 Aceptar

// Este valor se menciona anteriormente, lo que significa que el nombre de dominio especificado por el navegador puede acceder, ya sea el origen pasado por el navegador, o * significa todo

var xhr = nuevo XMLHttpRequest();

// Establecer si enviar la solicitud con una cookie

xhr.withCredentials = verdadero;

xhr.open('publicar', 'http://10.10.0.101:8899/login', verdadero);

xhr.setRequestHeader('Content-Type', 'text/plain');

Se puede acceder a la información interna de Ali con un nombre de dominio

Acceso-Control-Permitir-Origen:http://127.0.0.1:8080

// Todos los métodos de solicitud entre dominios admitidos por el servidor, para evitar que el navegador inicie varias solicitudes de verificación previa, devuelva todos los métodos de solicitud al navegador

Métodos de permiso de control de acceso: GET, POST, PUT

// El servidor admite el valor del atributo Access-Control-Request-Headers en la información del encabezado de la solicitud de verificación previa

Acceso-Control-Permitir-Encabezados: X-Encabezado personalizado

// El servidor acepta que el navegador envíe cookies

Acceso-Control-Permitir-Credenciales: verdadero

// Especifica que el período de validez de la solicitud de verificación previa es de 20 días, durante los cuales no es necesario enviar otra solicitud de verificación previa nuevamente

Control de acceso-Edad máxima: 1728000

Tipo de contenido: texto/html; conjunto de caracteres = utf-8

Keep-Alive: tiempo de espera = 2, máximo = 100

// Conexión larga

Conexión: Keep-Alive

Tipo de contenido: texto/simple

Luego, el navegador enviará una solicitud CORS como una solicitud simple, el encabezado de la solicitud debe contener el atributo Origen y la respuesta del servidor

El atributo Access-Control-Allow-Origin también debe incluirse en el encabezado de respuesta.

3 métodos proxy

La restricción entre dominios se debe a la política del mismo origen del navegador. No es necesario utilizar nginx como servidor para acceder a la interfaz HTTP de otros servicios.

La ejecución de scripts JS no tiene las mismas restricciones de política de origen, por lo que puede usar Nginx para crear un servidor proxy, el servidor proxy

El nombre de dominio es el mismo que el nombre de dominio al que accederá el navegador, y luego, a través de este servidor proxy, modifique el nombre de dominio en la cookie al HTTP para acceder

El nombre de dominio de la interfaz, a través del proxy inverso para lograr el dominio cruzado.

Información de configuración de Nginx:

servidor {

# El puerto del servidor proxy

escuchar 88;

# El nombre de dominio del servidor proxy

nombre_servidor http://127.0.0.1;

ubicación / {

# El nombre de dominio + puerto del servidor proxy inverso

contraseña_proxy http://127.0.0.2:89;

# Modificar el nombre de dominio en la cookie

dominio_cookie_proxy http://127.0.0.2 http://127.0.0.1;

índice índice.html índice.htm;

# Configure el servidor proxy actual para permitir navegadores entre dominios

add_header Acceso-Control-Permitir-Origin http://127.0.0.1;

# Configure el servidor proxy actual para permitir que el navegador envíe cookies

add_header Access-Control-Allow-Credentials verdadero;

Código de front-end de datos internos de Ali:

14. ¿Por qué TCP necesita darse la mano tres veces? ¿No se puede hacer dos veces? ¿Por qué?

Se requiere un protocolo de enlace de tres vías para establecer una conexión entre el cliente CP y el servidor Primero, el servidor debe habilitar el monitoreo y esperar la solicitud de conexión del cliente.

En este momento, el servidor está en estado de "escucha";

El cliente inicia una conexión con el servidor, selecciona el número de secuencia inicial de seq=x, y el cliente se encuentra en el estado de "sincronización enviada";

El servidor recibe la solicitud de conexión del cliente, acepta la conexión y envía un reconocimiento al cliente. El número de reconocimiento es ack=x+1, lo que indica que el cliente

El final puede enviar el siguiente número de secuencia del paquete de datos a partir de x + 1, y seleccionar el número de secuencia inicial de seq = y al mismo tiempo, en este momento el servidor está en

En el estado "recibido sincronizado";

Después de recibir la confirmación del servidor, el cliente envía un mensaje de confirmación al servidor. El número de confirmación es ack=y+1, lo que significa que el servidor puede enviar

送下一个数据包序号从 y+1 开始,此时客户端处于“已建立连接”的状态;

服务端收到客户端的确认后,也进入“已建立连接”的状态。

从三次握手的过程可以看出如果只有两次握手,那么客户端的起始序列号可以确认,服务端的起始

序列号将得不到确认。

}

}

var xhr = new XMLHttpRequest();

// 设置浏览器允许发送 cookie

xhr.withCredentials = true;

// 访问 nginx 代理服务器

xhr.open('get', 'http://127.0.0.1:88', true);

xhr.send();

阿里内部资料15,说一下 TCP 粘包是怎么产生的?怎么解决粘包问题的?

上文中讲 TCP 和 UDP 区别的时候提到 TCP 传输数据基于字节流,从应用层到 TCP 传输层的多个数

据包是一连串的字节流是没有边界的,而且 TCP 首部并没有记录数据包的长度,所以 TCP 传输数

据的时候可能会发送粘包和拆包的问题;而 UDP 是基于数据报传输数据的,UDP 首部也记录了数

据报的长度,可以轻易的区分出不同的数据包的边界。

阿里内部资料造成粘包和拆包现象的原因:

TCP 发送缓冲区剩余空间不足以发送一个完整的数据包,将发生拆包;

要发送的数据超过了最大报文长度的限制,TCP 传输数据时进行拆包;

要发送的数据包小于 TCP 发送缓冲区剩余空间,TCP 将多个数据包写满发送缓冲区一次发送出

去,将发生粘包;

接收端没有及时读取 TCP 发送缓冲区中的数据包,将会发生粘包。

粘包拆包的解决方法:

发送端给数据包添加首部,首部中添加数据包的长度属性,这样接收端通过首部中的长度字段

就可以知道数据包的实际长度啦;

针对发送的数据包小于缓冲区大小的情况,发送端可以将不同的数据包规定成同样的长度,不

Suplemento 0 de esta longitud, el extremo receptor lee datos de longitud fija del búfer para que se puedan distinguir diferentes paquetes de datos;

El remitente puede determinar los límites agregando intervalos a diferentes paquetes de datos y el receptor puede distinguir entre diferentes paquetes de datos haciendo coincidir los intervalos.

paquetes de datos

Ali información interna 16 , la relación y diferencia entre HTTP1.0 , HTTP1.1 y HTTP2.0

uno, contraste

2.HTTP1.0 : _

Cada solicitud del navegador debe establecer una conexión TCP con el servidor, y el servidor desconecta la conexión TCP inmediatamente después de que se completa el procesamiento (sin conexión).

conexión), el servidor no realiza un seguimiento de cada cliente y no registra las solicitudes anteriores (sin estado).

3.HTTP1.1 : _

Conexión: cerrar se usa de forma predeterminada en HTTP/1.0. Conexión: Keep-alive se ha utilizado por defecto en HTTP/1.1, evitando

Se evita la sobrecarga del establecimiento y liberación de la conexión, pero el servidor debe devolver los resultados correspondientes en el orden de las solicitudes del cliente para garantizar

El cliente de autenticación puede distinguir el contenido de la respuesta de cada solicitud. Utilice el campo Longitud del contenido para determinar si los datos solicitados actualmente tienen

Aceptado en su totalidad. No se permiten dos respuestas paralelas al mismo tiempo.

4.HTTP2.0 : _

HTTP/2 introduce los conceptos de flujos y marcos de datos binarios, en los que los marcos identifican los datos secuencialmente, como se muestra en la figura a continuación, para que el navegador reciba

Después de recopilar los datos, los datos se pueden fusionar de acuerdo con la secuencia sin la confusión de los datos fusionados. También por

Secuencia, el servidor puede transmitir datos en paralelo, que es lo que hacen los flujos.

arroyo

Una serie completa de marcos de datos correspondientes al mensaje de flujo de bytes bidireccional en la conexión establecida y el marco de mensaje lógico HTTP2.0

La unidad de comunicación más pequeña, cada cuadro contiene un encabezado de cuadro y al menos identifica el flujo (ID de flujo) al que pertenece el marco actual. multiplexación

usar:

1. Toda la comunicación HTTP2.0 se completa en una conexión TCP, que puede transportar cualquier cantidad de flujos de datos bidireccionales.

2. Cada flujo de datos se envía en forma de mensaje, y un mensaje consta de uno o más marcos. Estos marcos se pueden enviar fuera de orden y luego de acuerdo con el

El identificador de flujo (ID de flujo) en cada encabezado de cuadro se vuelve a ensamblar.

Los datos internos de Ali dan un ejemplo, cada solicitud es un flujo de datos, el flujo de datos se envía en forma de mensaje, y el mensaje se divide en varios marcos, y el encabezado del marco registra

La identificación del flujo se usa para identificar el flujo de datos al que pertenece, y los marcos de diferentes atributos se pueden mezclar aleatoriamente en la conexión. El destinatario puede utilizar el

La identificación de flujo atribuye los marcos a diferentes solicitudes.

3. Además, la multiplexación (conexión compartida) puede causar el bloqueo de solicitudes críticas. Cada flujo de datos en HTTP2.0 se puede optimizar

Prioridad y dependencia, el flujo de datos con alta prioridad será procesado primero por el servidor y devuelto al cliente, y el flujo de datos también puede depender de otros sub-

flujo de datos.

4. Se puede ver que HTTP2.0 realiza una verdadera transmisión paralela, que puede realizar cualquier cantidad de solicitudes HTTP en un TCP. y esto

La poderosa función se basa en la función de "encuadre binario".

compresión de la cabeza

En HTTP1.x, los metadatos del encabezado se envían en texto sin formato, lo que generalmente agrega de 500 a 800 bytes de carga útil a cada solicitud.

carga.

HTTP2.0 utiliza codificadores para reducir el tamaño de los encabezados que deben transmitirse, y cada una de las partes de la comunicación almacena en caché una tabla de campos de encabezado.

No solo evita la transmisión de encabezados repetidos, sino que también reduce el tamaño que debe transmitirse. El algoritmo de compresión eficiente puede comprimir en gran medida

encabezado, reduciendo la cantidad de paquetes enviados para reducir la latencia.

Empuje del servidor:

Además de la respuesta del servidor a la solicitud inicial, el servidor también puede enviar recursos adicionales al cliente sin la solicitud explícita del cliente.

mendigar.

17 , hable sobre la relación entre el protocolo HTTP y el protocolo TCP/IP

La conexión larga y la conexión corta de HTTP son esencialmente la conexión larga y la conexión corta de TCP.

HTTP pertenece al protocolo de la capa de aplicación, usa el protocolo TCP en la capa de transporte y usa el protocolo IP en la capa de red.

El protocolo IP resuelve principalmente el problema del enrutamiento y direccionamiento de la red.

El protocolo TCP resuelve principalmente cómo transmitir paquetes de datos de manera confiable por encima de la capa IP, de modo que el extremo receptor de la red pueda recibir todos los datos enviados por el extremo emisor.

paquetes en el mismo orden en que fueron enviados. El protocolo TCP es fiable y está orientado a la conexión.

18. ¿Cómo entender que el protocolo HTTP no tiene estado?

El protocolo HTTP no tiene estado, lo que significa que el protocolo no tiene capacidad de memoria para el procesamiento de transacciones y el servidor no conoce el estado del cliente.

Es decir, no hay conexión entre abrir una página web en un servidor y la última vez que se abrió la página web en este servidor. HTTP es

Un protocolo orientado a la conexión sin estado, sin estado no significa que HTTP no pueda mantener conexiones TCP, y mucho menos que HTTP use

Protocolo UDP (sin conexión).

19. ¿Qué son las conexiones largas y cortas?

Los datos internos de Alibaba usan conexiones cortas por defecto en HTTP/1.0. En otras palabras, cada vez que el cliente y el servidor realizan una operación HTTP, se establece una conexión.

Luego, la conexión terminará cuando se complete la tarea. Cuando un HTML u otro tipo de página web a la que accede un navegador cliente contiene otros

Recursos web (como archivos JavaScript, archivos de imagen, archivos CSS, etc.), siempre que se encuentre un recurso web de este tipo, el navegador volverá a cargar el

Cree una nueva sesión HTTP.

Desde HTTP/1.1, las conexiones largas se utilizan de forma predeterminada para mantener las características de la conexión. Usando el protocolo HTTP de conexión larga, se agregará al encabezado de respuesta

Ingrese esta línea de código:

Conexión: mantener vivo

En el caso de usar una conexión larga, cuando se abre una página web, la conexión TCP se usa para transmitir datos HTTP entre el cliente y el servidor

La conexión no se cerrará, y cuando el cliente acceda de nuevo al servidor, seguirá utilizando la conexión establecida. Keep-Alive no

Para mantener la conexión de forma permanente, tiene un tiempo de mantenimiento, que se puede configurar en diferentes software de servidor (como Apache). lograr

Las conexiones largas requieren que tanto el cliente como el servidor admitan conexiones largas.

La conexión larga y la conexión corta del protocolo HTTP son esencialmente la conexión larga y la conexión corta del protocolo TCP.

20. ¿Cuáles son las ventajas y desventajas de la conexión larga y la conexión corta?

La conexión larga puede ahorrar más operaciones de establecimiento y cierre de TCP, reducir el desperdicio y ahorrar tiempo. Para clientes que solicitan recursos con frecuencia

En otras palabras, es más adecuado para conexiones largas. Pero hay un problema aquí, el período de detección de la función de supervivencia es demasiado largo y solo detecta TCP

连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场

景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的

话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需

要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致

server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接

数,这样可以完全避免某个蛋疼的客户端连累后端服务。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如

果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

21,说说长连接短连接的操作过程

短连接的操作步骤是:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连

接长连接的操作步骤是:建立连接——数据传输...(保持连接)...数据传输——关闭连接

22,说说TCP三次握手和四次挥手的全过程

三次握手

阿里内部资料第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二

次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包

(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的

SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入

ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端

与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关

闭连接之前,TCP 连接都将被一直保持下去。

四次挥手

Similar al "apretón de manos de tres vías" para establecer una conexión, se requiere un "apretón de manos de cuatro vías" para desconectar una conexión TCP. Primera ola: envío activo de grupo cercano

Se utiliza un FIN para cerrar la transmisión de datos de la parte activa a la parte de cierre pasiva, es decir, la parte de cierre activa le dice a la parte de cierre pasiva: Ya no soy

Le enviaremos datos nuevamente (por supuesto, si los datos enviados antes del paquete fifin no se reciben, el mensaje de confirmación correspondiente se cerrará automáticamente

La parte cerrada seguirá reenviando los datos), pero en este momento, la parte cerrada activa aún puede aceptar los datos. La segunda ola: Pasivamente cerrado para recibir

Después de recibir el paquete FIN, envíe un ACK a la otra parte, y el número de secuencia de confirmación es el número de secuencia recibido + 1 (igual que SYN, un FIN ocupa una secuencia

Número). La tercera ola: la parte de cierre pasiva envía un FIN para cerrar la transmisión de datos de la parte de cierre pasiva a la parte de cierre activa, y también

Es para decirle a la parte de cierre activa que mis datos también han sido enviados y no le enviaré más datos. La cuarta ola: el cierre activo recibe

Después de FIN, envíe un ACK a la parte de cierre pasiva, confirmando que el número de serie es el número de serie recibido + 1, hasta ahora, se completaron cuatro manos agitadas.

23. ¿ Cuáles son los modelos de siete capas de OSI ?

OSI (Open System Interconnection) es un modelo de referencia de interconexión de sistemas abiertos desarrollado por la Organización Internacional de Normalización (ISO).

Un sistema de estándares para la interconexión entre computadoras o sistemas de comunicación.

Capa de aplicación: varios protocolos de aplicación, como HTTP, HTTPS, FTP, protocolo de socket seguro SOCKS, nombre de dominio DNS

sistema, GDP Gateway Discovery Protocol, y más.

Capa de presentación: cifrado y descifrado, conversión y traducción, compresión y descompresión, como el protocolo ligero de presentación LPP.

Capa de sesión: los usuarios en diferentes máquinas establecen y administran sesiones, como el protocolo de capa de conexión segura SSL, el protocolo de seguridad de la capa de transporte TLS

protocolo, protocolo de llamada a procedimiento remoto RPC y más.

Capa de transporte: acepte los datos de la capa superior, divida los datos cuando sea necesario y entregue los datos a la capa de red para garantizar

Estos segmentos de datos llegan efectivamente al par, como el Protocolo de control de transmisión TCP, el Protocolo de datagramas UDP.

Capa de red: Controla el funcionamiento de la subred: direccionamiento lógico, transmisión de paquetes, selección de enrutamiento, como IP, IPV6, SLIP, etc.

Capa de enlace de datos: direccionamiento físico, mientras se convierte el flujo de bits original en una ruta de transmisión lógica, como el protocolo de transmisión de compresión XTP,

Protocolo de tunelización punto a punto PPTP y más.

Capa física: transmisión de flujo de bits sin procesar en canales de comunicación de interfaz de temporización mecánicos, electrónicos, como IEEE802.2, etc.

Ali información interna 24. ¿Cuáles son los beneficios de la estratificación como OSI ?

Los beneficios de las capas OSI se pueden describir a partir de cinco aspectos:

1. Las personas pueden discutir y aprender fácilmente los detalles de las especificaciones del protocolo.

2. La interfaz estándar entre capas facilita la modularización del proyecto.

3. Crea un mejor entorno interconectado.

4. Se reduce la complejidad, el programa es más fácil de modificar y la velocidad de desarrollo del producto es más rápida.

5. Cada capa utiliza los servicios de la capa inmediatamente inferior, lo que facilita recordar las funciones de cada capa.

25. Hable sobre el modelo de red de cuatro capas TCP/IP

El Modelo de Capas TCP/IP (Modelo de Capas TCP/IP) se llama Modelo de Capas de Internet (Modelo de Capas de Internet), porque

Modelo de referencia de Internet (Modelo de referencia de Internet). La siguiente figura muestra las cuatro capas del modelo de capas TCP/IP.

El protocolo TCP/IP de datos internos de Alibaba está organizado en cuatro capas conceptuales, tres de las cuales corresponden a las capas correspondientes en el modelo de referencia ISO. El conjunto de protocolos ICP/IP no incluye

Contiene la capa física y la capa de enlace de datos, por lo que no puede completar de forma independiente las funciones de todo el sistema de red informática y debe comunicarse con muchos otros protocolos.

Trabajo colaborativo. Las cuatro capas de protocolo del modelo de capas TCP/IP realizan las siguientes funciones respectivamente:

Capa 1 Capa de interfaz de red

La capa de interfaz de red incluye protocolos para coordinar el transporte de datos IP a través de medios de red existentes.

Protocolo: ARP, RARP

Capa 2

La capa de internetwork corresponde a la capa de red del modelo de referencia de siete capas OSI. Responsable del empaquetado, direccionamiento y enrutamiento de datos. También incluye Informes de Control de Internet

El Protocolo de mensajes de control de Internet (ICMP) se utiliza para proporcionar información de diagnóstico de la red.

Protocolo: esta capa incluye el protocolo IP, el protocolo RIP (Protocolo de información de enrutamiento, protocolo de información de enrutamiento), el protocolo ICMP.

capa de transporte de capa 3

La capa de transporte corresponde a la capa de transporte del modelo de referencia de siete capas OSI, que proporciona dos servicios de comunicación de extremo a extremo.

其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use

Datagram Protocol)提供不可靠的用户数据报服务。

第四层 应用层

应用层对应于OSI七层参考模型的应用层和表达层。

阿里内部资料因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协

议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻

传输协议)等。

26、说说域名解析详细过程?

1. 浏览器访问 www.baidu.com,询问本地 DNS 服务器是否缓存了该网址解析后的 IP 地址。

2. 如果本地 DNS 服务器没有缓存的话,就去 root-servers.net 根服务器查询该网址对应的 IP 地

址。

3. 根服务器返回顶级域名服务器的网址 gtld-servers.net,然后本地 DNS 服务器去顶级域名服务

器查询该网址对应的 IP 地址。

4. 顶级域名服务器返回 www.baidu.com 主区域服务器的地址,然后本地 DNS 服务器去 www.ba

idu.com 主区域服务器查询此域名对应的 IP 地址。

5. 本地 DNS 服务器拿到 www.baidu.com 解析后的 IP 地址后,缓存起来以便备查,然后把解析

后的 IP 地址返回给浏览器。

27 IP 地址分为几类,每类都代表什么,私网是哪些?

大致上分为公共地址和私有地址两大类,公共地址可以在外网中随意访问,私有地址只能在内网访

问只有通过代理服务器才可以和外网通信。

公共地址:

1.0.0.1~126.255.255.254

128.0.0.1~191.255.255.254

192.0.0.1~223.255.255.254

224.0.0.1~239.255.255.254

240.0.0.1~255.255.255.254

Dirección privada:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

0.0.0.0 uso de reenvío de enrutador

127.xxx Reservado

255.255.255.255 Dirección de difusión bajo LAN

28. Dime, ¿cómo TCP garantiza la confiabilidad?

Número de serie de datos internos de Ali y mecanismo de número de confirmación:

Cuando el remitente TCP envía un paquete de datos, seleccionará un número de secuencia secuencial y el receptor detectará la integridad del paquete de datos después de recibir el paquete de datos.

Si se pasa la prueba, responderá con un número de confirmación para indicar que se ha recibido el paquete de datos.

Mecanismo de retransmisión de tiempo de espera:

Después de que el remitente TCP envíe el paquete de datos, iniciará un temporizador.Si no recibe la confirmación del receptor durante un cierto período de tiempo, se reiniciará

Envía ese paquete.

Reordenar paquetes desordenados:

Los paquetes de datos transmitidos desde la capa de red IP a la capa TCP pueden estar desordenados y la capa TCP reordenará los paquetes de datos antes de enviarlos a la capa de aplicación.

Eliminar datos duplicados:

Los paquetes transmitidos desde la capa de red IP a la capa TCP pueden duplicarse y la capa TCP descarta los paquetes duplicados.

control de flujo:

Tanto el extremo de envío TCP como el extremo de recepción tienen un espacio de búfer de tamaño fijo, para evitar que el extremo de envío envíe datos demasiado rápido y provoque que el extremo de recepción

Si el búfer final se desborda, el remitente solo puede enviar los datos que el receptor puede aceptar. Para lograr este efecto de control, TCP utiliza el control de flujo

Protocolo de control (protocolo de ventana deslizante de tamaño variable) para lograr.

Patrones de diseño

El patrón de diseño de datos internos de Alibaba (patrón de diseño) es un resumen de la experiencia de desarrollo de código de los predecesores, y es una serie de rutinas para resolver problemas específicos. él

No es una especificación gramatical, sino un conjunto de soluciones para mejorar la reutilización, el mantenimiento, la legibilidad, la solidez y la seguridad del código.

caso. 1

Datos internos de Ali En 1995, GoF (Gang of Four, Group of Four/Gang of Four) coeditó "Patrones de diseño: un patrón de diseño para software orientado a objetos reutilizable"

基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模

式」。

通常面试中会问:

说一下你知道哪些设计模式?

这时候,就得需要平时积累下来的经验了,肯定回答自己会的,你只是知道名词是没用用的。从难

易程度和常用情况来看可以这么回答:

单例模式、代理模式、模板方法模式、装饰器模式、工厂模式、责任链模式、观察者模式、原型模

式。

通常你能回答这么多就已经ok了。但是其他模式,可以适当的了解了解,不然面试官问你还有其他

设计模式吗?

这时候,你就可以回答名词了,他再问,你就说这些设计模式只是了解过,在工作中用的不是很

多。

1、说说什么是单例模式

答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实

例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

可能这会需要你手写一个单例模式,这就得自己去学了,因为单例模式有很多种写法,懒汉模式,

饿汉模式,双重检查模式等。懒汉模式就是用的时候再去创建对象,饿汉模式就是提前就已经加载

好的静态static对象,双重检查模式就是两次检查避免多线程造成创建了多个对象。

单例模式有很多种的写法,我总结一下:

(1)饿汉式单例模式的写法:线程安全

(2)懒汉式单例模式的写法:非线程安全

(3)双检锁单例模式的写法:线程安全

2、说说你对代理模式的理解

代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

优点

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;

可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。

阿里内部资料缺点

由于使用了代理模式,因此程序的性能没有直接调用性能高;

使用代理模式提高了代码的复杂度。

黄牛卖火车票:没有流行网络购票的年代是很喜欢找黄牛买火车票的,因为工作忙的原因,没时间

去买票,然后就托黄牛给你买张回家过年的火车票。这个过程中黄牛就是代理人,火车票就是被代

理的对象。

婚姻介绍所:婚姻介绍所的工作人员,搜集单身人士信息,婚介所的工作人员为这个单身人士找对

象,这个过程也是代理模式的生活案例。对象就是被代理的对象。

注意了,问代理模式的时候,很有可能会问:动态代理。在Spring篇中已经讲述过,如果你把动态

代理讲了后,很有可能还会问什么是静态代理?一个洞一个是静,大致也能才出来,就是中间代理

层使我们手动写的,通常说的代理模式就是静态代理。

3、说说工厂模式

答:简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行

实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮

(摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你

的需求即可。

优点

工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除

直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分

割,它提供了专门的工厂类用于创建对象;

客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于

一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;

通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一

定程度上提高了系统的灵活性。

缺点

不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;

产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不

利于系统的维护。

4、抽象工厂模式

答:抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让

子类去做决定。

阿里内部资料比如,以上面的咖啡工厂为例,某天我的口味突然变了,不想喝咖啡了想喝啤酒,这个时候如果直

接修改简单工厂里面的代码,这种做法不但不够优雅,也不符合软件设计的“开闭原则”,因为每次

新增品类都要修改原来的代码。这个时候就可以使用抽象工厂类了,抽象工厂里只声明方法,具体

的实现交给子类(子工厂)去实现,这个时候再有新增品类的需求,只需要新创建代码即可。

5、装饰器模式是什么

答:装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模

式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象。

比如,创建一个对象“laowang”,给对象添加不同的装饰,穿上夹克、戴上帽子......,这个执行过程

就是装饰者模式。

一句名言:人靠衣裳马靠鞍。都是装饰器模式的生活案列。

6、代理模式和装饰器模式有什么区别?

答:都是结构型模式,代理模式重在访问权限的控制,而装饰器模式重在功能的加强。

7、模板方法模式

答:模板方法模式是指定义一个算法骨架,将具体内容延迟到子类去实现。

优点

提高代码复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中;

实现了反向控制:通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,

实现了反向控制并且符合开闭原则。

喝茶茶:烧水----放入茶叶---喝茶。放入的茶叶每个人自己的喜好不一样,有的是普洱、有的是铁观

音等。

每日工作:上班打卡----工作---下班打卡。每个人工作的内容不一样,后端开发的、前端开发、测

试、产品每个人的工作内容不一样。

8. ¿Conoces el modo Flyweight?

Respuesta: Como sugiere el nombre, es una unidad compartida. El propósito del patrón de peso mosca es reutilizar objetos y ahorrar memoria, siempre que el objeto de peso mosca no esté disponible

cambiar objeto.

Específicamente hablando, cuando hay una gran cantidad de objetos duplicados en un sistema, si estos objetos duplicados son objetos inmutables, podemos

Los objetos se pueden diseñar como pesos ligeros mediante el uso del patrón de peso ligero, y solo se mantiene una instancia en la memoria como referencia para varios códigos. Esto reduce la interna

El número de objetos almacenados se utiliza para ahorrar memoria.

Escenario de uso típico: la caché en Integer es una implementación clásica del modo flyweight.

¿Cómo parece que el patrón Flyweight y el patrón Singleton son iguales? Lo más probable es que el entrevistador continúe preguntando:

9. ¿Cuál es la diferencia entre el modo de peso mosca y el modo singleton?

Respuesta: El modo singleton es un modo de creación, que se enfoca en un solo objeto. El modo flyweight es un modo estructural, que se enfoca en ahorrar memoria y usar

Se utiliza para mejorar el rendimiento del programa.

Modo Flyweight: Huo Cun se pueden obtener uno o más objetos directamente del caché cuando se usan. Es decir, el modo Flyweight es diferente

Debe haber un solo objeto.

10. Cuénteme sobre el escenario del patrón de estrategia en nuestra vida.

Respuesta: El patrón de estrategia se refiere a definir una serie de algoritmos, encapsular cada algoritmo y hacerlos intercambiables.

Ventajas : sigue el principio de apertura y cierre, y tiene buena escalabilidad.

Desventajas : Con el aumento de estrategias, hay más y más exposiciones externas.

Todos los caminos conducen a Roma y todos los caminos conducen a Beijing.

Hay muchos métodos de transporte (estrategias) para que vayamos a Beijing, como volar, tomar el tren de alta velocidad y conducir solos. todos los sentidos

Tome la comprensión de cada estrategia.

Este es el patrón de estrategia en la vida.

11. ¿Conoces el modelo de cadena de responsabilidad?

Respuesta: Es uno de los patrones de diseño de comportamiento. Considera cada nodo de la cadena como un objeto, y cada nodo maneja diferentes solicitudes.

Y un objeto de nodo siguiente se mantiene automáticamente internamente. Cuando se envía una solicitud desde el extremo principal de la cadena, se pasará al

Cada objeto de nodo hasta que un objeto maneja la solicitud.

ventaja

Solicitud y procesamiento desacoplados;

Los manejadores de solicitudes (objetos de nodo) solo necesitan enfocarse en las solicitudes que les interesan y procesarlas. Para las solicitudes que no están interesadas, pueden directamente

Luego reenviarlo al siguiente objeto de nodo de nivel;

具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果;

链路结构灵活,可以通过改变链路结构动态地新增或删减责任;

易于扩展新的请求处理类(节点),符合 开闭原则;

缺点

阿里内部资料责任链路过长时,可能对请求传递处理效率有影响;

如果节点对象存在循环引用时,会造成死循环,导致系统崩溃;

生活案列:我们在公司内部发起一个OA审批流程,项目经理审批、部门经理审批。老板审批、人力

审批。这就是生活中的责任链模式,每个角色的责任是不同。

SpringMVC中的拦截器和Mybatis中的插件机制,都是拦截器经典实现。

12、了解过适配器模式么?

答:适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无

法一起工作的两个类能够在一起工作。

优点

可以让两个没有关联的类一起运行,起着中间转换的作用;

灵活性好,不会破坏原有的系统。

缺点:过多地使用适配器,容易使代码结构混乱,如明明看到调用的是 A 接口,内部调用的却是 B

接口的实现。

生活中的插座,为了适应各种插头,然后上面有两个孔的,三个空的,基本都能适应。还有万能充

电器、USB接口等。这些都是生活中的适配器模式。

13、知道观察者模式吗?

答:观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关

依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模

型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模

式。 优点

观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了

Actualice la interfaz para que se pueda usar una variedad de capas de presentación diferentes como roles de observador específicos;

El patrón del observador establece un acoplamiento abstracto entre el objetivo de observación y el observador;

El modo de observador admite la comunicación de transmisión;

El modo observador cumple con los requisitos del principio abierto-cerrado (abierto para extensión, cerrado para modificación).

Desventajas :

Si un objeto objetivo de observación tiene muchos observadores directos e indirectos, costará mucho notificar a todos los observadores.

tiempo;

Si existe una dependencia circular entre el observador y el objetivo observado, el objetivo observado activará una llamada circular entre ellos, posiblemente

hacer que el sistema se bloquee;

El modo observador no tiene un mecanismo correspondiente para que el observador sepa cómo cambia el objeto objetivo observado, sino solo para saber

El objetivo de observación de Tao ha cambiado.

Los datos internos de Ali tienen los siguientes roles en el modo observador:

Sujeto: sujeto abstracto (observador abstracto), el rol de sujeto abstracto guarda todos los objetos de observador en una colección, cada uno

Cada tema puede tener cualquier número de observadores, y el tema abstracto proporciona una interfaz para agregar y eliminar objetos observadores;

ConcreteSubject: Sujeto concreto (observador específico), el rol almacenará el estado relevante en el objeto observador específico, en

Cuando cambia el estado interno de un tema específico, se envía una notificación a todos los observadores registrados;

Observer: el observador abstracto es una clase abstracta de observadores, que define una interfaz de actualización, de modo que cuando se cambia el tema

actualizarse cuando se le notifique;

ConcrereObserver: Observador concreto, que implementa la interfaz de actualización definida por el observador abstracto, para ser notificado de los cambios de tema.

Actualizar su propio estado de vez en cuando.

El modo observador es muy usado en Spring, siempre y cuando veas que termina con Evento o empieza con Publicar, es básicamente una observación

modo.

Anteriormente se mencionan un total de 11 patrones de diseño, y estos patrones de diseño pueden tratar con la mayoría de las personas y escenarios de entrevistas. Se recomienda usar en privado.

El código está implementado para una mejor comprensión.

artículo experto

1. ¿Qué es maven ?

Maven se dedica principalmente a la construcción de proyectos basados ​​en la plataforma Java, la gestión de dependencias y la gestión de información de proyectos.

El modelo de objeto de proyecto maven (POM), que puede gestionar la construcción del proyecto, la gestión del proyecto de informes y documentación a través de una pequeña pieza de información descriptiva.

software de herramienta. Incluye un modelo de objeto del proyecto, una colección de estándares, un ciclo de vida del proyecto, un sistema de gestión de dependencias y

Se utiliza para ejecutar la lógica que define los objetivos del complemento en las fases del ciclo de vida. Cuando usa Maven, usa un proyecto bien definido

modelo de objetos para describir su proyecto, y Maven luego puede aplicar la lógica transversal de un conjunto de acciones compartidas (o personalizadas).

definido) complemento.

2. ¿ Qué problemas nos puede resolver Maven ?

①Agregar un paquete jar de terceros

De acuerdo con el método más primitivo, copiamos manualmente el paquete jar al proyecto WEB-INF/lib, cada proyecto tendrá una copia, resultando en una gran cantidad de

Archivos duplicados. Maven coloca el paquete jar en el almacén local para una gestión unificada, y solo es necesario hacer referencia al paquete jar mediante coordenadas.

② Dependencias entre paquetes jar

Los paquetes jar a menudo no son independientes, y muchos jar necesitan el soporte de otros paquetes jar para funcionar normalmente, lo que se denomina dependencia entre paquetes jar.

depende de la relación. Si importamos manualmente, necesitamos conocer las dependencias entre los paquetes jar e importarlos uno por uno, lo cual es extremadamente problemático y propenso a errores.

de. Si usa Maven, puede importar todos los demás paquetes jar de los que depende el paquete jar actual.

③Obtenga el paquete jar de terceros

Necesitamos usar muchos paquetes jar en el proceso de desarrollo de los datos internos de Ali. Cada paquete jar se obtiene de una manera diferente del sitio web oficial, lo que trae dificultades adicionales al trabajo.

Desastre. Pero el uso de Maven puede depender de un paquete jar en forma de coordenadas, Maven lo descarga del almacén central y descarga estos paquetes jar al mismo tiempo.

Otros paquetes jar de los que depende un paquete jar.

④ Dividir el proyecto en múltiples módulos de ingeniería

La escala del proyecto es cada vez más grande, ya no es posible dividir los módulos a través de la estructura del paquete y el proyecto debe dividirse en múltiples proyectos para la colaboración.

desarrollar.

3. ¿Cuáles son las ventajas y desventajas de maven ?

ventaja

Gestión simplificada de dependencias de proyectos

Fácil de usar, para que los principiantes entiendan algunos comandos comunes que pueden cumplir con el trabajo diario

Fácil de integrar con herramientas de integración continua (jenkins)

Es fácil actualizar el proyecto, ya sea el proyecto en sí o las dependencias utilizadas por el proyecto.

Maven tiene muchos complementos, que son convenientes para la expansión de funciones, como sitios de producción, versiones de lanzamiento automático, etc.

¿Por qué usar pips en Maven?

defecto

Maven es un enorme sistema de construcción que es difícil de aprender. (Lo mismo se puede decir de muchos, fáciles de comenzar [ventajas] pero competentes

difícil [desventaja])

Maven adopta la estrategia de que la convención es mejor que la configuración Aunque es fácil comenzar, una vez que ocurre un problema, es difícil depurar en el entorno de red.

Pobre, muchos repositorios son inaccesibles

5. ¿ Cuáles son las coordenadas de Maven ?

Una de las funciones principales de Maven es administrar las dependencias del proyecto e introducir varios paquetes jar que necesitamos. Para poder automatizar la solución

Para analizar cualquier componente de Java, Maven debe identificar de forma única estos paquetes Jar u otros recursos, que es la base para administrar las dependencias del proyecto.

La base, es decir, las coordenadas de las que estamos hablando. Incluyendo proyectos desarrollados por nosotros mismos, también deben ser identificados unívocamente por coordenadas, por lo que

Con el fin de hacer referencias dependientes en otros proyectos.

Las coordenadas de maven identifican de forma única un componente a través de groupId, artefactoId y versión. groupId suele ser el nombre de la empresa u organización

El artefactoId suele ser el nombre del proyecto y el versiónId es el número de versión.

6. Hablar sobre el ciclo de vida de maven

Ciclo de vida de Maven: desde la construcción de nuestro proyecto hasta el proceso de lanzamiento del proyecto.

Descripción de cada etapa:

Información interna de Alibaba 7. ¿Dígame con qué comandos de maven está familiarizado ?

Arquetipo mvn: generar Crear proyecto Maven

mvn compile código fuente de compilación

mvn desplegar proyecto de publicación

mvn test-compile código fuente de prueba de compilación

mvn test ejecuta las pruebas unitarias en la aplicación

mvn site Generar sitio web de información relacionada con el proyecto

mvn clean borra los resultados generados en el directorio del proyecto

El jar generado por el paquete mvn según el proyecto.

mvn install install jar en el repositorio local

Mvn eclipse:eclipse genera archivos de proyecto de eclipse

Mvnjetty:run inicia el servicio de embarcadero

mvntomcat:run inicia el servicio tomcat

mvn clean package -Dmaven.test.skip=true: borre el paquete anterior y vuelva a empaquetar, omita la clase de prueba

8. ¿Cómo resolver el conflicto de versiones causado por la transferencia de dependencias?

La dependencia se puede excluir a través del elemento de exclusión de la dependencia.

9. Habla sobre el principio de dependencia de maven

El principio del camino más corto (cuanto más corto sea el camino de entrega de dependencia, mejor)

El orden de declaración del archivo pom tiene prioridad (la longitud de la ruta es la misma, la primera declaración tiene prioridad)

Principio de sobrescritura de datos internos de Alibaba (el declarado en el archivo pom actual sobrescribe directamente el pasado del proyecto principal)

10. Cuéntame sobre el mecanismo de análisis de dependencia.

Cuando el alcance de la dependencia es el sistema, Maven resuelve los componentes directamente desde el sistema de archivos local.

Calcule la ruta del almacén de acuerdo con las coordenadas de dependencia e intente encontrar el componente directamente desde el almacén local. Si se encuentra el componente correspondiente, el análisis es exitoso.

Si no hay un componente correspondiente en el almacén local, atravesará todos los almacenes remotos y, después de encontrarlo, lo descargará y analizará para su uso.

Si la versión dependiente es RELEASE o LATEST, lea los archivos de metadatos de todos los almacenes remotos según la estrategia de actualización.

(groupId/artifactId/maven-metadata.xml), después de fusionarlo con el elemento correspondiente del almacén local, calcule

RELEASE o LATEST el valor real, y luego verifique el repositorio local en función de ese valor, o descárguelo desde el repositorio remoto.

Si la versión dependiente es SNAPSHOT, lea los archivos de metadatos de todos los almacenes remotos según la estrategia de actualización y compárelos con el almacén local.

Los metadatos correspondientes se fusionan para obtener el valor de la última versión de la instantánea y luego verifican el almacén local de acuerdo con el valor o lo descargan del almacén remoto.

Si la versión del componente finalmente analizado contiene una marca de tiempo, primero descargue el archivo y luego elimine la información de la marca de tiempo en el nombre del archivo.

Dividir, dejando SNAPSHOT y usar (sin marca de tiempo).

11. Habla sobre el mecanismo de análisis del complemento.

Al igual que los artefactos dependientes, los complementos se almacenan en repositorios de Maven en función de las coordenadas. Al usar un complemento, primero verificará desde el almacén local

找插件,如果本地仓库没有则从远程仓库查找插件并下载到本地仓库。与普通的依赖构件不同的

是,Maven会区别对待普通依赖的远程仓库与插件的远程仓库。前面提到的配置远程仓库只会对普

通的依赖有效果。当Maven需要的插件在本地仓库不存在时是不会去我们以前配置的远程仓库查找

插件的,而是需要有专门的插件远程仓库。

ElasticSearch

1、谈谈分词与倒排索引的原理

首先说分词是给检索用的。

英文:一个单词一个词,很简单。I am a student,词与词之间空格分隔。

中文:我是学生,就不能一个字一个字地分,我-是-学生。这是好分的。还有歧义的,使用户

放心,使用-户,使-用户。人很容易看出,机器就难多了。所以市面上有各种各样的分词器,

一个强调的效率一个强调的准确率。

倒排索引:倒排针对的是正排。

1. 正排就是我记得我电脑有个文档,讲了 ES 的常见问题总结。那么我就找到文档,从上往下翻

页,找到 ES 的部分。通过文档找文档内容。

阿里内部资料2. 倒排:一个 txt 文件 ES 的常见问题 -> D:/分布式问题总结.doc。

所以倒排就是文档内容找文档。当然内容不是全部的,否则也不需要找文档了,内容就是几个分词

而已。这里的 txt 就是搜索引擎。

2、说说分段存储的思想

Lucene 是著名的搜索开源软件,ElasticSearch 和 Solr 底层用的都是它。

分段存储是 Lucene 的思想。

早期,都是一个整个文档建立一个大的倒排索引。简单,快速,但是问题随之而来。

文档有个很小的改动,整个索引需要重新建立,速度慢,成本高,为了提高速度,定期更新那么时

效性就差。

现在一个索引文件,拆分为多个子文件,每个子文件是段。修改的数据不影响的段不必做处理。

3、谈谈你对段合并的策略思想的认识

分段的思想大大的提高了维护索引的效率。但是随之就有了新的问题。

每次新增数据就会新增加一个段,时间久了,一个文档对应的段非常多。段多了,也就影响检索性

能了。

检索过程:

1. 查询所有短中满足条件的数据

2. 对每个段的结果集合并

所以,定期的对段进行合理是很必要的。真是天下大势,分久必合合久必分。

策略:将段按大小排列分组,大到一定程度的不参与合并。小的组内合并。整体维持在一个合理的

大小范围。当然这个大到底应该是多少,是用户可配置的。这也符合设计的思想。

4、了解文本相似度 TF-IDF

简单地说,就是你检索一个词,匹配出来的文章,网页太多了。比如 1000 个,这些内容再该怎么

呈现,哪些在前面哪些在后面。这需要也有个对匹配度的评分。

TF-IDF 就是干这个的。

TF = Term Frequency 词频,一个词在这个文档中出现的频率。值越大,说明这文档越匹配,

正向指标。

IDF = Inverse Document Frequency 反向文档频率,简单点说就是一个词在所有文档中都出

现,那么这个词不重要。比如“的、了、我、好”这些词所有文档都出现,对检索毫无帮助。反

向指标。

阿里内部资料TF-IDF = TF / IDF

复杂的公式,就不写了,主要理解他的思想即可。

5、能说说ElasticSearch 写索引的逻辑吗?

ElasticSearch 是集群的 = 主分片 + 副本分片。

写索引只能写主分片,然后主分片同步到副本分片上。但主分片不是固定的,可能网络原因,之前

还是 Node1 是主分片,后来就变成了 Node2 经过选举成了主分片了。

客户端如何知道哪个是主分片呢?

看下面过程。

1. 客户端向某个节点 NodeX 发送写请求

2. NodeX 通过文档信息,请求会转发到主分片的节点上

3. Una vez que se procesa el fragmento principal, notifica al fragmento de réplica que sincronice los datos y envía un mensaje de éxito a Nodex.

4. Nodex devuelve el resultado del procesamiento al cliente.

6. ¿Está familiarizado con el proceso de búsqueda de datos en un clúster de ElasticSearch ?

1. El cliente envía una solicitud al clúster y el clúster selecciona aleatoriamente un NodeX para procesar la solicitud.

2. Nodex primero calcula en qué fragmento principal se encuentra el documento, por ejemplo, el fragmento principal A, que tiene tres copias A1, A2 y A3. entonces solicita

Se sondea una de las tres réplicas para completar la solicitud.

3. Si no se puede confirmar el fragmento, por ejemplo, si la búsqueda no es un documento, se recorrerán todos los fragmentos.

Para agregar, la capacidad de almacenamiento de un nodo es limitada, por lo que existe el concepto de fragmentación. Pero los fragmentos pueden perderse, por lo que hay una secundaria

concepto de libro

Por ejemplo:

El clúster ES tiene 3 fragmentos, fragmento A, fragmento B y fragmento C, luego fragmento A + fragmento B + fragmento C = todos los datos, cada fragmento

La pieza es sólo alrededor de 1/3. El fragmento A tiene copias A1 A2 A3, y los datos son los mismos.

7. ¿Entiende el problema del cambio de página profundo en ElasticSearch y su solución?

Paso de página profundo: por ejemplo, buscamos una vez, sondeamos todos los fragmentos, recopilamos los resultados, calificamos de acuerdo con algoritmos como TF-IDF y clasificamos los 10 primeros

Se devuelven los datos. El usuario se siente bien, dice que miro la página siguiente. ES todavía sondea todos los fragmentos y recopila los resultados, según TF-IDF

Espere a que el algoritmo puntúe y devuelva los primeros 11-20 datos después de clasificarlos.

Para los usuarios, pasar las páginas debería ser rápido, pero de hecho, la complejidad de la primera búsqueda será tan complicada como la siguiente búsqueda.

Si se soluciona, los resultados de búsqueda del usuario se pueden almacenar en Redis durante 10 minutos. Esta paginación es muy rápida, más de 10 minutos, el usuario

Si no pasa la página, no podrá pasar la página y los datos se pueden borrar.

8. Familiarizado con la optimización del rendimiento de ElasticSearch

Ali información interna 1. Envío de lotes

El fondo es una gran cantidad de operaciones de escritura, y cada confirmación es una sobrecarga de la red. La red es siempre el foco de la optimización.

2. Optimizar disco duro

El archivo de índice debe aterrizar en el disco duro, y la idea de la sección trae más archivos pequeños.Disk IO es el cuello de botella de rendimiento de ES. un disco duro de estado solido

El disco es mucho mejor que el disco duro ordinario.

3. Reducir el número de copias

Las réplicas pueden garantizar la disponibilidad del clúster, pero afectan seriamente la eficiencia de la escritura de índices. Al escribir el índice, no solo se escribe el índice, sino también el

Sincronización de índice a réplica. ES no es un motor de almacenamiento, no considere la pérdida de datos, el rendimiento es más importante. Para la importación por lotes, cree

cerrar la copia.

9. ¿ Cuáles son los métodos de optimización de consultas de ElasticSearch ?

Ajuste de fase de diseño

(1) De acuerdo con los requisitos incrementales del negocio, cree un índice basado en una plantilla de fecha y transfiera el índice a través de la API de transferencia;

(2) Utilizar alias para la gestión de índices;

(3) Realice una operación force_merge en el índice regularmente todas las mañanas para liberar espacio;

(4) Se adopta un mecanismo de separación caliente y frío, y los datos calientes se almacenan en SSD para mejorar la eficiencia de recuperación; los datos fríos se reducen periódicamente para reducir

menos almacenamiento;

(5) Utilizar curador para la gestión del ciclo de vida del índice;

(6) Solo para los campos que necesitan ser segmentados, configure razonablemente la palabra segmentador;

(7) La etapa de mapeo combina completamente los atributos de cada campo, ya sea que necesite recuperarse, almacenarse, etc. ……..

escribir afinación

(1) El número de copias antes de escribir se establece en 0;

(2) Desactive el intervalo de actualización antes de escribir y configúrelo en -1 para deshabilitar el mecanismo de actualización;

(3) Durante el proceso de escritura: se adopta la escritura masiva;

(4) Restaurar el número de copias y el intervalo de actualización después de escribir;

(5) Intente utilizar la identificación generada automáticamente.

ajuste de consulta

(1) deshabilitar comodín;

(2) Deshabilitar términos por lotes (cientos o miles de escenarios);

Los datos internos de Ali (3) hacen un uso completo del mecanismo de índice invertido, y el tipo de palabra clave puede ser la mayor cantidad posible de palabras clave;

(4) Cuando la cantidad de datos es grande, el índice se puede finalizar en función del tiempo antes de la recuperación;

(5) Establecer un mecanismo de enrutamiento razonable.

otra afinación

Ajuste de implementación, ajuste de negocio, etc.

En la parte anterior, el entrevistador evaluó básicamente su práctica previa o experiencia en operación y mantenimiento.

10. ¿Cómo implementa elasticsearch la elección maestra ?

Entrevistador: Quiero comprender los principios subyacentes de los clústeres ES y no centrarme solo en el nivel empresarial.

requisitos previos:

(1) Solo los nodos que son nodos maestros candidatos (maestro: verdadero) pueden convertirse en nodos maestros.

(2) El propósito del número mínimo de nodos maestros (min_master_nodes) es evitar el cerebro dividido.

Verificado el código, la entrada principal es fifindMaster, si el nodo maestro se selecciona con éxito, se devolverá el Maestro correspondiente; de ​​lo contrario, se devolverá nulo. seleccionar

El procedimiento se describe aproximadamente de la siguiente manera:

Paso 1: Confirme que la cantidad de nodos maestros candidatos alcance el estándar, el valor establecido en elasticsearch.yml

descubrimiento.zen.minimum_master_nodes;

Paso 2: Comparación: primero determine si tiene calificaciones de maestro, y aquellos con calificaciones de nodo maestro candidato regresarán primero;

Si ambos nodos son nodos maestros candidatos, el que tenga la identificación más pequeña será el nodo maestro. Tenga en cuenta que la identificación aquí es de tipo cadena.

Digresión: el método para obtener la identificación del nodo.

GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name

puerto IP heapPercent heapMax id nombre

11. ¿ Qué debo hacer si hay demasiados datos de índice en elasticsearch , cómo ajustar e implementar?

Entrevistador: Quiero entender las capacidades de operación y mantenimiento de grandes volúmenes de datos.

Respuesta: La planificación de los datos del índice debe estar bien planificada en la etapa inicial. Como dice el refrán, "primero el diseño, la codificación después", para evitar de manera efectiva

El aumento repentino de datos genera el impacto de la recuperación de clientes en línea u otros negocios causados ​​por una capacidad de procesamiento de clúster insuficiente.

Cómo sintonizar:

nivel de índice dinámico

La información interna de Ali se basa en la plantilla + tiempo + rollover api para crear el índice de forma continua. Por ejemplo: la definición de la fase de diseño: el formato de la plantilla del índice del blog es:

En forma de blog_index_timestamp, los datos se incrementan todos los días. La ventaja de hacer esto: no hará que aumente el volumen de datos de un solo índice

Es muy grande, cerca del 32 power-1 de la línea superior 2, y el almacenamiento de índice ha alcanzado TB+ o incluso más.

Una vez que un solo índice es muy grande, seguirán varios riesgos, como el almacenamiento, así que piense en el futuro y evítelo pronto.

nivel de almacenamiento

Los datos fríos y calientes se almacenan por separado, los datos calientes (como los datos de los últimos 3 días o una semana) y el resto son datos fríos.

Para los datos fríos que ya no escribirán datos nuevos, puede considerar las operaciones regulares de compresión force_merge más reducción para ahorrar espacio de almacenamiento y

eficiencia de recuperación.

Nivel de implementación

Una vez que no hay un plan antes, esta es una estrategia de emergencia.

Combinado con la función propia de ES de admitir la expansión dinámica, el método de agregar máquinas dinámicamente puede aliviar la presión sobre el clúster.

Los nodos y otra planificación son razonables y la adición dinámica se puede completar sin reiniciar el clúster.

12. Cuénteme acerca de la arquitectura de clúster del es de su empresa , el tamaño de los datos del índice y cuántos fragmentos hay.

Entrevistador: Quiero saber los escenarios de uso de ES y la escala a la que la empresa del solicitante ha estado expuesta anteriormente, y si han realizado un diseño de índice de escala relativamente grande,

Planificación, puesta a punto.

Respuesta: Simplemente responda con sinceridad y combine sus propios escenarios prácticos.

Por ejemplo: la arquitectura del clúster ES tiene 13 nodos, y el índice tiene un total de más de 20 índices según diferentes canales. Según la fecha, el incremento diario es de 20+, y el índice es:

10 fragmentos, incremento diario de más de 100 millones de datos, control de tamaño de índice diario para cada canal: dentro de 150 GB.

13. ¿ Qué es ElasticSearch ?

Elasticsearch es un motor de búsqueda basado en Lucene. Proporciona distribuciones con HTTP Web y documentos JSON sin esquema.

estilo, motor de búsqueda de texto completo con capacidad para múltiples inquilinos. Elasticsearch está desarrollado en Java y está disponible como código abierto bajo los términos de la licencia [Apache]

liberar.

14. ¿ Qué son los clústeres, nodos , índices, documentos y tipos en ElasticSearch ?

Un clúster es una colección de uno o más nodos (servidores) que juntos contienen todos sus datos y proporcionan

Capacidades conjuntas de indexación y búsqueda. Los clústeres se identifican con un nombre único, que de forma predeterminada es "elasticsearch". Este nombre es importante,

Porque un nodo solo puede ser parte de un clúster si está configurado para unirse al clúster por su nombre.

Un nodo es un único servidor que forma parte de un clúster. Almacena datos y participa en funciones de búsqueda e indexación de clústeres.

Los índices son como "bases de datos" en las bases de datos relacionales. Tiene un mapa que define múltiples tipos. Un índice es un espacio de nombres lógico que mapea

Dispara a uno o más fragmentos primarios y puede tener cero o más fragmentos de réplica. MySQL => Base de datos ElasticSearch

=> índice

El documento de información interna de Ali es similar a una fila en una base de datos relacional. La diferencia es que cada documento en el índice puede tener una estructura diferente (palabra

segmento), pero debe tener el mismo tipo de datos para los campos comunes. MySQL => Bases de datos => Tablas =>

Columnas/Filas ElasticSearch => Índices => Tipos => Documentos con atributos

Los tipos son categorías/particiones lógicas del índice, cuya semántica depende totalmente del usuario.

15. ¿ Qué es la fragmentación en ElasticSearch ?

En la mayoría de los entornos, cada nodo se ejecuta en una caja o máquina virtual separada.

Índice: en Elasticsearch, un índice es una colección de documentos.

Fragmentación: debido a que Elasticsearch es un motor de búsqueda distribuido, el índice generalmente se divide en

Elementos llamados cortes.

Ali información interna 16 , ¿cuál es la réplica en ElasticSearch ?

Un índice se divide en fragmentos para una fácil distribución y escalado. Una réplica es una copia de un fragmento. Un nodo es un nodo que pertenece a un clúster.

Una instancia en ejecución de ElasticSearch. Un clúster consta de uno o más nodos que comparten el mismo nombre de clúster.

19. ¿Qué son los analizadores en ElasticSearch ?

在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进行转换。 分析器由一个

Tokenizer和零个或多个TokenFilter组成。编译器可以在一个或多个CharFilter之前。分析模块允许

您在逻辑名称下注册分析器,然后可以在映射定义或某些API中引用它们。

Elasticsearch附带了许多可以随时使用的预建分析器。或者,您可以组合内置的字符过滤器,编译

器和过滤器器来创建自定义分析器。

20,什么是ElasticSearch中的编译器?

阿里内部资料编译器用于将字符串分解为术语或标记流。一个简单的编译器可能会将字符串拆分为任何遇到空格

或标点的地方。Elasticsearch有许多内置标记器,可用于构建自定义分析器。

21,什么是ElasticSearch中的过滤器?

数据由Tokenizer处理后,在编制索引之前,过滤器会对其进行处理。

22,启用属性,索引和存储的用途是什么?

enabled属性适用于各类ElasticSearch特定/创建领域,如index和size。用户提供的字段没有“已启

用”属性。 存储意味着数据由Lucene存储,如果询问,将返回这些数据。

存储字段不一定是可搜索的。默认情况下,字段不存储,但源文件是完整的。因为您希望使用默认

值(这是有意义的),所以不要设置store属性 该指数属性用于搜索。

索引属性只能用于搜索。只有索引域可以进行搜索。差异的原因是在分析期间对索引字段进行了转

换,因此如果需要的话,您不能检索原始数据。

tomcat

1Tomcat的缺省端口是多少,怎么修改?

El puerto predeterminado es 8080, al que se puede acceder a través del puerto del elemento Connector en service.xml en el directorio conf del paquete de instalación de Tomcat.

propiedad para modificar el puerto.

Ali información interna 2. ¿Qué modos de operación del conector ( optimización ) tiene tomcat ?

Las diferencias entre los tres modos son las siguientes:

BIO: Un hilo maneja una solicitud. Desventajas: cuando la concurrencia es alta, la cantidad de subprocesos es grande, desperdiciando recursos. Versión Tomcat7 o inferior

versión, este método se utiliza por defecto en los sistemas Linux.

NIO: con el procesamiento de E/S asíncrono de Java, se puede procesar una gran cantidad de solicitudes a través de una pequeña cantidad de subprocesos. El valor predeterminado utilizado en tomcat8.0.x es

NIÑO. Tomcat7 debe modificar la configuración del conector para iniciar:

<Puerto conector="8080" protocolo="org.apache.coyote.http11.Http11NioProtocol"

conexiónTiempo de espera="20000" redirecciónPuerto="8443"/>

APR: Apache Portable Runtime, que resuelve el problema de bloqueo de io desde el nivel del sistema operativo. Tomcat7 o Tomcat8 en

Este método se utiliza de forma predeterminada para iniciar en sistemas Win7 o superiores.

3. ¿Cuántos métodos de implementación tiene Tomcat ?

Usando la implementación automática de Tomcat: copie la aplicación web en el directorio webapps (no se recomienda que el entorno de producción lo coloque en este directorio

medio). Cuando se inicie Tomcat, cargará las aplicaciones en el directorio y colocará los resultados compilados en el directorio de trabajo.

Implemente usando la consola de la aplicación de administrador: haga clic en "Aplicación de administrador" en la página de inicio de Tomcat para ingresar a la consola de administración de la aplicación.

以指定一个web应用的路径或war文件。

修改 conf/server.xml 文件部署:在 server.xml 文件中,增加Context节点可以部署应用。

增加自定义的Web部署文件:在 conf/Catalina/localhost/ 路径下增加 xyz.xml文件,内容是

Context节点,可以部署应用。

4tomcat容器是如何创建servlet类实例?用到了什么原理?

1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件

进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过

反射的方式实例化。(有时候也是在第一次请求时实例化)

2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求

实例化。

5tomcat 如何优化?

tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的

内存

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。

对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。

阿里内部资料内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -

XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致

虚拟机一直处于full GC,从而导致处理能力严重下降。

硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法

还是利用下面提到的缓存。

利用缓存和压缩

Para las páginas estáticas, es mejor poder almacenarlas en caché para que no tengan que leerse desde el disco cada vez. Aquí usamos Nginx como

El servidor de caché almacena en caché archivos de imágenes, css y js, lo que reduce efectivamente el acceso al tomcat de backend.

Además, para acelerar la transmisión de la red, también es fundamental habilitar la compresión gzip. Pero considerando que Tomcat ya necesita manejar

Hay muchas cosas que administrar, por lo que el trabajo de compresión se entrega al front-end Nginx para que lo complete.

Además del texto que se puede comprimir con gzip, muchas imágenes también se pueden comprimir previamente con herramientas de procesamiento de imágenes para encontrar un equilibrio.

Los puntos pueden hacer que la pérdida de calidad de la imagen sea muy pequeña y el tamaño del archivo se puede reducir mucho. Una vez vi una imagen comprimida de más de 300 kb a decenas

kb, apenas puedo ver la diferencia.

adoptar grupo

El rendimiento de un solo servidor siempre es limitado. La mejor manera es lograr una expansión horizontal, por lo que construir un clúster Tomcat es una forma efectiva de mejorar el rendimiento.

medios capaces. Todavía usamos Nginx como servidor para la distribución de solicitudes, y múltiples tomcats en el back-end comparten sesiones para trabajar juntos

hacer. Puede consultar el escrito anterior "Uso de nginx+tomcat+memcached para crear equilibrio de carga del servidor web".

Optimizar el número de hilos

Busque el puerto del conector = "8080" protocol = "HTTP/1.1", agregue maxThreads y acepte los atributos de recuento (haga

acceptCount es mayor o igual que maxThreads), de la siguiente manera:

<Puerto del conector="8080" protocolo="HTTP/1.1"conexiónTiempo de espera="20000"

redirectPort="8443"acceptCount="500" maxThreads="400" />

en:

• maxThreads: el número máximo de subprocesos que Tomcat puede usar para el procesamiento de solicitudes, el valor predeterminado es 200

• minSpareThreads: el número inicial de subprocesos de tomcat, es decir, el número mínimo de subprocesos inactivos

• maxSpareThreads: el número máximo de subprocesos inactivos en tomcat, los que excedan se cerrarán

• acceptCount: cuando se utilizan todos los subprocesos disponibles para procesar solicitudes, la cantidad de solicitudes que se pueden colocar en la cola de procesamiento supera

Las solicitudes con este número no se procesarán. El valor predeterminado es 100.

Utilice la optimización del grupo de subprocesos

Agregue el nodo ejecutor en server.xml y luego configure el atributo ejecutor del conector, de la siguiente manera:

<Ejecutor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000"

minSpareThreads="50"maxIdleTime="60000"/>

<Puerto del conector="8080" protocolo="HTTP/1.1"ejecutor="tomcatThreadPool"/>

Ali información interna que incluye:

• namePrefix: el prefijo del nombre del subproceso en el grupo de subprocesos

• maxThreads: el número máximo de subprocesos en el grupo de subprocesos

• minSpareThreads: el número mínimo de subprocesos inactivos en el grupo de subprocesos

• maxIdleTime: cuando se excede el número mínimo de subprocesos inactivos, más subprocesos esperarán este período de tiempo y luego se cerrarán

• threadPriority: prioridad del hilo

Nota: cuando tomcat tiene una gran cantidad de usuarios simultáneos, un solo proceso jvm puede abrir demasiados identificadores de archivos e informará

java.net.SocketException: Error de demasiados archivos abiertos. Puede verificar siguiendo los siguientes pasos:

• ps -ef |grep tomcat Ver el ID de proceso de tomcat, registrar el número de ID, asumiendo que el ID de proceso es 10001

• lsof -p 10001|wc -l Ver el número de operaciones de archivos con el ID de proceso actual 10001

• Use el comando: ulimit -a para ver la cantidad máxima de archivos que cada usuario puede abrir

Optimización de la velocidad de inicio

Elimine las aplicaciones web inútiles: porque Tomcat implementará estas aplicaciones cada vez que se inicie.

Cierre WebSocket: websocket-api.jar y tomcat-websocket.jar.

Optimización de números aleatorios: configure los parámetros de JVM: -Djava.security.egd=file:/dev/./urandom .

optimización de memoria

Debido a que Tomcat es un proceso Java después del inicio, esta pieza puede referirse a las ideas de optimización de la parte JVM. Parámetros relacionados con la memoria del montón

número, por ejemplo:

• -Xms: la memoria de almacenamiento dinámico mínima cuando se inicializa la máquina virtual.

• -Xmx: la memoria de almacenamiento dinámico máxima que puede usar la máquina virtual. -Xms y -Xmx se establecen en el mismo valor para evitar que la JVM provoque GC frecuentes

Puede altibajos

• -XX:MaxNewSize: el valor máximo de toda la memoria del montón ocupada por la nueva generación.

Además, hay ajustes de parámetros del área de método (nota: versión JDK), recolector de basura y otras optimizaciones. Consulte los parámetros relacionados con JVM: Enséñele paso a paso

Establecer parámetros de ajuste de JVM

6. ¿Está familiarizado con la configuración de tomcat ?

Contexto (representa una aplicación web, generalmente un archivo WAR, consulte la especificación de servlet para obtener información específica sobre WAR).

docBase: El directorio base del documento (Document Base, también conocido como Context Root) de la aplicación web, o WAR

La ruta al archivo. Se puede utilizar una ruta absoluta o una ruta appBase relativa al Host al que pertenece el contexto.

ruta: Indica el prefijo de la url de esta aplicación web, por lo que la url solicitada es http://localhost:8080/ruta/****.

Ali internal data reloadable: este atributo es muy importante, si es verdadero, tomcat detectará automáticamente el /WEB-INF/lib de la aplicación

Y cambios en el directorio /WEB-INF/classes, cargando automáticamente nuevas aplicaciones, podemos cambiar sin reiniciar tomcat

solicitud.

useNaming: establezca en verdadero si desea que Catalina habilite un objeto JNDI InitialContext para esta aplicación web. Debería

InitialialContext se ajusta al acuerdo de la plataforma J2EE y el valor predeterminado es verdadero.

workDir: la ruta del directorio temporal proporcionado por Context, que se utiliza para la lectura/escritura temporal del servlet. usar

La propiedad javax.servlet.context.tempdir, el servlet puede acceder al directorio. Si no se especifica, utilice

Un directorio apropiado bajo $CATALINA_HOME/work.

swallowOutput: si el valor es verdadero, la salida de System.out y System.err se redirige a la aplicación web.

registrador Si no se especifica, el valor predeterminado es falso.

depuración: el nivel de detalle de la información de depuración registrada por el registrador asociado con este motor. Cuanto mayor sea el número, más detallada será la salida. si no

Si se especifica, el valor predeterminado es 0.

etiqueta host (que representa un host virtual).

nombre: especifique el nombre de host.

appBase: El directorio básico de la aplicación, es decir, el directorio donde se almacena la aplicación.

unpackWARs: si es verdadero, Tomcat descomprimirá automáticamente el archivo WAR; de lo contrario, no se descomprimirá y se enviará directamente desde el archivo WAR

ejecutar la aplicación.

Ficha Registrador (para registro, depuración y mensajes de error).

className: Especifica el nombre de la clase utilizada por el registrador, esta clase debe implementar la interfaz org.apache.catalina.Logger.

prefijo: especifica el prefijo del archivo de registro.

sufijo: especifica el sufijo del archivo de registro.

timestamp : si es verdadero, se debe agregar la hora al nombre del archivo de registro, como en el siguiente ejemplo: localhost_log.2001-10-04.txt.

7. ¿Qué es Tomcat ?

El servidor Tomcat es un proyecto central en el proyecto Apache Software Foundation, que es un servidor de aplicaciones web gratuito y de código abierto.

El servidor (contenedor de Servlet), que es un servidor de aplicaciones liviano, se usa en sistemas pequeños y medianos y en ocasiones donde no hay muchos usuarios con acceso simultáneo.

Comúnmente utilizado, es la primera opción para desarrollar y depurar programas JSP.

8. ¿Qué es un Servlet ?

El servlet de datos interno de Alibaba es un tipo de especificación JavaEE, principalmente para expandir la función de Java como un servicio web y para unificar la interfaz. por otras fábricas internas

Empresas como Tomcat y Jetty implementan funciones web internamente. Si llega una solicitud http: el contenedor encapsula la solicitud como un servlet

El objeto HttpServletRequest llama a init(), service() y otros métodos para generar una respuesta, que el contenedor empaqueta como httpresponse

proceso devuelto al cliente.

9. ¿ Qué es la especificación Servlet ?

Desde la perspectiva del paquete Jar, la especificación de Servlet son dos archivos Jar. servlet-api.jar y jsp-api.jar, Jsp también es un

servlet。

En términos de paquete, son dos paquetes javax.servlet y javax.servlet.http.

En términos de interfaz, estandariza la interfaz Servlet, la interfaz Filter, la interfaz Listener, la interfaz ServletRequest,

interfaz ServletResponse, etc. El diagrama de clases es el siguiente:

Información interna de Alibaba 10. ¿Por qué llamamos a tomcat un contenedor Web o un contenedor Servlet ?

Usamos un gráfico para representar la relación entre ellos:

Comprensión simple: inicie un ServerSocket y escuche en el puerto 8080. El contenedor Servlet se usa para instalar el Servlet que desarrollamos.

11. ¿Cómo maneja Tomcat el proceso de solicitud Http ?

Supongamos que entramos en el navegador

http://localhost:8080/mi-web-mave/index.jsp

Cómo manejar este proceso de solicitud en tomcat:

1. Nuestra solicitud se envía al puerto 8080 de la máquina local y el Coyote HTTP/1.1 Connector la escucha allí.

2. El Conector entrega la solicitud al Motor de su Servicio para su procesamiento y espera una respuesta del Motor.

Ali información interna 3. El motor obtiene la solicitud localhost/my-web-maven/index.jsp, haciendo coincidir todos los hosts de host virtual que posee,

Nuestro host virtual está configurado por defecto en server.xml como localhost.

4. El Motor hace coincidir el Host con name=localhost (incluso si no coincide, la solicitud se entrega al Host para su procesamiento, porque el Host

se define como el host predeterminado para el motor).

5. El host localhost recibe la solicitud /my-web-maven/index.jsp, que coincide con todos los contextos que posee.

6. El host coincide con el contexto cuya ruta es /my-web-maven (si no se encuentra ninguna coincidencia, la solicitud se transfiere al nombre de la ruta ""

Contexto a procesar).

7. El Contexto con path=”/my-web-maven” obtiene la solicitud /index.jsp, y encuentra la correspondiente en su tabla de mapeo

servlet

8. El Contexto coincide con el servlet cuyo PATRÓN de URL es *.jsp, que corresponde a la clase JspServlet.

9. Construya el objeto HttpServletRequest y el objeto HttpServletResponse, llame a doGet de JspServlet como parámetro

o el método doPost.

10. El contexto devuelve el objeto HttpServletResponse después de la ejecución al Host.

11. Host devuelve el objeto HttpServletResponse a Engine.

12. Engine devuelve el objeto HttpServletResponse a Connector.

13. Connector devuelve el objeto HttpServletResponse al navegador del cliente.

12. ¿ Qué son los directorios de estructura tomcat ?

papelera

Inicio, apagado y otros scripts. Estos archivos .sh (para sistemas Unix) son copias funcionales de estos archivos .bat (para

sistema Windows). Aquí se incluyen algunos archivos adicionales debido a que falta alguna funcionalidad en la línea de comandos de Win32.

Por ejemplo: startup.bat se usa para iniciar Tomcat en Windows y startup.sh se usa en un entorno Linux. corresponder

También hay un script de apagado correspondiente.

conferencia

Archivos de configuración de Tomcat y DTD relacionados. El archivo más importante aquí es server.xml. Es el archivo de configuración principal del contenedor.

catalina.policy: tomcat: archivo de política de seguridad, control de permisos relacionados con JVM, para obtener más información, consulte

java.seguridad.Permiso。

Ali datos internos catalina.properties: archivo de configuración de control de comportamiento de Tomcat Catalina, como: Common ClassLoader.

logging.properties: archivo de configuración de registro de Tomcat. El registro interno utiliza JDK Logging.

server.xml: archivo de configuración del servidor tomcat (muy importante para mis desarrolladores).

context.xml: archivo de configuración de contexto global, monitorear y cargar archivos de recursos, cuando los archivos monitoreados cambian, automáticamente

Carga automáticamente.

tomcat-user.xml: archivo de configuración de roles de tomcat.

web.xml: archivo de implementación web.xml estándar de Servlet, Tomcat implementa algunas configuraciones de forma predeterminada:

org.apache.catalina.servlets.DefaultServlet。

org.apache.jasper.servlet.JspServlet

registros

Los archivos de registro se encuentran aquí de forma predeterminada.

localhost 有用,当你们的tomcat启动不了的时候,多看这个文件。比如:

NoClassDefFoundError

ClassNotFoundException

access 最没用。

catalina.{date} 主要是控制台输出,全部日志都在这里面。

webapps

这是您的webapp所在的位置。其实这里面这几个都是一个项目。

简化web部署的方式。在线上环境中我们的应用是不会放在这里的。最好的办法就是外置。

lib:tomcat存放共用的类库。比如:

ecj-4.17.jar: eclipse Java编译器

jasper.jar:JSP编译器。

work

存放tomcat运行时编译后的文件,比如JSP编译后的文件 。

temp

存放运行时产生的临时文件。

Git

阿里内部资料Git

SVN

1. Git是一个分布式的版本控制工具

1. SVN 是集中版本控制工具

2.它属于第3代版本控制工具

2.它属于第2代版本控制工具

3.客户端可以在其本地系统上克隆整个存储库

3.版本历史记录存储在服务器端存储库中

4.即使离线也可以提交

4.只允许在线提交

5.Push/pull 操作更快

5.Push/pull 操作较慢

6.工程可以用 commit 自动共享

6.没有任何东西自动共享

1GitSVN有什么区别?

2、什么是Git

我建议你先通过了解 git 的架构再来回答这个问题,如下图所示,试着解释一下这个图:

Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本

的更改。

Su arquitectura distribuida tiene muchas ventajas sobre otros sistemas de control de versiones (VCS) como SVN, una de las principales ventajas es que no

Confíe en un servidor central para almacenar todas las versiones de los archivos del proyecto.

Cada desarrollador puede "clonar" una copia del repositorio que marqué con "Repositorio local" en el diagrama y tenerlo en su disco duro

Tiene el historial completo de sus proyectos en la unidad de disco, por lo que si un servidor deja de funcionar, todos los datos de recuperación que necesita están en su equipo.

en el repositorio Git local de un amigo.

También hay un repositorio central en la nube donde los desarrolladores pueden realizar cambios y compartirlos con otros miembros del equipo, como se muestra

muestra que todos los colaboradores están enviando cambios al "repositorio remoto".

3. ¿ Qué es el comando de confirmación en Git ?

La respuesta de datos internos de Ali es muy simple. El comando para escribir confirmaciones es git commit -a .

Ahora para explicar la bandera -a,

Indique a git que confirme los nuevos contenidos de todos los archivos rastreados que se han modificado agregando -a a la línea de comando.

Además, si necesita confirmar archivos nuevos por primera vez, puede hacer git add antes de git commit -a .

4. ¿Qué es un " repositorio desnudo " en Git ?

Debe establecer la diferencia entre un "directorio de trabajo" y un "repositorio simple".

Un repositorio "desnudo" en Git contiene solo información de control de versiones y no contiene archivos de trabajo (ningún árbol de trabajo), y no contiene ninguna información especial.

Subdirectorios .git. En su lugar, incluye todo en el subdirectorio .git directamente en el propio directorio de inicio, donde el directorio de trabajo incluye:

1. Un subdirectorio .git que contiene todo el historial de revisión de Git relevante para su repositorio.

2. El árbol de trabajo, o una copia del archivo de proyecto extraído.

5 ¿En qué idioma está escrito Git?

Debe explicar por qué lo está usando, no solo decir el nombre del idioma. Te sugiero que respondas así:

Git está escrito en lenguaje C. GIT es rápido y el lenguaje C hace esto al reducir la sobrecarga del tiempo de ejecución.

6. En Git , ¿cómo se revierte una confirmación que se envió y se hizo pública?

Puede haber dos respuestas a esta pregunta y asegúrese de incluir ambas porque cualquier

de las siguientes opciones se pueden usar dependiendo de la situación: 1 Esta pregunta puede tener dos respuestas, usted

También asegúrese de incluir ambas respuestas en su respuesta, ya que las siguientes opciones están disponibles según la situación:

Elimine o corrija archivos defectuosos en una nueva confirmación y envíelo al repositorio remoto. Esta es la forma más natural de corregir errores. bien

Después de realizar las modificaciones necesarias en el archivo, se envía al repositorio remoto que usaré.

git commit -m "mensaje de confirmación"

Cree una nueva confirmación, deshaciendo todos los cambios realizados en la confirmación incorrecta. Puedes usar el comando:

git revert <nombre de la mala confirmación>

7. ¿Cuál es la diferencia entre git pull y git fetch ?

El comando git pull extrae nuevos cambios o confirmaciones para una rama específica del repositorio central y actualiza la rama de destino en el repositorio local.

git fetch también se usa para el mismo propósito, pero funciona de manera ligeramente diferente. Cuando haces un git fetch, obtiene el requerido

Extrae todas las confirmaciones nuevas de la rama de y guárdalas en una nueva rama en el repositorio local. Si desea reflejar esto en la rama de destino

Cambios, git merge debe realizarse después de git fetch. Solo después de hacer una fusión de la rama de destino y la rama recuperada

Actualizar rama de destino. Por conveniencia, recuerda la siguiente ecuación:

阿里内部资料git pull = git fetch + git merge

8git中的“staging area”“index”是什么?

For this answer try to explain the below diagram as you can see: 可以通过下图进行解释:

在完成提交之前,可以在称为“staging area”或“index”的中间区域中对其进行格式化和审查。从图

中可以看出,每个更改首先在暂存区域中进行验证,我将其称为“stage fifile”,然后将更改提交到存

储库。

9、什么是 git stash?

首先应该解释 git stash 的必要性。

阿里内部资料通常情况下,当你一直在处理项目的某一部分时,如果你想要在某个时候切换分支去处理其他事

情,事情会处于混乱的状态。问题是,你不想把完成了一半的工作的提交,以便你以后就可以回到

当前的工作。解决这个问题的答案是 git stash。

再解释什么是git stash。

stash 会将你的工作目录,即修改后的跟踪文件和暂存的更改保存在一堆未完成的更改中,你可以

随时重新应用这些更改。

10、什么是git stash drop

通过说明我们使用 git stash drop 的目的来回答这个问题。

git stash drop 命令用于删除隐藏的项目。默认情况下,它将删除最后添加的存储项,如果提供

参数的话,它还可以删除特定项。

下面举个例子。

如果要从隐藏项目列表中删除特定的存储项目,可以使用以下命令:

git stash list : mostrará una lista de elementos ocultos como:

stash@{0}: WIP en maestro: 049d078 agregó el archivo de índice stash@{1}: WIP en maestro: c264051

Revertir "fifile_size añadido" stash@{2}: WIP en maestro: 21d80a5 número añadido para iniciar sesión

Si desea descartar un proyecto llamado stash@{0}, use el comando git stash drop stash@{0} .

11. ¿Cómo encontrar la lista de archivos modificados en una confirmación en particular?

Para este problema, no puede simplemente proporcionar el comando, sino también explicar qué hace el comando.

Para obtener una lista de archivos modificados en una confirmación en particular, use el siguiente comando:

git diffff-árbol -r {hash}

Dado un hash de confirmación, esto enumerará todos los archivos modificados o agregados en esa confirmación. El indicador -r hace que el comando enumere archivos individuales sin

es colapsarlos solo en el nombre del directorio raíz.

También puede incluir lo que se menciona a continuación, aunque es opcional pero ayuda a impresionar al entrevistador.

La salida también contendrá información adicional, que se puede enmascarar fácilmente al incluir dos banderas:

git diffff-tree –no-commit-id –name-only -r {hash}

Aquí -no-commit-id suprimirá la aparición de hashes de confirmación en la salida, y -name-only simplemente imprimirá los nombres de archivo en lugar de ellos

camino de.

12. ¿ Cuál es la función de git config ?

La información interna de Ali primero explica por qué necesitamos git config.

git usa tu nombre de usuario para asociar confirmaciones con identidades. El comando git config se puede usar para cambiar su configuración de git, incluida su

nombre de la cuenta.

Vamos a explicar con un ejemplo.

假设你要提供用户名和电子邮件 ID 用来将提交与身份相关联,以便你可以知道是谁进行了特定提

交。为此,我将使用:

git confifig –global user.name "Your Name": 此命令将添加用户名。

git confifig –global user.email "Your E-mail Address": 此命令将添加电子邮件ID。

13、提交对象包含什么?

Commit 对象包含以下组件,你应该提到以下这三点:

一组文件,表示给定时间点的项目状态

引用父提交对象

SHAI 名称,一个40个字符的字符串,提交对象的唯一标识。

14、 如何在Git中创建存储库?

这可能是最常见的问题,答案很简单。

要创建存储库,先为项目创建一个目录(如果该目录不存在),然后运行命令 git init。通过运行此

命令,将在项目的目录中创建 .git 目录。

15、怎样将 N 次提交压缩成一次提交?

将N个提交压缩到单个提交中有两种方式:

如果要从头开始编写新的提交消息,请使用以下命令:

git reset –soft HEAD~N &&

git commit

如果你想在新的提交消息中串联现有的提交消息,那么需要提取这些消息并将它们传给 git

commit,可以这样:

git reset –soft HEAD~N &&

git commit –edit -m"$(git log –format=%B –reverse .HEAD@{N})"

Ali información interna 16. ¿Qué es Git bisect ? Cómo usarlo para determinar errores (de regresión) de

¿fuente?

Le sugiero que primero dé una pequeña definición de Git bisect.

Git bisect se usa para encontrar confirmaciones que introducen errores mediante la búsqueda binaria. El comando para Git bisect es

git bisect <subcomando> <opciones>

Ahora que ha mencionado el comando anterior, permítame explicarle lo que hará este comando.

Este comando utiliza un algoritmo de búsqueda binaria para encontrar qué compromiso en el historial del proyecto introdujo el error. Puedes decirlo conocido por

El compromiso "malo" que contiene el error, así como los compromisos "buenos" que se conocían antes de que se introdujera el error, lo usan. Entonces git bisect en estos dos

Seleccione una confirmación entre los puntos finales y le preguntará si la confirmación seleccionada es "buena" o "mala". Sigue reduciéndose hasta que encuentra el cambio de introducción.

el compromiso exacto.

17. Si desea ejecutar una herramienta de verificación de código antes de confirmar y cuando falla la prueba

¿Cómo configuro un repositorio de Git para bloquear confirmaciones ?

Le sugiero que introduzca la verificación de cordura primero.

Las pruebas de integridad o de humo se utilizan para determinar si la continuación de las pruebas es factible y razonable.

Cómo lograr esto se explica a continuación.

Esto se puede hacer con un script simple relacionado con el gancho de confirmación previa del repositorio. git dispara pre antes de enviar

cometer gancho. Puede ejecutar otras herramientas en este script, como linters, y ejecutar

Prueba de cordura.

Finalmente, para ver un ejemplo, puede consultar el siguiente script:

#!/bin/sh

archivos=$(git diff –cached –name-only –diff-filter=ACM | grep '.go$')

si [-z archivos]; entonces

salida 0

fi

unfmtd=$(gofmt -l $archivos)

si [-z unfmtd]; entonces

salida 0

fi

echo "Algunos archivos .go no se encuentran"

salida 1

Esta secuencia de comandos comprueba si todos los archivos .go que se van a enviar deben pasarse a través de la herramienta estándar de formato de código fuente de Go, gofmt. si

Si la secuencia de comandos sale con un estado distinto de cero, la secuencia de comandos bloquea efectivamente la operación de confirmación.

18. Describa la estrategia de ramificación que utiliza.

Esta pregunta se hizo para probar su experiencia con la bifurcación con Git, dígales cómo usó la bifurcación en trabajos anteriores y para qué sirvió.

Qué es, puede consultar los puntos mencionados a continuación:

Ramificación de características

El modelo de bifurcación de funciones mantiene todos los cambios en una función particular dentro de la rama. Cuando la funcionalidad se prueba completamente a través de pruebas automatizadas y

Cuando se valida, la rama se fusionará con la maestra.

Ramificación de tareas

En este modelo, cada tarea se implementa en su propia rama, con la clave de la tarea contenida en el nombre de la rama. es fácil ver cuál

Qué tarea implementa el código, simplemente busque la clave de la tarea en el nombre de la rama.

Liberar ramificación

Una vez que la rama de desarrollo haya adquirido suficiente funcionalidad de lanzamiento, puede clonar esa rama para formar la rama de lanzamiento. La creación de esta rama

Comience el próximo ciclo de lanzamiento, por lo que no se pueden agregar nuevas funciones después de eso, solo correcciones de errores, generación de documentación y otros

Las tareas orientadas a la liberación deben incluirse en esta rama. Una vez que está listo para el lanzamiento, el lanzamiento se fusiona con el maestro y se etiqueta

Número. Además, debe fusionar el progreso que se ha realizado desde el lanzamiento en la rama de desarrollo.

Finalmente, dígales que las estrategias de bifurcación varían de un equipo a otro, por lo que conozco las operaciones básicas de bifurcación como eliminar, fusionar, pagar rama, etc.

19. Si la sucursal se ha fusionado con master , ¿cómo puede saberlo?

La respuesta es sencilla.

Para saber si una rama se ha fusionado con la maestra, puede usar el siguiente comando:

git branch --merged Enumera las ramas que se han fusionado en la rama actual.

git branch --no-merged que enumera las ramas que no se han fusionado.

20. ¿ Qué es SubGit ?

SubGit es una herramienta para migrar SVN a Git. Crea un espejo Git grabable de un repositorio Subversion local o remoto

Haga clic en Me gusta y siéntase libre de usar Subversion y Git todo el tiempo que desee.

Esto tiene muchas ventajas, por ejemplo, puede realizar una importación rápida de una sola vez desde Subversion a Git o en Atlassian Bitbucket.

SubGit se usa en el servidor. Podemos usar SubGit para crear un espejo Git-SVN bidireccional de un repositorio de Subversion existente.

Puede empujar a Git o comprometerse con Subversion a su conveniencia. La sincronización se realiza mediante SubGit.

21. ¿ Enumere varios comandos de git que se usan comúnmente en el trabajo?

El comando para agregar un nuevo archivo en la información interna de Ali: git add fifile o git add El comando para enviar un archivo: git commit –m o git commit –a check

Mire el estado del espacio de trabajo: git status –s para extraer y fusionar ramas remotas: git fetch/git merge o git pull para ver los envíos

Comando de registro: git reflflog

22. ¿Cómo deshacer la operación incorrecta de este envío?

Si desea cancelar el archivo enviado al área de índice, puede usar git reset HEAD fifile ; si desea cancelar el archivo enviado al almacén local

archivo, puede restaurar la biblioteca de versiones de la rama actual al estado del último envío, el área de índice y el trabajo a través de git reset –soft HEAD^n

El espacio no cambia; puede usar git reset –mixed HEAD^n para restaurar la biblioteca de versiones y el área de índice de la rama actual a la enviada la última vez

23. ¿ Alguna vez has usado el comando git stash ? ¿Cuándo sueles usarlo?

El comando git stash es para almacenar el contenido modificado del espacio de trabajo en el área de la pila. Se utiliza en las siguientes situaciones:

Al resolver archivos en conflicto, primero se ejecutará git stash y luego se resolverán los conflictos;

Cuando se encuentra una tarea de desarrollo urgente pero la tarea actual no se puede enviar, primero se ejecutará git stash, luego se llevará a cabo el desarrollo de la tarea urgente y luego

Luego, saque el contenido del área de la pila a través de git stash pop para continuar con el desarrollo;

Al cambiar de rama, si no se puede enviar el contenido del espacio de trabajo actual, primero se ejecutará git stash y luego se realizará el cambio de rama;

24. ¿Cómo ver el historial de presentación de sucursales? Ver el historial de un archivo

¿Paño de lana?

Ver el historial de confirmaciones de una rama:

Comando git log –number: indica que se debe ver el historial de envío detallado del primer número de la rama actual;

Comando git log –number –pretty=oneline: Simplifique sobre la base del comando anterior, solo muestre el código sha-1 y confirme

información;

Comando git reflflog –number: Indica para ver el primer número del historial de envío simplificado de todas las sucursales;

Comando git reflflog –number –pretty=oneline: muestra información simplificada del historial de información;

Si desea ver el historial de envío de un archivo, simplemente agregue el nombre del archivo después del comando anterior.

Nota: Si no hay un número, se mostrarán todos los tiempos de envío.

25. ¿Has usado git merge y git rebase ? ¿Cual es la diferencia entre ellos?

En pocas palabras, tanto git merge como git rebase son comandos para fusionar ramas. git merge branch tomará la diferencia de la rama branch

El contenido se extrae al local y luego, junto con el contenido de la rama local, se forma un objeto de confirmación y se envía a la rama principal.

La rama es consistente con la rama principal; la rama de git rebase fusionará primero la rama de la rama con la rama principal y luego fusionará la rama local

La confirmación se coloca detrás de la rama principal. La rama fusionada es como sacar otra rama de la rama principal fusionada. La rama local misma

El historial de confirmaciones no se conserva.

26. He usado git cherry-pick , ¿cuál es el efecto?

El comando git cherry-pick puede copiar la confirmación de la rama A en la rama B. Realice operaciones de comando en la rama B:

Los datos internos de Ali copian una sola confirmación: git cherry-pick commitId

Para copiar varias confirmaciones: git cherry-pick commitId1...commitId3

NOTA: El comando para copiar varias confirmaciones no incluye commitId1

Poder suave

Además de enseñarle cómo escribir un currículum específico para programadores con Markdown, este artículo le recomendará algunos buenos currículums más adelante.

El software o sitio web utilizado para escribir currículums de Markdown y cómo convertir elegantemente el formato de Markdown a formato PDF u otro

otros formatos.

Se recomienda que utilice la sintaxis de Markdown para escribir su currículum y luego convierta el formato de Markdown a formato PDF antes de enviar su currículum.

Si no sabe mucho sobre la gramática de Markdown, puede dedicar media hora a ver brevemente la descripción de la gramática de Markdown:

http://www.markdown.cn 。

1. ¿ Por qué es importante un currículum?

Un buen currículum puede desempeñar un papel muy importante en todo el proceso de entrevista y entrevista de solicitud. sin exagerar las propias habilidades

A continuación, escribir un buen currículum también es una gran habilidad. ¿Por qué es importante un currículum?

2. Comencemos con la entrevista

Si presenta su solicitud en línea, su currículum inevitablemente será revisado por Recursos Humanos. Puede tomar 10 segundos para que RR.

Determinará si su nivel es Reprobado o Aprobado.

Si eres un referido interno, si tu currículum no tiene ventajas, por mucho que se esfuerce la persona que te refirió, no hay nada que puedas hacer.

Además, incluso si pasa la selección, en la entrevista posterior, el entrevistador también juzgará si vale la pena su gasto en función de su currículum.

Mucho tiempo para entrevistas.

Por lo tanto, su currículum es como nuestra fachada, lo que determina en gran medida si puede ingresar a la próxima ronda de entrevistas.

3. Comencemos con la entrevista

Descubrí que la gente prefiere leer las escrituras cara a cara, lo cual es comprensible, pero la mayoría de las escrituras cara a cara no te dicen que muchos problemas se encuentran en condiciones específicas.

Yo sólo pregunté. Para dar un ejemplo simple: en general, se le preguntará solo cuando se indique en su currículum que se le preguntará (Java, estructura de datos, etc.)

la estructura, la red y los algoritmos son conceptos básicos que todos deben preguntarse), por ejemplo, si escribe que sabe redis, lo más probable es que el entrevistador le pregunte sobre redis

algunos problemas. Por ejemplo: tipos de datos comunes y escenarios de aplicación de redis, por qué redis es de un solo subproceso tan rápido, redis y

La diferencia entre memcached, mecanismo de eliminación de memoria redis, etc.

Así que, antes que nada, tienes que dejar una cosa clara: no escribas en tu currículum lo que no sabes. Además, debe considerar cómo puede

Deje que sus aspectos más destacados se destaquen en su currículum, por ejemplo: qué problemas hizo en un determinado proyecto y qué problemas se resolvieron (siempre que haya un proyecto

Debe haber problemas por resolver), qué tecnología se utiliza en uno de sus proyectos, el rendimiento general y la concurrencia han mejorado mucho, etc.

Toda entrevista de información interna y el trabajo son dos cosas diferentes. Las personas inteligentes llevarán al entrevistador al campo en el que son buenos, mientras que otras serán guiadas por el entrevistador.

Aunque las entrevistas y los trabajos son dos cosas diferentes, si desea obtener una oferta satisfactoria, su propia fuerza debe ser fuerte.

4. Algunas cosas que debes saber

La mayoría de RH de la empresa dijo que no valoramos las calificaciones académicas (¡estás mintiendo!), pero si tu escuela no es sobresaliente, es difícil competir con un montón de simples

Destaca en tu currículum, a menos que tu currículum tenga aspectos destacados especiales, como: experiencia de pasantía en cierta gran fábrica, ganar un premio en cierta competencia

etc.

La mayoría de los recién graduados no tienen experiencia laboral o pasantías cuando buscan trabajo, por lo que si es un recién graduado, no se pierda el reclutamiento de otoño y el reclutamiento de primavera.

truco. Una vez que lo pierdas, lo más probable es que te enfrentes al reclutamiento social más adelante. En este momento, puedes enfrentarte a varios encuentros sin experiencia laboral.

pared, resultando en no poder encontrar un buen trabajo

Ojo con lo que escribes en tu currículum, aquí es donde el entrevistador hace muchas preguntas;

Es muy importante presentar perfectamente la experiencia de su proyecto.

5、必须了解的两大法则

STAR法则(Situation Task Action Result

Situation

事情是在什么情况下发生;

Task:

你是如何明确你的任务的;

Action

针对这样的情况分析,你采用了什么行动方式;

Result

结果怎样,在这样的情况下你学习到了什么。

简而言之,STAR法则,就是一种讲述自己故事的方式,或者说,是一个清晰、条理的作文模板。不

管是什么,合理熟练运用此法则,可以轻松的对面试官描述事物的逻辑方式,表现出自己分析阐述

问题的清晰性、条理性和逻辑性。

FAB 法则(Feature Advantage Benefifit

Feature

是什么;

Advantage

比别人好在哪些地方;

Benefifit

如果雇佣你,招聘方会得到什么好处。

简单来说,这个法则主要是让你的面试官知道你的优势、招了你之后对公司有什么帮助。

6、项目经历怎么写

简历上有一两个项目经历很正常,但是真正能把项目经历很好的展示给面试官的非常少。对于项目

经历大家可以考虑从如下几点来写:

1. 对项目整体设计的一个感受

2. 在这个项目中你负责了什么、做了什么、担任了什么角色

3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用

Toda la información interna 4. Además, en la descripción del proyecto, es mejor reflejar su calidad general, por ejemplo, cómo coordina a los miembros del equipo del proyecto para desarrollar en colaboración o

¿O cómo resolvió un problema difícil cuando lo encontró, o qué tecnología utilizó en este proyecto para lograrlo?

Qué funciones son como: usar redis como caché para mejorar la velocidad de acceso y la concurrencia, usar colas de mensajes para cortar picos y reducir el tráfico, etc.

7. Cómo escribir competencias profesionales

Primero pregúntese qué sabe y luego vea qué necesita su empresa prevista. El departamento de recursos humanos general puede no saber mucho sobre tecnología, por lo que está evaluando

Al elegir un currículum, puede centrarse en las palabras clave de sus habilidades profesionales. Por las habilidades que la empresa requiere pero no sabes, ¿cuánto puedes gastar?

Tómese unos días para aprender y luego puede escribir en su currículum que comprende esta habilidad. Por ejemplo, puede escribir así (la siguiente parte es un extracto

Mi hoja de vida, puedes hacer algunas modificaciones y mejoras de acuerdo a tu propia situación):

Conocimientos básicos en clase de red informática, estructura de datos, algoritmo, sistema operativo, etc.: dominar

Fundamentos de Java: Dominio

Máquina virtual JVM (área de memoria Java, algoritmo de basura de máquina virtual, recolector de basura virtual, administración de memoria JVM): maestro

Desarrollo de sistemas de alta concurrencia, alta disponibilidad y alto rendimiento: maestro

Struts2, Spring, Hibernate, Ajax, Mybatis, JQuery: toma el control

Integración SSH, Integración SSM, Arquitectura SOA: Masterización

doblaje:

maestro

Guardián del zoológico: Dominar

Colas de mensajes comunes: Masterización

Linux: Masterización

Métodos de optimización comunes de MySQL: maestro

Spring Boot +Spring Cloud +Docker:了解

HDFS, Storm, MapReduce, Hive, Hbase en tecnologías relacionadas con la ecología de Hadoop: comprender

Conceptos básicos de Python, algunas bibliotecas comunes de terceros como OpenCV, wxpy, wordcloud, matplotlib: familiarizado con

8. Cuestiones tipográficas que requieren atención

1. Trate de ser conciso y no demasiado elaborado;

2. No se equivoque al escribir en mayúsculas algunos términos técnicos. Por ejemplo, MySQL no debe escribirse como mysql y Java no debe escribirse como java. veo esto

Es bastante tabú venir aquí, por lo que debemos prestar atención a este detalle;

3. Se verá más cómodo si hay un espacio entre el chino y el inglés digital;

9. Algunos otros pequeños consejos

1. Trate de evitar expresiones subjetivas, menos adjetivos con semántica ambigua, trate de ser conciso y claro, y tenga una estructura lógica clara.

2. Si tienes un blog o una pila de tecnología personal, escribirlo te dará muchos puntos.

3. Si tu propio Github es más activo, escribirlo también te dará muchos puntos.

4. Presta atención a la autenticidad de tu currículum y no escribas cosas que no sabes o contenido engañoso

5. Se sugiere ordenar la experiencia del proyecto en orden cronológico inverso. Además, la experiencia del proyecto no se trata de muchos, sino de aspectos destacados.

6. Si hay demasiado contenido, no hay necesidad de comprimir el contenido en una sola página, solo mantenga el diseño limpio y ordenado.

Ali información interna 7. Lo mejor es agregar al final del currículum:

"Gracias por tomarse el tiempo de leer mi currículum y espero tener la oportunidad de trabajar con usted". Esta frase es obvia.

Serás muy educado.

10. ¿Tiene alguna pregunta sobre nuestra empresa?

fondo

Una entrevista es un proceso de prueba mutua. Por lo tanto, no sólo los buscadores de empleo quieren saber cómo se siente el entrevistador acerca de nosotros, sino que el entrevistador también quiere

Escuche lo que piensa del negocio. Entonces, antes de cerrar, a menudo me hacen la siguiente pregunta:

"¿Qué opinas de la empresa?

Para ser honesto, cuando el editor entrevistaba, tenía miedo de que me preguntaran "¿Qué piensas de la empresa?" / "¿Qué más quieres preguntar?" / "Tu ocupación

¿Qué es la planificación?

" y otras preguntas. Es demasiado falso y vacío, y es realmente aburrido. Pero no hay manera, preguntó el entrevistador, y tenemos que responderlo, así que

Solo puedo morder la bala y "hacer ruido". Cuando las cosas van bien, está bien, pero cuando las cosas van mal, a menudo me molestan, y así pierdo la oportunidad de conseguirlo.

reunión. Lentamente, me volví más y más consciente de la importancia de tales preguntas en las entrevistas, así que resumí un conjunto de métodos de afrontamiento y los compartí con todos.

Disfrutar. Bueno, solo como referencia.

Respuesta general: hablar sobre la historia de la empresa, productos

Presumiblemente, la gran mayoría de los solicitantes de empleo harán su tarea antes de la entrevista. Se debe dominar la comprensión de la historia y los productos de la empresa.

un item. Si realmente no sabe cómo responder a la pregunta "¿qué piensa de la empresa?", es mejor que hable primero sobre su empresa.

Comprenda el perfil de la empresa y hágale saber al entrevistador que está aquí preparado, no salsa de soja.

Otra respuesta: hablar sobre el perfil de la empresa + planificación personal

Buscar ventajas y evitar desventajas es una característica común a todos. Ante preguntas de la entrevista que no se pueden controlar bien, la mejor manera es cambiar el ángulo y poner el

La respuesta lleva a su campo de especialización. Cuando se le hagan las preguntas anteriores, primero puede explicar lo que sabe sobre la empresa y luego concluir

Combine algún contenido, hable sobre su plan después de llegar al puesto y el trabajo que se puede llevar a cabo. Por ejemplo, en qué medida se puede hacer el trabajo, la empresa

Qué forma se usará para pagar cosas como esa, de todos modos, hable más sobre sus verdaderos pensamientos y logros actuales, mantenga una mente normal, siempre y cuando trabaje duro

Trate de hacer alguna tarea antes de la clase, definitivamente dejará una buena impresión en los demás.

respuesta de referencia

Debido a que su empresa es una empresa ideal en mi impresión y me proporcionó un puesto de trabajo, se puede decir que estoy muy interesado en la cultura corporativa de la empresa.

Tiene una comprensión relativamente objetiva de la construcción de la empresa y las condiciones de funcionamiento de la empresa. Los salarios e ingresos del personal son estables. Las normas de gestión de la empresa son muy buenas.

El servicio de logística, etc., son cosas buenas para observar. Lo que más me conmueve es: los gerentes en todos los niveles de la empresa están tan entusiasmados, lo que me da la sensación

Es como en casa. ¡Creo que trabajar en una empresa así es lo que todos anhelan!

11. Mucha gente está obsesionada con la autopresentación

Caso 1: ¿Cómo captar el momento de la autopresentación?

Xiao Liu, quien se graduó de la escuela de posgrado, es muy hablador y elocuente. Piensa que es fácil presentarse, por lo que nunca se prepara.

Ve lo que la gente esta comentando. Su objetivo de búsqueda de empleo es la planificación inmobiliaria. Una vez, solicitó un trabajo en una gran empresa local de bienes raíces.

Durante la introducción, habló mucho sobre la tendencia de la industria inmobiliaria, pero el entrevistador tuvo que retirar el tema porque estaba demasiado alejado del tema. solo presentación propia

Puede "parar a mitad de camino".

Sugerencia de información interna de Ali : hablar sobre un contenido en un minuto

El tiempo para la presentación personal es generalmente de 3 minutos. En términos de asignación de tiempo, puede hablar sobre las condiciones personales básicas, como los antecedentes educativos, en el primer minuto y hablar sobre su situación personal básica en el segundo minuto.

Puede hablar sobre su experiencia laboral en un minuto y la práctica social relevante para recién graduados y sus ideales e ideales para esta posición en el tercer minuto.

puntos de vista sobre la industria. Si se requiere que la autopresentación se complete en 1 minuto, la autopresentación debe ser enfocada y prominente, no tan buena como

el restante.

En la práctica, algunos solicitantes no entienden la importancia de la auto presentación, sino que simplemente presentan su nombre, identidad y otros.

Finalmente, agregué información sobre mi formación académica, experiencia laboral, etc. Terminé mi autopresentación en aproximadamente medio minuto y luego miré el examen.

Oficial, es bastante inapropiado esperar las siguientes preguntas, y es una pérdida de una valiosa oportunidad para recomendarse al entrevistador. mientras otros

Tampoco es prudente que los candidatos intenten exprimir toda su experiencia en estos pocos minutos. Organizar la auto-presentación razonablemente

Cuando sea el momento adecuado, resaltar los puntos clave es lo primero a considerar.

Caso 2: ¿Cómo prepararse para la autopresentación?

Xiaofang fue a solicitar un trabajo en un medio del sur y la entrevista se llevó a cabo en una oficina grande, con cinco personas en un grupo pequeño, discutiendo libremente sobre el tema. fideos

El examinador le pidió a cada solicitante que se presentara primero, y Xiaofang fue el segundo. A diferencia de los solicitantes anteriores que presentaron cada oración, ella lo había hecho antes.

Para prepararme, escribí un párrafo de lo que había hecho en los cuatro años de universidad, e hice algunas modificaciones, prestando atención a la rima, que suena a rima pequeña. (trabajo

Field Entrepreneurship www.lz13.cn) La introducción de Xiaofang es muy fluida, pero la mosca en el ungüento es que le da a la gente la sensación de estar recitando.

Sugerencia: No adoptes un tono de " recitado "

Los expertos en recursos humanos señalaron que la autopresentación se puede preparar con anticipación, o puede encontrar algunos amigos para practicar con anticipación, pero la autopresentación debe evitarse.

El rigor y la moderación del lenguaje escrito deben utilizarse para organizar un lenguaje oral flexible. No te presentes en el tono de recitar en voz alta, si

En ese caso, será insoportable para el entrevistador. Al presentarse, preste atención a la voz, intente que el tono de voz sea suave y natural,

lleno de confianza.

Caso 3: ¿Cómo hablar de logros al presentarse?

Xiao Wang fue a solicitar un trabajo de redacción publicitaria en una organización de producción de programas de televisión. Durante la entrevista, la otra parte primero le pidió que hablara sobre la experiencia práctica relevante. Pequeño

Aunque la especialidad de Wang es periodismo y comunicación, prefiere los medios impresos y tiene poca práctica en la producción de programas de televisión. ¿qué hacer?

Xiao Wang no tuvo más remedio que hablar sobre algunas de las actividades del campus en las que solía participar. Suena muy rico, pero no tiene casi nada que ver con la televisión.

Sugerencia: Solo mencione las ventajas relacionadas con el puesto

Al presentarse, debe elegir sus propios logros, y estos logros deben estar relacionados con la naturaleza comercial de la empresa que está solicitando ahora. Durante la entrevista, Ud.

No solo dígale al examinador lo bueno que es, sino también dígale lo adecuado que es para este trabajo. los que no tienen nada que ver con la entrevista

Incluso si son las ventajas y fortalezas de las que estás orgulloso, tienes que rendirte a regañadientes.

Al presentar los resultados, el orden de los discursos también es extremadamente importante, debes poner primero las cosas que más quieres que el entrevistador sepa.

El amor es a menudo el trabajo que más te enorgullece y también puede impresionar al entrevistador.

Caso 4: Aprende a utilizar algunos consejos a la hora de presentarte

Información interna de Ali Afeng participó en la feria de empleo del campus de una gran empresa estatal el año pasado. Ese día se llevó a cabo en un gran estadio y el equipo se alineó a la salida.

En la oficina, cada solicitante solo tiene unos minutos para hablar con el entrevistador, cómo obtener el favor del entrevistador en tan poco tiempo.

¿Qué tal pasar a la siguiente ronda? Afeng renunció a la presentación regular, pero se concentró en presentarle al entrevistador un proyecto que completó.

Evaluación del instructor como evidencia de apoyo. Gracias a un poco de habilidad, Afeng pasó con éxito este tipo de entrevista de "audición".

Sugerencia: presuponer decir la verdad

A la hora de presentarte, debes destacar tus ventajas y especialidades personales, puedes utilizar algunas pequeñas técnicas, como presentar lo que has hecho

Proyectos para verificar que tiene una cierta habilidad, y también puede citar adecuadamente los comentarios de otras personas, como maestros, amigos, etc., para respaldar su propia descripción.

fijado. Pero no importa qué tipo de trucos uses, debes insistir en hablar con hechos y usar menos palabras funcionales, interjecciones y similares. Presumir de ti mismo suele ser difícil

escapar a los ojos del entrevistador. En cuanto a hablar de debilidades, debes estar tranquilo, optimista y confiado.

Caso 5: ¿Cómo deshacerse del miedo escénico en la autopresentación?

Ahong se graduó de una universidad en una ciudad central y se fue al sur a Guangdong con su anhelo. Como soy un estudiante universitario, he trabajado mucho en mi investigación.

En el mercado de talentos, la confianza en sí mismo de Ah Hong es un poco escasa y, a menudo, muestra miedo escénico cuando se enfrenta a los entrevistadores, a veces está muy nervioso y no puede hablar con libertad.

Por supuesto. También entiende que esta situación no es propicia para las entrevistas, pero no encuentra la manera de regularse.

Sugerencia: use el " principio 3P " en la conversación

Los expertos en recursos humanos señalaron que cuando te presentas, debes recordar el "principio de las 3P": confianza en uno mismo (Positivo), personalidad

(Personal), pertinente (Pertinente). La respuesta debe ser tranquila, resaltar tu personalidad, enfatizar tu profesionalismo y habilidad, y hablar en un tono pertinente.

No exageres.

Al presentarse, debe ajustar sus emociones, ser inexpresivo y rígido al presentar su situación básica;

Es inmaduro estar eufórico y emocionado cuando se habla de deficiencias, y apático y lento cuando se habla de deficiencias. para mesa

Da, sugiero que Ah Hong pueda practicar con sus amigos, o practicar frente al espejo un par de veces antes de ir a la entrevista.

13 , cómo hablar con recursos humanos , cómo hablar de salario

Antes de hablar de salario, primero debes entender el mercado, solo conociéndote a ti mismo y al enemigo puedes ganar cada batalla, por lo que todos deben tener claro lo que debes hacer antes de la entrevista.

¿Cuál es el salario estándar en esta industria? Puede ir a los principales sitios web de contratación para ver la descripción del puesto que está solicitando.

¿Cómo es el nivel de salario? Además de conocer el nivel salarial del puesto que está solicitando en el sitio web de reclutamiento, también debe preguntar algunos

Pregunta a amigos o compañeros de clase que trabajen en esta categoría para averiguarlo. Una vez que comprenda claramente el nivel salarial, no parecerá particularmente despistado cuando negocie el salario.

enojado.

Ten confianza y no tengas miedo de hablar de salario con RR.HH. Esta etapa de negociación salarial es inevitable en el proceso de entrevista de trabajo. Debemos tener confianza.

No actúes tímido. Recuerda que mientras seas lo suficientemente profesional y no tengas un mal desempeño, el entrevistador no

La pregunta no le da una Oferta. Así que sea audaz cuando negocie el salario y deje que la otra parte vea su confianza. Incluso si realmente no hay recursos humanos al final

No importa si está contratado, si es un gran problema, ¡búsquelo de nuevo! Hablar de salario es una prueba para la mentalidad y la capacidad de negociación de todos, así que no se asuste.

¡Sé capaz de buscar beneficios para ti mismo!

No revele sus cartas ocultas prematuramente cuando discuta el salario con la información interna de Ali. Durante el proceso de negociación salarial, las cartas ocultas de todos no deben revelarse demasiado pronto, porque una vez que las revela, entonces

perdió la iniciativa. ¡Si eres pasivo, probablemente perderás la oportunidad de negociar un salario alto! Por lo tanto, cuando esté entrevistando, no se exceda.

Acude a Recursos Humanos para hablar de cuestiones salariales desde el principio, incluso si te pregunta sobre los requisitos salariales desde el principio, debes cambiar de tema con tacto. en no

Es realmente una desventaja revelar sus tarjetas demasiado pronto cuando está seguro de que la compañía está interesada en usted y quiere que se una a ellos.

Comprenda el sistema salarial de la empresa y luego evalúelo Cuando Recursos Humanos le pregunte sobre sus requisitos salariales, no se apresure a dar su propio precio psicológico.

Primero puede preguntar cómo es el sistema salarial de su empresa y luego hablar sobre el salario en función de su situación real. primero necesitas rootear

Vuelva a evaluar su precio psicológico de acuerdo con el nivel salarial de la empresa y otros beneficios, y finalmente proporcione un rango salarial adecuado. Dar

Todo el mundo debe mantener su base en el rango salarial y no hacer concesiones fácilmente.

14. Las 20 preguntas que más le gusta hacer a RR. HH. a los programadores

以下整理出 HR 最喜欢问的 20 个问题,答案供大家思维发散,大家只需了解这些问题,提前想一

下,即可,就能在面试中不被打的措手不及。大家有疑问的,也可以在读者圈中提出,我可以进行

解答。

1. 请你自我介绍一下你自己?

2. 你对加班的看法?

3. 你对薪资的要求?

4. 你的职业规划?

5. 你还有什么问题要问吗?

6. 如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么

办?

7. 在完成某项工作时,你认为领导要求的方式不是最好的,自己还有更好的方法,你应该怎么

做?

8. 如果你的工作出现失误,给本公司造成经济损失,你认为该怎么办?

9. 谈谈你对跳槽的看法?

10. 工作中你难以和同事、上司相处,你该怎么办?

11. 为什么要离职?

12. 对工作的期望与目标何在?

13. 就你申请的这个职位,你认为你还欠缺什么?

14. 你和别人发生过争执吗?你是怎样解决的?

15. 如果我录用你,你将怎样开展工作?

16. 如果你在这次面试中没有被录用,你怎么打算?

17. 谈谈如何适应办公室工作的新环境?

18. 工作中学习到了些什么?

19. 除了本公司外,还应聘了哪些公司?

20. 何时可以到职?

这些问题在面试之前,尤其是相对有点规模的公司,HR说话的分量蛮重的,所以建议把这些问题都

大致想想,如果面试中遇到如何应对。

阿里内部资料15、面试中的礼仪与举止

注意细节

平复一下紧张的情绪,然后从容地走进面试地点,轻轻敲一下门,得到允许后进 去,开关门动作要

轻柔缓和,面对面试官微笑主动打招呼示好,称呼得体,现在一般流行叫老 师,那么你可以称呼各

位老师好。不要急于落座,面试官示意你请坐的时候再道谢坐下,坐下 后身体保持挺直,不要显得

大大咧咧,满不在乎,避免引起对方的反感。面试过程中微笑并仔 细聆听,面试结束微笑起立,道

谢并再见。 谈话技巧

认真聆听对方的问题和介绍,适当点头示意或提问,回答问题时要口齿清晰、音量 适中、语言简

práctica, significado claro. No interrumpa la pregunta del entrevistador, ni tenga una disputa con el entrevistador sobre un tema determinado,

Si el desacuerdo puede

Guarde silencio y recuerde no discutir con la otra parte con impaciencia, lo cual es una pérdida de tiempo y emoción. Para algunas preguntas que no sé

Preguntas, puedes responder con la verdad, no digas tonterías. No se impaciente cuando le pida al entrevistador que se detenga en las preguntas que no desea responder.

Mantén tu propio comportamiento. Buenos modales

No solo el lenguaje puede reflejar el autocultivo interior de una persona, sino que también los modales, la humildad y la cortesía también pueden reflejar su calidad y autocultivo. Lugar

Por lo tanto, durante el proceso de la entrevista, la actitud adecuada es comportarse con elegancia, hablar con modestia y cautela, y tener una actitud positiva y entusiasta. Al responder preguntas, mire

Los ojos de la otra parte muestran respeto. Los ojos deben ser firmes y confiados, no erráticos, de lo contrario parecerá desconfiado o incluso frívolo, y las dos partes tienen opiniones diferentes.

No discutas con otros emocionalmente en unidad, pero no seas humilde ni autoritario, y tómatelo con calma. Si se trata de algunos puestos especiales, no se descarta

No intente de esta manera, si no está en el estado de ánimo adecuado, entonces puede quedarse corto. Evita los pequeños trucos

Este artículo debe dividirse en el artículo anterior, pero en vista del comportamiento subconsciente de muchas personas, se menciona especialmente. Muchas personas tienen pequeñas

El hábito del movimiento, algunos son deliberados, algunos son subconscientes, cuando la mente está nerviosa, habrá más pequeños movimientos. Demasiados pequeños gestos para mostrar

Estás nervioso, inseguro de ti mismo y distraído, dándote una mala impresión. Como rascarse la cabeza, frotarse las manos, hurgarse la nariz, pisotear

pies, etc

Supongo que te gusta

Origin blog.csdn.net/m0_67979925/article/details/128907660
Recomendado
Clasificación