Ich weiß, dass Clojure gut auf einer Multicore-Maschine funktioniert, aber ich frage mich, ob es Sinn machen würde, für es über einen JVM-Cluster über viele Maschinen verteilt arbeiten?
Antworten
Zu viele Anzeigen?Runa Ich habe Terracotta für diesen Zweck in Erwägung gezogen und bin zu dem Schluss gekommen, dass ich swarmiji als verteilte Agentenbibliothek.
Einer der wirklichen Unterschiede zwischen einem SMP-System und einem Cluster ist der gemeinsame Speicher. In einem Cluster muss der Code nach Daten fragen, während er sie in einem SMP-System einfach direkt lesen kann. Dies hat einige nette Vorteile und einige (Skalierungs-)Nachteile.
Das STM von Clojure, das sich deutlich von den vielen anderen STM-Systemen unterscheidet, basiert auf dem Konzept von relative Zeit gemessen an einem Generationszähler pro Transaktion. Ohne gemeinsamen Zugang zu diesem Erzeugungszähler kann er keine Ereignisse in Auftrag geben und kann seine Aufgabe nicht erfüllen (bitte verzeihen Sie diese allzu einfache Erklärung).
Eine der Hauptmotivationen des STM war es, ein System zu schaffen, das die Vorteile der Shared-Memory-Gleichzeitigkeit indem zum Beispiel sichergestellt wird, dass die Leser nie auf die Autoren warten und die Leser immer gültige Daten sehen. Da dieses System entwickelt wurde, um die Vorteile des gemeinsamen Speichers zu nutzen, verliert es ohne gemeinsamen Speicher viel von seinem Reiz.
Das Akteursmodell (ala Erlang) ist für die verteilte Datenverarbeitung besser geeignet.
Oder anders ausgedrückt: Vielleicht sollten wir nicht versuchen, einen quadratischen Pflock in ein verteiltes, gleichzeitiges Loch zu stecken.
Nicht wirklich. Ich meine, es könnte Dinge wie Terracotta behaupten, dass sie in der Lage sind, eine logische JVM über mehrere Knoten zu verteilen, aber Clojures STM/Sammlungssemantik verlässt sich ziemlich stark auf die gemeinsame Nutzung von Speicher zwischen den Threads, um in Bezug auf Platz und Zeit effizient zu sein.
Sie sind wahrscheinlich besser dran, wenn Sie sich um die Mehrknoten-Teile Ihres Systems mit einer Message-Passing- oder Batch-orientierten Architektur kümmern.