2016-03-22 20 views
2

Ich frage mich, welcher Ansatz besser ist. Sollten wir feinkörnige Entitäten im Grid verwenden und später aus den feinkörnigen Entitäten funktionsreiche Bereichsobjekte konstruieren?Feinkörniges vs grobkörniges Domänenmodell In Memory Data Grid

Oder alternativ sollten wir die kursförmigen Domänenobjekte erstellen und sie direkt auf dem Raster und den Entitäten speichern, die wir gerade für die Persistenz verwenden.

Edit: Ich denke, dass diese Frage noch nicht vollständig beantwortet ist. Bisher haben wir Kommentare von Hazelcast, Gemfire und Ignite. Wir vermissen Infinispan, Coherence .... Das ist zur Vervollständigung Willen :)

Antwort

2

ich mit Valentin einverstanden sind, es hängt hauptsächlich von dem System Sie verwenden möchten. Normalerweise würde ich erwägen, erweiterte Domänenobjekte direkt zu speichern. Wenn Sie jedoch nur sehr wenige Objekte haben, deren Größe jedoch groß ist, haben Sie eine schlechte Verteilung und ungleiche Speicherauslastung auf den Knoten. Wenn Ihr Domain-Objekt "normal" groß ist und Sie genug haben, sollten Sie sich keine Sorgen machen.

In Hazelcast ist es besser, diese Objekte direkt zu speichern, aber beachten Sie, dass ein gutes Serialisierungssystem verwendet werden muss, da Java Serialization langsam ist. Wenn Sie Eigenschaften in Ihren Domänenobjekten abfragen möchten, sollten Sie auch Indizes hinzufügen.

+0

Hallo, vielen Dank für die Antwort. Warum auf Hazelcast Erweiterte Objekte ist besser? Was ist anders an Hazelcast? –

+0

Hazelcast bietet keine Join-Operationen an. Daher müssten Sie mehrere Anfragen zum Abrufen all Ihrer Objekte ausführen oder alternativ Datenaffinität und EntryProcessors hinzufügen, um Ihr Domänenobjekt on-the-fly zu generieren (node ​​local) gleiche Idee wie die Join-Operation. Wie auch immer, Hazelcast dreht sich alles um Geschwindigkeit und die Neugenerierung der gleichen Objekte hört sich einfach nicht richtig an :) Ich würde empfehlen, über Denormalisierung zu lesen, wenn Sie diesen Begriff nicht kennen (https://en.wikipedia.org/wiki/Denormalization)). Ich hoffe, das macht Sinn, ansonsten kannst du gerne weitere Fragen stellen :) – noctarius

+0

Du gibst viele Informationen und ich habe ein bisschen Schwierigkeiten, alles zu verdauen. Ich bin ein wenig unsicher, wenn Sie empfehlen, feinkörnige Objekte zu speichern und dann den EntityProcessor zu verwenden, um die verbesserten Objekte zu erzeugen. Dies ist eine Alternative, wenn wir das erweiterte Recht nicht direkt speichern können? –

2

Ich glaube, es kann von einem Data Grid zum anderen abweichen. Ich bin mit Apache Ignite besser vertraut, und in diesem Fall funktioniert ein feinkörniger Ansatz viel besser, weil er flexibler ist und in vielen Fällen eine bessere Datenverteilung und somit eine bessere Skalierbarkeit bietet. Ignite bietet außerdem umfangreiche SQL-Funktionen [1], mit denen Sie verschiedenen Entitäten beitreten und die indizierte Suche ausführen können. Auf diese Weise verlieren Sie nicht die Leistung mit feinkörnigem Modell.

[1] https://apacheignite.readme.io/docs/sql-queries

+0

Was ist mit Co-Location? Wenn Sie komplexe Objekte haben, die Sie im Raster beibehalten, wissen Sie sicher, dass die Daten gemeinsam angeordnet sind. Wenn Sie jedoch mit feinkörnigen Objekten arbeiten, wissen Sie, dass sich die verschachtelten Aggregationen auf demselben Computer befinden. –

+0

Das ist richtig, Sie müssen Daten ordnungsgemäß zusammenstellen, wenn Sie Joins verwenden. Hier ist, wie dies in Ignite getan werden sollte: https://apacheignite.readme.io/docs/affinity-collocation –

+0

Beachten Sie auch, dass Ignite ab 1.6 erlaubt, Joins ohne Kollokation auszuführen. Aber das ist natürlich nicht kostenlos und beeinträchtigt die Leistung schlecht. Dieser Ansatz wird immer noch empfohlen. –

2

Ein Vorteil eines grobkörnigen Objekts ist die Datenkonsistenz. Alles in diesem Objekt wird atomar gespeichert. Aber wenn Sie dieses Objekt in 4 kleine Objekte aufteilen, riskieren Sie, dass 3 Objekte speichern und 1 fehlschlägt (aus welchen Gründen auch immer).

Wir verwenden GemFire ​​und neigen dazu, grobkörnige Objekte zu bevorzugen ... bis zu einem gewissen Punkt. Zum Beispiel enthält unser Kundenobjekt eine Liste von Adressen. Ein alternatives Design wäre, eine GemFire-Region für "Kunde" und eine separate GemFire-Region für "Kundenadressen" zu erstellen und dann zu hoffen, dass Sie diese Regionen synchron halten können.

Der Nachteil ist, dass jedes Mal, wenn jemand eine Adresse aktualisiert, wir das gesamte Kundenobjekt neu schreiben. Das ist nicht sehr effizient, aber unsere Traffic-Muster zeigen, dass Adressänderungen sehr selten sind (im Vergleich zu allen anderen Aktivitäten), also funktioniert das gut.

Eine Erfahrung, die wir hatten, ist der Nachteil der Verwendung von Java Serialization für langfristige Datenspeicherung. Wir vermeiden es jetzt wegen all der Probleme, die durch die Objektkompatibilität verursacht werden, wenn sich Objekte im Laufe der Zeit ändern. Ganz zu schweigen von Kopfschmerzen für .NET-Clients, die Objekte zu lesen. :)