You've already forked Curso-lenguaje-python
Add kafka test
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# Usa una imagen base de Python
|
||||
FROM python:3.9-slim
|
||||
|
||||
# Configura el directorio de trabajo
|
||||
WORKDIR /app
|
||||
|
||||
# Copia el archivo de requisitos al contenedor
|
||||
COPY requirements.txt /app/
|
||||
|
||||
# Instala las dependencias
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copia el script de Python al contenedor
|
||||
COPY consumer-notification.py /app/
|
||||
|
||||
# Comando por defecto para ejecutar el script
|
||||
CMD ["python", "consumer-notification.py"]
|
||||
@@ -0,0 +1,66 @@
|
||||
import json
|
||||
import logging
|
||||
from time import sleep
|
||||
from kafka import KafkaConsumer
|
||||
|
||||
# Configuración del registro
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
# Nombre del tema de Kafka del que se consumen los mensajes
|
||||
parsed_topic_name = 'parsed_recipes'
|
||||
|
||||
# Umbral de calorías para la notificación
|
||||
calories_threshold = 200
|
||||
|
||||
# Crear un consumidor de Kafka
|
||||
consumer = KafkaConsumer(
|
||||
parsed_topic_name,
|
||||
auto_offset_reset='earliest', # Inicia desde el 1er mensaje si es nuevo
|
||||
bootstrap_servers=['kafka:9092'], # Servidor Kafka
|
||||
api_version=(0, 10), # Versión de la API de Kafka
|
||||
# Tiempo máx. de espera mensajes (milisegundos)
|
||||
consumer_timeout_ms=2000
|
||||
)
|
||||
|
||||
logging.info('[+] Iniciando el consumidor de notificaciones...')
|
||||
|
||||
try:
|
||||
|
||||
for msg in consumer:
|
||||
|
||||
# Decodificar el mensaje de JSON
|
||||
record = json.loads(msg.value)
|
||||
|
||||
# Obtener el valor de calorías
|
||||
calories = int(record.get('calories', 0))
|
||||
title = record.get('title', 'Sin título') # Obtener el título
|
||||
|
||||
# Verificar si las calorías exceden el umbral
|
||||
if calories > calories_threshold:
|
||||
logging.warning(
|
||||
f'[!] Alerta: {title} tiene {calories} calorías')
|
||||
|
||||
# Esperar 5 segundos antes de procesar el siguiente mensaje
|
||||
sleep(5)
|
||||
|
||||
except Exception as ex:
|
||||
|
||||
logging.error(
|
||||
'[!] Error en el consumidor de notificaciones', exc_info=True)
|
||||
|
||||
finally:
|
||||
|
||||
if consumer is not None:
|
||||
consumer.close() # Cerrar el consumidor al finalizar
|
||||
logging.info('[i] Consumidor cerrado.')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
main()
|
||||
@@ -0,0 +1 @@
|
||||
kafka-python
|
||||
Reference in New Issue
Block a user