Perché così tanti programmatori assolutamente odiano strati di prevalenza degli oggetti?

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/6526

  •  16-10-2019
  •  | 
  •  

Domanda

prevalenza non è una tecnica semplice per fornire proprietà ACID ad un modello di oggetti in memoria in base serializzazione binaria e la registrazione write-ahead. Funziona in questo modo:

  • Inizia con una fotografia. Serializzare il modello a oggetti e scrivere in un file.
  • Creare un file di journal. Per ogni chiamata nel modello a oggetti, serializzare la chiamata ed i suoi argomenti.
  • Quando la rivista diventa troppo grande, si sta chiudendo, o è comunque conveniente, eseguire un posto di blocco:. Scrivere la nuova istantanea e troncare il giornale
  • Per tornare rullo o recuperare da un incidente o di potere colpo, caricare l'ultima istantanea e ri-eseguire tutte le chiamate registrate nella rivista.

Le precauzioni necessarie per fare questo lavoro sono:

  • Non lasciate che i riferimenti agli oggetti mutabili fuga o entrare nel livello di prevalenza. Avete bisogno di un qualche tipo di schema di delega o OID, come se si stesse facendo RPC. (Questo è un errore comune newbie che è stato soprannominato il ' problema battesimo '.)
  • Tutti i raggiungibile logica da una chiamata deve essere completamente deterministico, e non deve effettuare chiamate I business logic-espressivo / O o OS. La scrittura di un registro di diagnostica è probabilmente OK, ma ottenere l'ora di sistema o il lancio di un delegato asincrono non è generalmente. Questo è così che la rivista riproduce in modo identico anche se è ripristinato su una macchina diversa o in un momento diverso. (La maggior parte del codice prevalenza fornisce un tempo chiamata alternativo per ottenere il timestamp della transazione).
  • Writer concorrenza introduce ambiguità nell'interpretazione ufficiale, quindi è vietato.

E 'perché ...

  • persone hanno sviluppato un cattivo sapore per loro dopo aver tentato di utilizzare uno su un progetto che non era molto adatto * ad esso?
  • stridente difesa di Klaus Wuestefeld persone spenti ?
  • coloro che hanno preferito il modello di programmazione imperativa antipatia separazione di I / O dal calcolo , preferendo invece il calcolo interleave con I / O e le chiamate filettatura?
  • strati di prevalenza sono così concettualmente semplice e così intimamente legata alle caratteristiche del quadro in cui vivono che sono solitamente su laminati per il progetto, che li rende troppo alieno / non standard / rischioso?
  • è semplicemente troppo difficile tenere dritto cosa bisogna stare attenti a non fare?
  • teste di newbies' sembrano appena esplodere di fronte a qualcosa che non è lo stesso tipo di due livelli basato su database app hanno imparato a scrivere a scuola? ;)

* intero set di dati si inserisce nella RAM , non è necessario scrittore concorrenza, e non c'è bisogno di fare ad-hoc query, reporting, o esportare in un data warehouse. Con scuse a SQLite, la prevalenza è un miglioramento su Save-file, non una sostituzione per Oracle.

È stato utile?

Soluzione

Credo che alcuni dei problema è che hanno un caso d'uso molto specifico (il motivo non è adatta). Ho costruito e lavorato sui sistemi che utilizzano questo approccio e quando si ha un problema che è in realtà questo problema può essere una soluzione meravigliosa.

Un'altra parte è che sembra un bel po ', come alcuni dei bit più dolorose di storage dei dati personalizzato che hai usato per trovare un sacco di 10+ anni fa e ha alcune delle stesse insidie ??(pensare lotto aggiornato btreive per esempio), che porta nel punto di "troppo custom", ma rende anche difficile da trovare le parti scaffale che il lavoro educatamente con esso.

L'ultima parte è che possono essere dannatamente difficili da query in molti casi e la gente in generale sono piuttosto abituare ad essere in grado di ottenere le loro risposte al momento.

Altri suggerimenti

Credo che è necessario prima di dimostrare che così tanti sviluppatori assolutamente li odiano. Non credo che sia il caso. Si consideri che Fowler, un po 'indietro, formalizzato un modello di sorta per questo qui .

La risposta alla domanda è che, mentre la teoria è semplice la pratica non è.

Basta testare una tale impostazione richiede decine di casi di test, aggiungere nel processo mutli o il codice multi-threaded e questo salta a centinaia di possibili condizioni che devono essere testati, sia per la persistenza e il recupero.

Ogni monitor di transazione quali CICS, Giacca da smoking, Weblogic, Websphere, JBoss o .NET, fornirà tutte queste strutture in modo pulito e testato. E qualsiasi database fornirà "abbastanza" transazionale / persistenza per la maggior parte delle applicazioni.

La sua principalmente un caso di quella ruota è stato inventato e perfezionato molto tempo fa.

I requisiti pre sembrare un po 'oneroso per il codice in giro, soprattutto con la maggior parte dei sistemi non necessitano di conformità ACID durante l'esecuzione in memoria. suoni Overhead un po 'brutto troppo - c'è un sacco di monitoraggio dello stato coinvolto lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top