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


9

La prevalenza è una tecnica semplice per fornire proprietà ACID a un modello a oggetti in memoria basato sulla serializzazione binaria e sulla registrazione write-ahead. Funziona così:

  • Inizia con un'istantanea. Serializza il modello a oggetti e scrivilo in un file.
  • Crea un file journal. Per ogni chiamata nel modello a oggetti, serializzare la chiamata e i suoi argomenti.
  • Quando il diario diventa troppo grande, stai chiudendo, o è altrimenti conveniente, esegui un checkpoint: scrivi una nuova istantanea e tronca il diario.
  • Per eseguire il rollback o il ripristino da un arresto anomalo o da un colpo di potenza, caricare l'ultima istantanea e rieseguire tutte le chiamate registrate nel diario.

Le precauzioni necessarie per far funzionare questo sono:

  • Non lasciare che riferimenti a oggetti mutabili sfuggano o entrino nel livello di prevalenza. Hai bisogno di una sorta di proxy o schema OID, come se stessi facendo RPC. (Questo è un errore da principiante così comune che è stato soprannominato il " problema del battesimo ".)
  • Tutta la logica raggiungibile da una chiamata deve essere completamente deterministica e non deve eseguire chiamate di I / O o OS significative dalla logica aziendale. Scrivere su un registro diagnostico è probabilmente OK, ma in genere non è ottenere l'ora di sistema o avviare un delegato asincrono. In questo modo il journal viene riprodotto in modo identico anche se viene ripristinato su una macchina diversa o in un momento diverso. (La maggior parte del codice di prevalenza fornisce una chiamata oraria alternativa per ottenere il timestamp della transazione.)
  • La concorrenza degli scrittori introduce ambiguità nell'interpretazione del diario, quindi è vietata.

È perché ...

  • le persone hanno sviluppato un cattivo gusto per loro dopo aver provato a usarne uno in un progetto che non era adatto * ad esso?
  • La strana difesa di Klaus Wuestefeld ha spento le persone ?
  • le persone a cui piace il modello di programmazione imperativa non amano separare l'I / O dal calcolo , preferendo invece intercalare il calcolo con l'I / O e il threading delle chiamate?
  • i livelli di prevalenza sono concettualmente così semplici e così intimamente legati alle caratteristiche del quadro in cui abitano che di solito sono personalizzati per il progetto, il che li rende troppo estranei / non standard / rischiosi?
  • è troppo difficile tenere dritto quello che devi fare attenzione a non fare?
  • Le teste dei neofiti sembrano esplodere di fronte a qualcosa che non è lo stesso tipo di app basata su database a due livelli che hanno imparato a scrivere a scuola? ;)

* L' intero set di dati si adatta alla RAM , non è necessaria la concorrenza degli scrittori e non è necessario eseguire query, rapporti o esportazioni ad hoc in un data warehouse. Con scuse a SQLite, la prevalenza è un miglioramento dei file di salvataggio, non una sostituzione per Oracle.


Aha. Mi chiedevo se avesse un nome. Ha sempre avuto senso per me, non ho mai avuto un nome per questo.
Greyfade,

9
Di cosa stai parlando?
TheLQ

Questa è la prima volta che ne sento parlare. Che cos'è?
Jonn,

Spiegazione aggiunta.
Jeffrey Hantin,

1
Ohhh .. Conosco il concetto ma non l'ho mai fatto prima. Mi sembra abbastanza carino. Sono abbastanza sicuro che non sia qualcosa che molti sviluppatori "odiano assolutamente".
Jonn,

Risposte:


6

Penso che parte del problema sia che hanno un caso d'uso MOLTO specifico (il tuo motivo non adatto). Ho costruito e lavorato su sistemi che utilizzano questo approccio e quando hai un problema che in realtà è questo problema, può essere una soluzione meravigliosa.

Un'altra parte è che assomiglia molto ad alcuni dei pezzi più dolorosi di archiviazione di dati personalizzati che hai usato per trovare più di 10 anni fa e ha alcune delle stesse insidie ​​(pensa ad esempio al batch aggiornato btreive) che porta nel tuo punto "troppo personalizzato", ma rende anche difficile trovare gli scaffali che funzionano educatamente con esso.

L'ultima parte è che possono essere dannatamente difficili da interrogare in molti casi e le persone in generale sono piuttosto abituate a riuscire a ottenere le loro risposte proprio ora.


11

Penso che prima devi dimostrare che così tanti sviluppatori li odiano assolutamente. Non penso sia così. Considera che quel povero, un po 'di tempo fa, ha formalizzato una sorta di modello per questo qui .


Sì, sono un po 'confuso. Sembrano un ottimo strumento se li usi per il motivo corretto.
Matt Olenik,

Lo dico solo perché ho riscontrato una quantità assolutamente incredibile di dolore da parte dei colleghi.
Jeffrey Hantin,

1
@Jeffrey Hantin: sembrano pigri e di mentalità chiusa.
Steven Evers,

1
Oh, e la vera pietra angolare del modello è c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin

4

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

Il solo test di una tale configurazione richiede dozzine di casi di test, l'aggiunta in più processi o codice multi-thread e questo passa a centinaia di possibili condizioni che devono essere testate, sia per la persistenza che per il recupero.

Qualsiasi monitor di transazioni come CICS, Tuxedo, Weblogic, Websphere, JBOSS o .NET, fornirà tutte queste strutture in modo pulito e testato. E qualsiasi database fornirà "sufficiente" transazione / persistenza per la maggior parte delle applicazioni.

È principalmente un caso di quella ruota che è stata inventata e perfezionata molto tempo fa.


questo, e la tendenza di molti "architetti" di avere un "gusto" preferito che cercano di spingere su qualsiasi cosa, non importa quanto inappropriato possa essere quel progetto per il problema che deve essere risolto.
jwenting

@jwenting Quindi rientra nel punto "stridente difesa"?
Jeffrey Hantin,

2

I prerequisiti sembrano un po 'onerosi da programmare, specialmente con la maggior parte dei sistemi che non necessitano della conformità ACID quando sono in esecuzione in memoria. Anche il sovraccarico suona un po 'brutto - c'è un sacco di tracciamento dello stato coinvolto lì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.