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).
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:
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.