Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

434
Vistas
¿Cómo hacer que el mecanismo de reintento de GRPC funcione con grpc-java en el clúster de Kubernetes?

He intentado que el equilibrio de carga de GRPC funcione en mi aplicación Java implementada en un clúster de Kubernetes, pero no he tenido demasiado éxito. No parece haber demasiada documentación sobre esto, pero a partir de ejemplos en línea puedo ver que ahora debería poder usar '.defaultLoadBalancingPolicy("round_robin")' al configurar ManagedChannel (en versiones posteriores de GRPC Java lib) .

Para ser más específico, estoy usando la versión 1.34.1 de las bibliotecas GRPC Java. Creé dos aplicaciones Spring Boot (v2.3.4), una llamada grpc-sender y otra llamada grpc-receiver.

grpc-sender actúa como un cliente GRPC y define un ManagedChannel (Netty) como:

 @Bean public ManagedChannel greetingServiceManagedChannel() { String host = "grpc-receiver"; int port = 6565; return NettyChannelBuilder.forAddress(host, port) .defaultLoadBalancingPolicy("round_robin") .usePlaintext().build(); }

Entonces grpc-receiver actúa como el servidor GRPC:

 Server server = ServerBuilder.forPort(6565) .addService(new GreetingServiceImpl()).build();

Estoy implementando estas aplicaciones en un clúster de Kubernetes (que se ejecuta localmente en minikube por el momento) y he creado un servicio para la aplicación grpc-receiver como un servicio sin cabeza, de modo que se pueda lograr el equilibrio de carga de GRPC.

Para probar las solicitudes fallidas, hago dos cosas:

  • elimine uno de los pods de grpc-receiver durante la ejecución de una prueba; por ejemplo, cuando solicité a grpc-sender que envíe, digamos, 5000 solicitudes a grpc-receiver. Grpc-sender detecta que se eliminó el pod y actualiza su lista de pods receptores, y enruta las solicitudes futuras a los nuevos pods. Como era de esperar, algunas de las solicitudes que estaban en vuelo durante la destrucción del pod fallan con el estado GRPC NO DISPONIBLE.
  • tenga alguna lógica simple en grpc-receiver que genere un número aleatorio y si ese número aleatorio está por debajo, digamos, 0.2, devuelva Grpc Status INTERNAL en lugar de OK.

Con los dos anteriores, puedo obtener una proporción de las solicitudes durante una ejecución de prueba para fallar. Ahora lo que estoy tratando de hacer que funcione el mecanismo de reintento de GRPC. Al leer la escasa documentación, estoy haciendo lo siguiente:

 return NettyChannelBuilder.forAddress(host, port) .defaultLoadBalancingPolicy("round_robin") .enableRetry() .maxRetryAttempts(10) .usePlaintext().build();

Sin embargo, esto parece no tener ningún efecto y no puedo ver que las solicitudes fallidas se vuelvan a intentar.

Veo que esto todavía está marcado como una característica de @ExperimentalApi, entonces, ¿debería funcionar como se esperaba y se ha implementado?

Si es así, ¿hay algo obvio que me estoy perdiendo? ¿Algo más que deba hacer para que los reintentos funcionen?

¿Alguna documentación que explique cómo hacer esto con más detalle?

Muchas gracias de antemano...

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

ManagedChannelBuilder.enableRetry().maxRetryAttempts(10) no es suficiente para que se produzca el reintento. El reintento necesita una configuración de servicio con RetryPolicy definida. Una forma es establecer una configuración de servicio predeterminada con RetryPolicy, consulte el ejemplo de reintento en https://github.com/grpc/grpc-java/tree/v1.35.0/examples

Ha habido cierta confusión en el javadoc de maxRetryAttempts(), y se aclara en https://github.com/grpc/grpc-java/pull/7803

over 4 years ago · Santiago Trujillo Denunciar

0

¡Muchas gracias @user675693! Eso funcionó perfectamente :)

El funcionamiento de maxRetryAttempts() es ciertamente un poco confuso.

De la documentación puedo ver que:

"maxAttempts DEBE especificarse y DEBE ser un valor entero JSON superior a 1. Los valores superiores a 5 se tratan como 5 sin que se consideren un error de validación".

Refiriéndose a maxAttempts en la configuración del servicio. Si queremos más de 5 intentos, puedo configurarlo como maxRetryAttempts(10), por ejemplo, en mi configuración de ManagedChannel:

 return NettyChannelBuilder.forAddress(host, port) .defaultLoadBalancingPolicy("round_robin") .defaultServiceConfig(config) .enableRetry() .maxRetryAttempts(10) .usePlaintext().build();

Pero para que esa configuración se use correctamente, necesito configurarla como 10 en la configuración del servicio Y el código de configuración de ManagedChannel; de lo contrario, solo se realizan 5 reintentos. No está claro en el Javadoc o en la documentación, pero eso es lo que parece suceder en mis pruebas.

Además, esta funcionalidad de reintento está marcada como @ExperimentalApi. ¿Qué tan maduro es, es adecuado para ser utilizado en la producción? ¿Es probable que cambie drásticamente?

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda