Warum hassen so viele Programmierer Objektprävalenzschichten absolut?


9

Die Prävalenz ist eine einfache Technik, um einem speicherinternen Objektmodell ACID-Eigenschaften bereitzustellen, die auf binärer Serialisierung und Write-Ahead-Protokollierung basieren. Es funktioniert so:

  • Beginnen Sie mit einem Schnappschuss. Serialisieren Sie das Objektmodell und schreiben Sie es in eine Datei.
  • Erstellen Sie eine Journaldatei. Serialisieren Sie für jeden Aufruf des Objektmodells den Aufruf und seine Argumente.
  • Wenn das Journal zu groß wird, werden Sie heruntergefahren oder es ist auf andere Weise praktisch. Führen Sie einen Prüfpunkt durch: Schreiben Sie einen neuen Schnappschuss und schneiden Sie das Journal ab.
  • Laden Sie den letzten Schnappschuss und führen Sie alle im Journal aufgezeichneten Anrufe erneut aus, um ein Rollback oder eine Wiederherstellung nach einem Absturz oder einem Stromschlag durchzuführen.

Die Vorsichtsmaßnahmen, die erforderlich sind, damit dies funktioniert, sind:

  • Lassen Sie veränderbare Objektreferenzen nicht entkommen oder in die Prävalenzschicht eintreten. Sie benötigen eine Art Proxy- oder OID-Schema, als würden Sie RPC ausführen. (Dies ist ein so häufiger Fehler für Neulinge, dass er als " Taufproblem " bezeichnet wird.)
  • Die gesamte Logik, die von einem Anruf aus erreichbar ist, muss vollständig deterministisch sein und darf keine geschäftslogikbedeutenden E / A- oder Betriebssystemaufrufe ausführen. Das Schreiben in ein Diagnoseprotokoll ist wahrscheinlich in Ordnung, das Abrufen der Systemzeit oder das Starten eines asynchronen Delegaten im Allgemeinen jedoch nicht. Auf diese Weise wird das Journal identisch wiedergegeben, auch wenn es auf einem anderen Computer oder zu einem anderen Zeitpunkt wiederhergestellt wurde. (Der meiste Prävalenzcode bietet einen alternativen Zeitaufruf, um den Transaktionszeitstempel abzurufen.)
  • Die Parallelität von Autoren führt zu Mehrdeutigkeiten bei der Interpretation von Journalen, daher ist dies verboten.

Ist es weil ...

  • Leute entwickelten einen schlechten Geschmack für sie, nachdem sie versucht hatten, einen für ein Projekt zu verwenden, das nicht gut dafür geeignet war * ?
  • Klaus Wuestefelds strenge Befürwortung hat die Leute abgeschaltet ?
  • Leute, die das imperative Programmiermodell mögen , mögen es nicht , E / A von der Berechnung zu trennen , sondern die Berechnung lieber mit E / A und Threading-Aufrufen zu verschachteln?
  • Prävalenzschichten sind konzeptionell so einfach und so eng an die Merkmale des Frameworks gebunden, in dem sie sich befinden, dass sie normalerweise für das Projekt maßgeschneidert werden, was sie zu fremd / nicht standardisiert / riskant macht.
  • Es ist einfach zu schwer, klar zu halten, was Sie tun müssen, um es nicht zu tun.
  • Die Köpfe von Neulingen scheinen nur zu explodieren, wenn sie mit etwas konfrontiert werden, das nicht die gleiche Art von zweistufiger datenbankgesteuerter App ist, die sie in der Schule geschrieben haben? ;)

* Der gesamte Datensatz passt in den Arbeitsspeicher , Sie benötigen keine Writer-Parallelität und Sie müssen keine Ad-hoc-Abfragen, Berichte oder Exporte in ein Data Warehouse durchführen. Mit Entschuldigungen an SQLite ist die Verbreitung eine Verbesserung der Sicherungsdateien und kein Ersatz für Oracle.


