Best Practices für die funktionale Programmierung von Scala oder Clojure


11

Ich habe viel Selbststudiencodierung gemacht und einige Erfahrungen mit parallelen Programmiermodellen gesammelt: Akteure, Software-Transaktionsspeicher, Datenfluss.

Wenn ich versuche, diese Architekturen auf das reale Leben anzuwenden - auf Webanwendungen mit hoher Last - unterstützt kein Modell die Haltbarkeit und Persistenz von Daten. Bei Aufgaben im wirklichen Leben müssen am Ende Daten gespeichert werden. Dies bedeutet, dass ich immer noch DB- und Trapping-DB-Synchronisierungen, mögliche Skalierbarkeits-Engpässe usw. verwenden muss.

Kennt jemand ein gutes Beispiel für eine Architektur (src oder Text oder Diagramm oder Blaupausen), die Akka Actors oder Software Transaction Memory verwendet und am Ende die Persistenz implementiert?

Jedes gute Beispiel / jede gute Idee für Transaktionsspeicher, Akteure, Datenfluss, Tupelräume in realen Anwendungen ist willkommen.


Benötigen Sie sowohl akka als auch stm?
Om-Nom-Nom

Es scheint ungewöhnlich, dass Sie Beharrlichkeit als "am Ende" betrachten. Ich glaube, dass "DB-Synchronisierungen abfangen, mögliche Skalierbarkeitsengpässe usw." sind ein Problem, gerade weil sie mitten im Geschehen sind und nicht am Ende.
Dan Burton

Stimmen Sie zu, dass Beharrlichkeit häufiger als am Ende

@Stas Wie hängt die Frage mit (1) Scala und Clojure, (2) Best Practices zusammen? Was ich gelesen habe, ist (1) sprachunabhängig und (2) nur mit Parallelität verbunden (insbesondere Haltbarkeit / Persistenz).
Sakisk

Antworten:


5

Schauspieler- / STM-Modelle und Datenbankpersistenz sind etwas orthogonal - Sie können leicht eins ohne das andere haben, und ich denke, es besteht die Gefahr, die beiden zu verwechseln.

Das Erreichen der Haltbarkeit (das D in ACID) ist in einer Transaktionsumgebung äußerst komplex, insbesondere in einer verteilten Umgebung, in der Akteure / Prozesse durch Nachrichtenübermittlung koordiniert werden. Sie geraten in heikle Fragen wie das Problem der byzantinischen Generäle .

Daher denke ich, dass es immer eine gewisse Anpassung der Lösung geben wird, um Ihre spezifischen Persistenzanforderungen zu erfüllen. Es gibt keine "Einheitslösung".

Sehenswert (Clojure-Perspektive):


5

Das Akteurmodell funktioniert gut mit CQRS (Command / Query Responsibility Segregation) , da Nachrichten an Akteure, die Datenmanipulationen durchführen, als "Befehl" -Äquivalente verwendet werden können.

Was hat das mit Ihrem Persistenzproblem zu tun? Nun, Sie arbeiten am Speicher und schreiben alle Befehle in ein Protokoll, was eine billigere Operation ist, da es nur zum Anhängen dient. Von Zeit zu Zeit werden Snapshots ausgegeben, um die Zeit zu verkürzen, die zum erneuten Laden der Datenbank erforderlich ist (und dies zu ermöglichen) vom Protokoll verwendeten Speicherplatz wiederherstellen).

Dies ist eine ziemlich verbreitete Technik. Schauen Sie sich VoltDB und Redis an, um weitere Inspiration zu erhalten.


4

Rich Hickey hat eine brandneue Idee namens Datomic. Dies ist ein neuer Ansatz für die Persistenz, die Entkopplung von Speicher, das Transaktionsmanagement und die Abfrage. Es basiert auf unveränderlichen Datensätzen und verwendet eine Abfragesprache namens Datalog (teilt Funktionen mit Prolog). Das Hauptziel bestand darin, eine einfache Verteilung und Cloud-Bereitstellung zu ermöglichen. Es basiert auf Speicher als Service (also nicht eine konkrete Implementierung, sondern lose über eine drahtlose API gekoppelt).

In Clojure haben wir STM, das uns ACI gibt, das D fehlt. Datomic fügt das D hinzu.

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.