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.

Diseño del sistema de programación de informes utilizando la base de datos como maestra.

Problema

  • tenemos ~50k informes financieros programados que periódicamente entregamos a los clientes por correo electrónico
  • los informes tienen su propia frecuencia de entrega (formato de fecha y hora – configurado por los clientes)
    • semanalmente
    • a diario
    • cada hora
    • solo días de la semana
    • etc.

Arquitectura actual

  • tenemos una tabla llamada report_metadata que contiene la información de los informes
    • report_id
    • nombre_del_informe
    • tipo_del_informe
    • detalles_del_informe
    • siguiente_hora_ejecución
    • última_hora_ejecución
    • etc…
  • cada semana, las 6 instancias de nuestro servicio planificador consultan la base de datos report_metadata, extraen los metadatos de todos los informes que se entregarán la siguiente semana y los colocan en una cola_schedule en memoria.

  • Solo en la instancia principal/líder (que es una de las 6 instancias):
    • los datos en la cola_schedule se extraen en el momento adecuado
    • procesados
    • se realizan algunas llamadas a la API para obtener un informe completamente completo y actualizado
    • y se envía el informe por correo electrónico a los clientes
  • las otras 5 instancias no hacen nada, simplemente existen para redundancia

Arquitectura propuesta

Números:
– la base de datos puede manejar hasta 1000 conexiones concurrentes – lo cual es suficiente
– el número total de informes existentes (~50k) es poco probable que aumente mucho en un futuro cercano/lejano

Solución:

  • en lugar de consultar la base de datos report_metadata cada semana y almacenar los datos en una cola_schedule en memoria, las 6 instancias consultarán la base de datos report_metadata cada 60 segundos (con un desplazamiento de 10 s para cada instancia)
  • en promedio, el planificador intentará recoger trabajo cada 10 segundos
  • se extraen los datos de cualquier informe cuya siguiente_hora_ejecución esté en el pasado, se bloquea la fila de la tabla, y el informe se procesa/entrega a los clientes por esa instancia específica
  • después de que el informe se procesa correctamente, se desbloquea la fila de la tabla y se actualizan la siguiente_hora_ejecución, última_hora_ejecución, etc. del informe

En general, la base de datos actúa como el maestro, las instancias individuales del proceso pueden trabajar de forma independiente y la base de datos se encarga de que no se superpongan.

Sería de ayuda si pudiera decirme si la arquitectura propuesta es:

  • una buena/solución correcta
  • qué columnas de la tabla pueden/deben tener índices
  • cualquier otra consideración
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución propuesta y consideraciones

    Solución

    La solución propuesta es una buena opción, ya que reduce la carga en el servidor al distribuir el trabajo entre las instancias disponibles. Además, elimina el uso de una cola de tiempo en memoria, que puede volverse poco confiable con el tiempo, dado el gran número de informes financieros y la frecuencia de entrega.

    Por otro lado, al utilizar la base de datos como maestra, no habrá ninguna superposición de instancias trabajando en el mismo informe, y el bloqueo de la fila de la tabla asegurará que solo una instancia trabaje en un informe en cualquier momento.

    Columnas indexadas

    Crear índices adecuados para la tabla puede mejorar el rendimiento y reducir la sobrecarga. Los índices deben minimizar el número de lecturas necesarias para extraer datos de la tabla.

    Las siguientes columnas deben tener índices:

    • next_run_time
    • last_run_time
    • report_type

    Indexar las columnas next_run_time y last_run_time será útil ya que las instancias accederán a informes cuyo next_run_time esté en el pasado.

    Indexar report_type también mejorará la consulta de la tabla por tipo de informe.

    Otras consideraciones

    • Es esencial asegurarse de que el tiempo de las instancias esté sincronizado con el tiempo del servidor de la base de datos, ya que esto afectará cuándo extraen los datos de la tabla.
    • El bloqueo de las filas de la tabla no debería afectar el rendimiento del sistema, dado el número relativamente pequeño de informes y la frecuencia de procesamiento.

    • El sistema debe rastrear cuánto tiempo tarda cada informe en procesarse y asegurarse de que se completen dentro de la frecuencia especificada.

    • Es fundamental manejar las fallas en caso de que una instancia falle o se desconecte, y otra instancia deba encargarse de sus tareas.

    En general, la arquitectura propuesta es factible, y la creación de índices adecuados y el seguimiento del tiempo de procesamiento de los informes son optimizaciones cruciales para mejorar su eficiencia.

Comments are closed.