Comprender el umbral de autopreservación y renovación de Spring Cloud Eureka Server

82

Soy nuevo en el desarrollo de microservicios, aunque he estado investigando al respecto durante un tiempo, leyendo los documentos de Spring y Netflix.

Comencé un proyecto simple disponible en Github . Es básicamente un servidor Eureka (Archimedes) y tres microservicios cliente Eureka (una API pública y dos privadas). Consulte el archivo Léame de github para obtener una descripción detallada.

El punto es que cuando todo está funcionando me gustaría que si uno de los microservicios privados se mata, el servidor Eureka se dé cuenta y lo elimine del registro.

Me encontré con esta pregunta en StackOverflow , y la solución pasa por utilizar enableSelfPreservation:falseen la configuración del servidor de Eureka. Al hacer esto después de un tiempo, el servicio desactivado desaparece como se esperaba.

Sin embargo, puedo ver el siguiente mensaje:

EL MODO DE AUTO CONSERVACIÓN ESTÁ APAGADO. ESTO PUEDE NO PROTEGER LA CADUCIDAD DE LA INSTANCIA EN CASO DE PROBLEMAS DE RED U OTROS.

1. ¿Cuál es el propósito de la autoconservación? El documento establece que con la autopreservación en "los clientes pueden obtener las instancias que ya no existen" . Entonces, ¿cuándo es aconsejable tenerlo encendido / apagado?

Además, cuando la autoconservación está activada, es posible que reciba un mensaje pendiente en la advertencia de la consola del servidor Eureka:

¡EMERGENCIA! EUREKA PUEDE ESTAR RECLAMANDO INCORRECTAMENTE QUE LAS INSTANCIAS ESTÁN ACTIVADAS CUANDO NO LO ESTÁN. LAS RENOVACIONES SON MENORES QUE EL UMBRAL Y POR LO TANTO LAS INSTANCIAS NO SE ESTÁN EXPIRANDO SÓLO PARA SER SEGURO.

Ahora, continúe con Spring Eureka Console.

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

Me he encontrado con un comportamiento extraño del recuento de umbral: cuando inicio el servidor Eureka solo, el umbral es 1.

2. Tengo un solo servidor Eureka y está configurado registerWithEureka: falsepara evitar que se registre en otro servidor. Entonces, ¿por qué aparece en el recuento de umbral?

3. Por cada cliente que empiezo, el recuento del umbral aumenta en +2. Supongo que es porque envían 2 mensajes de renovación por minuto, ¿verdad?

4. El servidor Eureka nunca envía una renovación, por lo que la última renovación mínima siempre está por debajo del umbral. ¿Esto es normal?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

Cfg del servidor:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

Cliente 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true
codependiente
fuente
3
Quiero tomarme un tiempo para responder a esta pregunta. Es complicado. Algunas de las respuestas están en código Netflix y otras son configuración. Quiero que mi respuesta termine como parte de la documentación de Spring Cloud, pero probablemente será después del Día de Acción de Gracias a menos que mis colegas respondan antes de esa fecha.
spencergibb
Este es un pequeño trasfondo de Netflix: github.com/Netflix/eureka/wiki/…
spencergibb
Aquí hay más antecedentes: github.com/spring-cloud/spring-cloud-netflix/issues/373
spencergibb
8
@spencergibb esto se acerca a los 9 meses y no hay respuesta ... ¿alguna entrada?
Nick
1
@spencergibb Ya ha pasado más de un año. ¿Existe todavía la posibilidad de obtener una respuesta clara en algún momento? Algún tipo de regalo de Navidad :)
OcuS

Respuestas:

62

Recibí la misma pregunta que conocí en @codependent, busqué en Google mucho e hice algunos experimentos, aquí vengo a contribuir con algunos conocimientos sobre cómo funcionan el servidor y la instancia de Eureka.

Cada instancia debe renovar su arrendamiento a Eureka Server con una frecuencia de una vez cada 30 segundos, que se puede definir en eureka.instance.leaseRenewalIntervalInSeconds.

Renovaciones (último minuto) : representa la cantidad de renovaciones recibidas de la instancia de Eureka en el último minuto

Umbral de renovaciones: las renovaciones que el servidor de Eureka espera recibir de la instancia de Eureka por minuto.

Por ejemplo, si registerWithEurekase establece en falso , eureka.instance.leaseRenewalIntervalInSecondsse establece en 30 y ejecuta 2 instancias de Eureka. Dos instancias de Eureka enviarán 4 renovaciones al servidor de Eureka por minuto, el umbral mínimo del servidor de Eureka es 1 (escrito en código), por lo que el umbral es 5 (este número se multiplicará por un factor eureka.server.renewalPercentThresholdque se discutirá más adelante).

