Eu tenho um aplicativo que gerou uma discussão bastante acalorada entre alguns desenvolvedores.
Basicamente, é dividido em uma camada da web e uma camada de back-end. A camada da web coleta informações por um formulário da web simples, armazena esses dados como um documento JSON (literalmente, um arquivo .json) em uma pasta monitorada usada pelo back-end. O back-end pesquisa esta pasta a cada poucos segundos, pega o arquivo e executa suas funções.
Os arquivos em si são muito simples (ou seja, todos os dados da string, sem aninhamento) e cerca de 1-2k no máximo, com o sistema passando a maior parte do tempo ocioso (mas com até 100 mensagens a qualquer momento). A etapa de processamento de back-end leva cerca de 10 minutos por mensagem.
O argumento surge quando um desenvolvedor sugere que usar o sistema de arquivos como uma camada de mensagens é uma solução ruim, quando algo como um banco de dados relacional (MySQL), banco de dados noSQL (Redis) ou mesmo uma chamada simples à API REST deve ser usado.
Deve-se observar que o Redis é usado em outra parte da organização para o tratamento de mensagens na fila.
Os argumentos que ouvi foram detalhados da seguinte maneira
A favor de arquivos simples:
Os arquivos simples são mais confiáveis do que qualquer outra solução, já que o arquivo é movido apenas de uma pasta "watch" para uma pasta "processing" após a coleta e, finalmente, para uma pasta "done" quando terminar. Não há risco de mensagens desaparecerem, salvo erros de nível muito baixo, o que quebraria outras coisas de qualquer maneira.
Arquivos simples requerem menos sofisticação técnica para entender - apenas
cat
isso. Não há consultas a serem escritas, não há risco de sair acidentalmente da mensagem e deixá-la para sempre.O código de gerenciamento de arquivos é mais simples que as APIs do banco de dados do ponto de vista da programação, pois faz parte da biblioteca padrão de todos os idiomas. Isso reduz a complexidade geral da base de códigos e a quantidade de código de terceiros que deve ser trazido.
O princípio YAGNI declara que os arquivos simples funcionam muito bem no momento, não há necessidade demonstrada de mudar para uma solução mais complicada, então deixe-o.
A favor de um banco de dados:
É mais fácil dimensionar um banco de dados do que um diretório cheio de arquivos
Arquivos simples correm o risco de alguém copiar um arquivo "concluído" de volta para o diretório "watch". Devido à natureza desse aplicativo (gerenciamento de máquina virtual), isso pode resultar em perda de dados catastrófica.
Exigir mais sofisticação técnica para o T / S, o aplicativo significa que é menos provável que uma equipe sem instrução estrague tudo apenas cutucando as coisas.
O código de conexão do banco de dados, especialmente para algo como Redis, é pelo menos tão robusto quanto as funções de gerenciamento de arquivos de biblioteca padrão.
O código de conexão do banco de dados é visivelmente (se não funcionalmente) mais simples do ponto de vista do desenvolvedor, já que é mais alto que a manipulação de arquivos.
Pelo que posso ver, os dois desenvolvedores têm muitos pontos válidos.
Então, dessas duas pessoas, o desenvolvedor de arquivos profissionais ou o desenvolvedor de bancos de dados, qual está mais de acordo com as melhores práticas de engenharia de software e por quê?