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 di oggetti in memoria basato su serializzazione binaria e registrazione write-ahead. Funziona così:

  • Inizia con un'istantanea. Serializza il modello a oggetti e scrivilo su un file.
  • Crea un file journal. Per ogni chiamata nel modello a oggetti, serializza la chiamata e i relativi 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 un blackout, caricare l'ultima istantanea ed eseguire nuovamente tutte le chiamate registrate nel giornale.

Le precauzioni necessarie per farlo funzionare sono:

  • Non lasciare che i riferimenti oggetto 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, è stato soprannominato " problema del battesimo ".)
  • Tutta la logica raggiungibile da una chiamata deve essere completamente deterministica e non deve eseguire chiamate I / O o OS significative per la logica di business. Scrivere su un log diagnostico è probabilmente OK, ma generalmente non è il tempo di sistema o il lancio di un delegato asincrono. Questo è così che la rivista si ripete in modo identico anche se è stata ripristinata su una macchina diversa o in un altro momento. (Il codice di maggior prevalenza fornisce una chiamata di tempo alternativo per ottenere il timestamp della transazione.)
  • La concorrenza del writer introduce ambiguità nell'interpretazione del journal, quindi è vietata.

È perché ...

  • le persone hanno sviluppato un cattivo gusto per loro dopo aver provato ad usarne uno su un progetto che non era adatto a * ?
  • advocacy stridente di Klaus Wuestefeld ha disattivato le persone ?
  • le persone a cui piace il modello di programmazione imperativo non gradiscono separando I / O dal calcolo , preferendo invece interlacciare il calcolo con I / O e chiamate di threading?
  • i livelli di prevalenza sono così concettualmente semplici e così intimamente legati alle caratteristiche del framework in cui abitano che vengono solitamente personalizzati per il progetto, il che li rende troppo alieni / non standard / rischiosi?
  • è troppo difficile tenere dritti ciò che devi fare attenzione a non fare?
  • I capi di
  • neofiti sembrano esplodere di fronte a qualcosa che non è lo stesso tipo di app a due livelli basata su database che hanno imparato a scrivere a scuola? ;)

* Il intero set di dati si adatta alla RAM , non è necessario la concorrenza tra writer e non è necessario eseguire query ad hoc, report o esportazione in un data warehouse. Con scuse a SQLite, la prevalenza è un miglioramento sui file di salvataggio, non una sostituzione per Oracle.

    
posta Jeffrey Hantin 23.09.2010 - 02:40
fonte

4 risposte

6

Penso che alcuni dei problemi sono 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 più dolorosi bit della memorizzazione dei dati personalizzati che hai usato per trovare più di 10 anni fa e ha alcune delle stesse insidie (pensi che il batch sia aggiornato per esempio) porta il tuo punto "troppo personalizzato", ma rende anche difficile trovare le parti dello scaffale che funzionano in modo educato con esso.

L'ultima parte è che in molti casi possono essere difficili da contestare e in generale la gente è abbastanza abituata a ricevere le risposte in questo momento.

    
risposta data 19.10.2010 - 23:55
fonte
11

Penso che prima tu debba dimostrare che così tanti sviluppatori li odiano assolutamente. Non penso sia così. Considera che fowler, un po 'indietro, ha formalizzato un modello di questo tipo per questo qui .

    
risposta data 23.09.2010 - 21:04
fonte
4

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

Basta testare una tale configurazione richiede dozzine di casi di test, aggiungere processi mutli o codice multi-thread e questo salta a centinaia di possibili condizioni che devono essere testate, sia per la persistenza che per il recupero.

Qualsiasi monitor delle transazioni come CICS, Tuxedo, 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 maggior parte del caso di quella ruota è stata inventata e perfezionata molto tempo fa.

    
risposta data 03.10.2011 - 08:49
fonte
2

I requisiti preliminari sembrano un po 'onerosi da codificare, specialmente con la maggior parte dei sistemi che non hanno bisogno della conformità ACID durante l'esecuzione in memoria. Anche il sovraccarico suona un po 'brutto - ci sono molte tracce di stato.

    
risposta data 03.10.2011 - 13:58
fonte

Leggi altre domande sui tag