MODO DE AUTO CONSERVACIÓN : si Renova (último minuto) es menor que el umbral de Renovación , se activará el modo de autoconservación.

Entonces, en el ejemplo superior, el MODO DE SELF PRESERVATION está activado, porque el umbral es 5, pero el servidor Eureka solo puede recibir 4 renovaciones / min.

  1. Pregunta 1:

El MODO DE AUTO CONSERVACIÓN está diseñado para evitar fallas en la conectividad de la red. La conectividad entre la instancia A y B de Eureka es buena, pero B no pudo renovar su arrendamiento al servidor Eureka en un período corto debido a problemas de conectividad, en este momento el servidor Eureka no puede simplemente expulsar la instancia B. Si lo hace, instancia A no obtendrá el servicio registrado disponible del servidor Eureka a pesar de que B esté disponible. Así que este es el propósito del MODO DE AUTOCONSERVACIÓN, y es mejor activarlo.

  1. Pregunta 2:

El umbral mínimo 1 está escrito en el código. registerWithEurekase establece en falso, por lo que no habrá registros de instancias de Eureka, el umbral será 1.

En el entorno de producción, generalmente implementamos dos servidores Eureka y registerWithEurekalo configuramos como verdadero. Por lo tanto, el umbral será 2 y el servidor Eureka renovará la concesión para sí mismo dos veces por minuto, por RENEWALS ARE LESSER THAN THRESHOLDlo que no será un problema.

  1. Pregunta 3:

Sí, tiene usted razón. eureka.instance.leaseRenewalIntervalInSecondsdefine cuántas renovaciones se envían al servidor por minuto, pero multiplicará un factor eureka.server.renewalPercentThresholdmencionado anteriormente, el valor predeterminado es 0.85.

  1. Pregunta 4:

Sí, es normal, porque el valor inicial del umbral se establece en 1. Entonces, si registerWithEurekase establece en falso, las renovaciones siempre están por debajo del umbral.

Tengo dos sugerencias para esto:

  1. Implemente dos servidores Eureka y habilítelos registerWithEureka.
  2. Si solo desea implementar en un entorno de demostración / desarrollo, puede establecerlo eureka.server.renewalPercentThresholden 0.49, por lo que cuando inicie un servidor Eureka solo, el umbral será 0.
Nie Xing
fuente
Hola Nie Xing, ¿sabes cuál es el significado de la etiqueta: "
Caducidad del
Hola @jabrena, creo que significa que el arrendamiento caducará si la instancia no renueva su arrendamiento al servidor eureka. Podría estar relacionado con eureka.instance.leaseExpirationDurationInSeconds, cuyo valor predeterminado es 90 segundos. Si establece este valor en 0 o en un número negativo, la etiqueta podría cambiar a "Caducidad de arrendamiento habilitada: Falso". Puedes probarlo.
Nie Xing
¿Puedes responder a esto? stackoverflow.com/questions/48437752/…
Ankit Bansal
No funciona. Threshold = 0, Renews = 0 aún activa la advertencia.
SledgeHammer
Desactivé selfPreservationMode pero aún recibo este mensaje en Eureka - EUREKA PUEDE ESTAR RECLAMANDO INCORRECTAMENTE QUE LAS INSTANCIAS ESTÁN ACTIVADAS CUANDO NO LO ESTÁN. LAS RENOVACIONES SON MENORES QUE EL UMBRAL Y POR LO TANTO LAS INSTANCIAS NO SE ESTÁN EXPIRANDO PARA SER SEGURAS. ¿No debería suceder verdad?
DHRUV BANSAL
31

He creado una publicación de blog con los detalles de Eureka aquí , que completa algunos detalles que faltan del documento de Spring o del blog de Netflix. Es el resultado de varios días de depuración y búsqueda en el código fuente. Entiendo que es preferible copiar y pegar en lugar de vincular a una URL externa, pero el contenido es demasiado grande para una respuesta SO.

Abhijit Sarkar
fuente
2
Gracias por vincular una publicación tan aclaratoria. Una lectura recomendada !!
codependiente
2
Hola @Abhijit Sarkar, el artículo es increíble. Resolví muchas dudas de configuración.
jabreña
0

Puede intentar establecer un límite de umbral de renovación en las propiedades de su servidor eureka. Si tiene entre 3 y 4 microservicios para registrarse en eureka, puede configurarlo así:

eureka.server.renewalPercentThreshold=0.33
Vivek Sahu
fuente