Aha. Ich fragte mich, ob es einen Namen hatte. Es machte für mich immer Sinn, ich hatte einfach nie einen Namen dafür.
Greyfade

9
Worüber redest du?
TheLQ

Dies ist das erste Mal, dass ich davon gehört habe. Was ist es?
Jonn

Erklärung hinzugefügt.
Jeffrey Hantin

1
Ohhh .. Ich kenne das Konzept, aber ich habe das noch nie gemacht. Sieht für mich ziemlich gut aus. Ich bin mir ziemlich sicher, dass es nicht viel ist, was viele Entwickler "absolut hassen".
Jonn

Antworten:


6

Ich denke, einige der Probleme sind, dass sie einen SEHR spezifischen Anwendungsfall haben (Ihr nicht geeigneter Grund). Ich habe Systeme gebaut und daran gearbeitet, die diesen Ansatz verwenden, und wenn Sie ein Problem haben, das tatsächlich dieses Problem ist, kann es eine wunderbare Lösung sein.

Ein weiterer Teil ist, dass es sehr nach einigen der schmerzhafteren Teile des benutzerdefinierten Datenspeichers aussieht, die Sie vor mehr als 10 Jahren gefunden haben, und einige der gleichen Fallstricke aufweist (denken Sie beispielsweise an Batch-Batch-Aktualisierungen), die Ihre Probleme mit sich bringen "zu benutzerdefiniert" Punkt, macht es aber auch schwierig, Teile von der Stange zu finden, die höflich damit arbeiten.

Der letzte Teil ist, dass es in vielen Fällen verdammt schwierig sein kann, sie abzufragen, und die Leute im Allgemeinen sind es ziemlich gewohnt, ihre Antworten jetzt zu bekommen.


11

Ich denke, Sie müssen zuerst zeigen, dass so viele Entwickler sie absolut hassen. Ich glaube nicht, dass das der Fall ist. Bedenken Sie, dass Fowler vor einiger Zeit hier eine Art Muster dafür formalisiert hat .


Ja, ich bin ein bisschen verwirrt. Sie sehen aus wie ein großartiges Werkzeug, wenn Sie sie aus dem richtigen Grund verwenden.
Matt Olenik

Ich sage das nur, weil ich von Kollegen eine absolut erstaunliche Trauer darüber bekommen habe.
Jeffrey Hantin

1
@ Jeffrey Hantin: Sie klingen faul und verschlossen.
Steven Evers

1
Oh, und der eigentliche Eckpfeiler des Musters ist c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin

4

Die Antwort auf die Frage ist, dass die Theorie zwar einfach ist, die Praxis jedoch nicht.

Das Testen eines solchen Setups erfordert Dutzende von Testfällen, das Hinzufügen eines Mehrfachprozesses oder von Multithread-Code. Dies führt zu Hunderten von möglichen Bedingungen, die getestet werden müssen, sowohl für die Persistenz als auch für die Wiederherstellung.

Jeder Transaktionsmonitor wie CICS, Tuxedo, Weblogic, Websphere, JBOSS oder .NET bietet all diese Funktionen auf saubere und getestete Weise. Und jede Datenbank bietet "genug" Transaktions- / Persistenz für die meisten Anwendungen.

Meistens wurde dieses Rad vor langer Zeit erfunden und perfektioniert.


Dies und die Tendenz vieler "Architekten", einen bevorzugten "Geschmack" zu haben, den sie auf irgendetwas übertragen wollen, egal wie unangemessen dieses Design für das Problem sein mag, das gelöst werden muss.
Jwenting

@jwenting Fällt das also unter den Punkt "strenge Interessenvertretung"?
Jeffrey Hantin

2

Die Voraussetzungen klingen beim Codieren etwas lästig, insbesondere bei den meisten Systemen, die keine ACID-Konformität benötigen, wenn sie im Speicher ausgeführt werden. Overhead klingt auch ein bisschen böse - dort gibt es eine Menge Zustandsverfolgung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.