ti-enxame.com

Por que tantos programadores odeiam camadas de prevalência de objetos?

Prevalência é uma técnica simples para fornecer propriedades ACID a um modelo de objeto na memória com base na serialização binária e log de write-ahead. Funciona assim:

  • Comece com um instantâneo. Serialize o modelo de objeto e grave-o em um arquivo.
  • Crie um arquivo de diário. Para cada chamada no modelo de objeto, serialize a chamada e seus argumentos.
  • Quando o diário fica muito grande, você está fechando, ou seja conveniente, faça um checkpoint: escreva um novo instantâneo e trunque o diário.
  • Para reverter ou se recuperar de um acidente ou impacto de energia, carregue o último instantâneo e execute novamente todas as chamadas registradas no diário.

Os cuidados necessários para fazer este trabalho são:

  • Não deixe que referências de objetos mutáveis ​​escapem ou entrem na camada de prevalência. Você precisa de algum tipo de proxy ou esquema OID, como se estivesse fazendo RPC. (Este é um erro comum de novato que recebeu o apelido de ' problema de batismo '. )
  • Toda a lógica alcançável a partir de uma chamada deve ser completamente determinística e não deve realizar chamadas de E/S ou de sistema operacional significativas para a lógica de negócios. Gravar em um log de diagnóstico provavelmente é OK, mas obter a hora do sistema ou iniciar um delegado assíncrono geralmente não é. Isso ocorre para que o diário seja reproduzido de forma idêntica, mesmo se for restaurado em uma máquina diferente ou em um momento diferente. (A maioria dos códigos de prevalência fornece uma chamada de tempo alternativo para obter o carimbo de data/hora da transação.)
  • A simultaneidade do redator introduz ambiguidade na interpretação do diário, portanto, é proibida.

É porque ...

  • as pessoas desenvolveram um gosto ruim por eles depois de tentarem usar um em um projeto que não era adequado* para isso?
  • Klaus Wuestefeld's defesa estridentedesligou as pessoas ?
  • pessoas que gostam do modelo de programação imperativo não gostam de separando I/O do cálculo , preferindo intercalar a computação com I/O e chamadas de threading?
  • as camadas de prevalência são tão conceitualmente simples e tão intimamente ligadas às características da estrutura que habitam que geralmente são feitas sob medida para o projeto, o que as torna muito estranhas/fora do padrão/arriscadas?
  • é muito difícil manter o que você tem que ter cuidado para não fazer?
  • as cabeças dos novatos parecem explodir quando confrontados com algo que não é o mesmo tipo de aplicativo de banco de dados de duas camadas que aprenderam a escrever na escola? ;)

*O todo o conjunto de dados cabe na RAM , você não precisa de simultaneidade de gravador e não precisa fazer consultas ad-hoc, relatórios ou exportação para um data warehouse. Com desculpas ao SQLite, a prevalência é uma melhoria em salvar arquivos, não uma substituição para o Oracle.

9
Jeffrey Hantin

Eu acho que parte do problema é que eles têm um caso de uso MUITO específico (seu motivo não adequado). Eu criei e trabalhei em sistemas que usam essa abordagem e, quando você tem um problema que na verdade é esse problema, pode ser uma solução maravilhosa.

Outra parte é que se parece muito com alguns dos bits mais dolorosos de armazenamento de dados personalizados que você costumava encontrar há mais de 10 anos e tem algumas das mesmas armadilhas (pense em atualização em lote btreive, por exemplo) que traz o seu ponto "muito personalizado", mas também torna difícil encontrar peças prontas que funcionem educadamente com ele.

A última parte é que pode ser muito difícil consultá-los em muitos casos e as pessoas em geral estão bastante acostumadas a conseguir obter as respostas agora.

6
Bill

Acho que primeiro você precisa demonstrar que tantos desenvolvedores os odeiam. Não acho que seja o caso. Considere que fowler, um tempo atrás, formalizou uma espécie de padrão para isso aqui .

11
Steven Evers

A resposta à pergunta é que, embora a teoria seja simples, a prática não é.

Apenas testar tal configuração requer dezenas de casos de teste, adicionar processo mutli ou código multi-threaded e isso salta para centenas de condições possíveis que precisam ser testadas, tanto para persistência quanto para recuperação.

Qualquer monitor de transação, como CICS, Tuxedo, Weblogic, Websphere, JBOSS ou .NET, fornecerá todas essas facilidades de maneira limpa e testada. E qualquer banco de dados fornecerá transacional/persistência "suficiente" para a maioria dos aplicativos.

É principalmente uma caixa em que a roda foi inventada e aperfeiçoada há muito tempo.

4
James Anderson

Os pré-requisitos parecem um pouco onerosos de codificar, especialmente com a maioria dos sistemas que não precisam de conformidade com o ACID quando executados na memória. Sobrecarga soa um pouco desagradável também - há muito rastreamento de estado envolvido nisso.

2
Wyatt Barnett