Tengo una aplicación que ha generado una discusión bastante acalorada entre un par de desarrolladores.
Básicamente, se divide en una capa web y una capa de fondo. La capa web recopila información mediante un formulario web simple, almacena estos datos como un documento JSON (literalmente un archivo .json) en una carpeta de observación utilizada por el back-end. El back-end sondea esta carpeta cada pocos segundos, recoge el archivo y lleva a cabo sus funciones.
Los archivos en sí son muy simples (es decir, todos los datos de cadena, sin anidamiento), y alrededor de 1-2k como máximo, con el sistema pasando la mayor parte de su tiempo inactivo (pero reventando hasta 100 mensajes en un momento dado). El paso de procesamiento de backend tarda unos 10 minutos por mensaje.
El argumento surge cuando un desarrollador sugiere que usar el sistema de archivos como una capa de mensajería es una mala solución, cuando algo como una base de datos relacional (MySQL), una base de datos noSQL (Redis) o incluso una simple llamada REST API debería usarse en su lugar.
Cabe señalar que Redis se utiliza en otras partes de la organización para el manejo de mensajes en cola.
Los argumentos que he escuchado se desglosan de la siguiente manera
A favor de los archivos planos:
Los archivos planos son más confiables que cualquier otra solución, ya que el archivo solo se mueve de una carpeta de "observación", a una carpeta de "procesamiento" después de ser recogido, y finalmente a una carpeta "listo" cuando finaliza. No hay riesgo de que los mensajes desaparezcan, salvo errores de muy bajo nivel que de todos modos romperían otras cosas.
Los archivos planos requieren menos sofisticación técnica para comprender, solo
cat
eso. Sin consultas para escribir, sin riesgo de que accidentalmente aparezca un mensaje de la cola y que desaparezca para siempre.El código de administración de archivos es más simple que las API de bases de datos desde el punto de vista de la programación, ya que es parte de la biblioteca estándar de cada idioma. Esto reduce la complejidad general de la base del código y la cantidad de código de terceros que debe introducirse.
El principio de YAGNI establece que los archivos planos funcionan bien en este momento, no hay necesidad demostrada de cambiar a una solución más complicada, así que déjelo.
A favor de una base de datos:
Es más fácil escalar una base de datos que un directorio lleno de archivos
Los archivos planos tienen el riesgo de que alguien copie un archivo "hecho" de nuevo al directorio "watch". Debido a la naturaleza de esta aplicación (administración de máquinas virtuales), esto podría resultar en una pérdida de datos catastrófica.
Al exigir más sofisticación técnica a T / S, la aplicación significa que es menos probable que el personal sin educación arruine algo simplemente hurgando en las cosas.
El código de conexión de la base de datos, especialmente para algo como Redis, es al menos tan robusto como las funciones estándar de administración de archivos de la biblioteca.
El código de conexión de base de datos es visiblemente (si no funcionalmente) más simple desde el punto de vista del desarrollador, ya que es más alto que la manipulación de archivos.
Por lo que puedo ver, ambos desarrolladores tienen muchos puntos válidos.
Entonces, de estas dos personas, el desarrollador de pro-archivos o el desarrollador de pro-bases de datos, ¿cuál está más en línea con las mejores prácticas de ingeniería de software y por qué?