es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo pausar y reanudar el consumidor de RMQ en Java

RMQConsumer en mi código es un objeto Spring Bean que se inicializa al iniciar el contenedor de Spring.
Comienza a escuchar los mensajes de RMQ en la cola tan pronto como ese Bean de Spring esté listo, independientemente de si todo el contenedor de Spring está listo o no.
Deseo comenzar a consumir mensajes solo cuando el estado del pod de Kubernetes sea 1/1. Durante la implementación en rolling, los pods antiguos no se terminan a menos que los nuevos pods tengan el estado 1/1, lo que causa casi el doble de la cantidad de pods y aumenta la tasa de consumo, lo cual no es deseado en mi caso por algunas razones.

Lo que intenté
Eliminé el método channel.basicConsume de la API de RMq que se ejecutaba en el Bean postConstruct. Y agregué el código en un método del controlador Rest bajo el endpoint ‘/postStart’, que configuré en el archivo de implementación de Kubernetes bajo el hook de ciclo de vida ‘postStart’, pero parece que no funciona. El hook se llama antes de que la aplicación Spring incluso imprima su primer registro (verificado con marcas de tiempo).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución: Retrasar RMQ Consumer Hasta que el Estado del Pod de Kubernetes sea 1/1

    Como experto en TI especializado en spring-boot, kubernetes, containers, hook y rmq, necesitas retrasar el consumidor RMQ en tu código hasta que el estado del pod de Kubernetes sea 1/1 para evitar la duplicación del recuento de pod y los picos en las tasas de consumo. Esto es lo que puedes hacer:

    1. Eliminar el Método RMQ BasicConsume del Objeto Spring Bean

    Elimina el método channel.basicConsume de la API de RMQ que se ejecuta en el postConstruct del Bean. Este método comienza a escuchar los mensajes de RMQ en la cola tan pronto como el Bean de Spring está listo, independientemente de si todo el contenedor de Spring está listo o no.

    2. Agregar Código del Consumidor RMQ en un Método del Controlador Rest

    Agrega el código del consumidor RMQ en un método del controlador Rest bajo un endpoint. Por ejemplo, puedes agregarlo bajo el endpoint /postStart. Puedes configurar este endpoint en el archivo de implementación de Kubernetes bajo el gancho del ciclo de vida de postStart.

    3. Retrasar la Ejecución del Código del Consumidor RMQ

    Para retrasar la ejecución del código del consumidor RMQ hasta que el estado del pod de Kubernetes sea 1/1, puedes agregar un retraso al gancho del ciclo de vida en el archivo de implementación de Kubernetes. Por ejemplo, puedes agregar un comando de sleep al script del gancho, de esta manera:

    lifecycle:
      postStart:
        exec:
          command:
            - sh
            - -c
            - >
              sleep 30;
              curl http://localhost:8080/postStart;
    

    Este comando retrasará la ejecución del comando curl en 30 segundos, permitiendo tiempo para que el pod de Kubernetes se inicie y alcance el estado 1/1 antes de que se ejecute el código del consumidor RMQ.

    4. Verificar la Solución

    Para verificar que la solución funcione, verifica los registros de tu aplicación Spring. Deberías ver que el código del consumidor RMQ se ejecuta solo después de que el estado del pod de Kubernetes sea 1/1. Si aún tienes problemas, es posible que necesites solucionar problemas en tu archivo de implementación de Kubernetes y en el script del gancho para asegurarte de que estén configurados correctamente.

Comments are closed.