J'ai une application qui a généré une discussion plutôt animée entre quelques développeurs.
Fondamentalement, il est divisé en une couche Web et une couche principale. La couche Web collecte des informations par un simple formulaire Web, stocke ces données sous forme de document JSON (littéralement un fichier .json) dans un dossier de surveillance utilisé par le serveur principal. Le serveur principal interroge ce dossier toutes les quelques secondes, récupère le fichier et exécute ses fonctions.
Les fichiers eux-mêmes sont très simples (c'est-à-dire toutes les données de chaîne, pas d'imbrication), et environ 1-2k au plus grand, avec le système passant la plupart de son temps inactif (mais éclatant jusqu'à 100 messages à tout moment). L'étape de traitement du backend prend environ 10 minutes par message.
L'argument survient lorsqu'un développeur suggère que l'utilisation du système de fichiers comme couche de messagerie est une mauvaise solution, lorsque quelque chose comme une base de données relationnelle (MySQL), une base de données noSQL (Redis) ou même un appel d'API REST ordinaire devrait être utilisé à la place.
Il convient de noter que Redis est utilisé ailleurs dans l'organisation pour la gestion des messages en file d'attente.
Les arguments que j'ai entendus se décomposent comme suit
En faveur des fichiers plats:
Les fichiers plats sont plus fiables que toute autre solution, car le fichier n'est déplacé d'un dossier "watch" vers un dossier "processing" qu'après avoir été récupéré, et finalement vers un dossier "done" une fois terminé. Il n'y a aucun risque de disparition des messages, à moins de bogues de très bas niveau qui pourraient de toute façon casser d'autres choses.
Les fichiers plats nécessitent moins de sophistication technique pour comprendre - juste
cat
cela. Aucune requête à écrire, aucun risque de sauter accidentellement un message de la file d'attente et de le faire disparaître pour toujours.Le code de gestion de fichiers est plus simple que les API de base de données du point de vue de la programmation, car il fait partie de la bibliothèque standard de chaque langue. Cela réduit la complexité globale de la base de code et la quantité de code tiers qui doit être introduit.
Le principe YAGNI stipule que les fichiers plats fonctionnent très bien en ce moment, il n'est pas nécessaire de passer à une solution plus compliquée, alors laissez-le.
En faveur d'une base de données:
Il est plus facile de faire évoluer une base de données qu'un répertoire plein de fichiers
Les fichiers plats présentent un risque que quelqu'un recopie un fichier "terminé" dans le répertoire "watch". En raison de la nature de cette application (gestion de machine virtuelle), cela pourrait entraîner une perte de données catastrophique.
Exigeant plus de sophistication technique pour T / S, l'application signifie que le personnel non éduqué est moins susceptible de gâcher quelque chose en se contentant de pousser les choses.
Le code de connexion DB, en particulier pour quelque chose comme Redis, est au moins aussi robuste que les fonctions de gestion de fichiers de bibliothèque standard.
Le code de connexion DB est visiblement (sinon fonctionnellement) plus simple du point de vue du développeur, car il est plus élevé que la manipulation de fichiers.
D'après ce que je peux voir, les deux développeurs ont beaucoup de points valides.
Donc, de ces deux personnes, le développeur pro-fichiers ou le développeur pro-bases de données, laquelle est la plus conforme aux meilleures pratiques en génie logiciel, et pourquoi?