2017-07-17 2 views
0

Ich bin Event-Sourcing-Architektur implementieren und meine Aggregate wird große Menge an Datensätzen im Speicher enthalten. Um zu testen, wie gut .NET speichert große Menge von Datensätzen im Speicher, habe ich ein einfaches Programm:Event Sourcing: Overhead mit Speichern einer großen Menge von Datensätzen im Speicher

static void Main(string[] args) 
    { 
     Dictionary<string, object> dict = new Dictionary<string, object>(); 

     int maxRecords = 100000000; 

     for (int i = 0; i < maxRecords; i++) 
     { 
      dict.Add(i.ToString(), new String('A', 10)); 
     } 

     Console.WriteLine("Done"); 

     Console.ReadLine(); 
    } 

In der Konfigurationsdatei, die ich habe:

<runtime> 
    <gcAllowVeryLargeObjects enabled="true" /> 
    </runtime> 

Also ich bin zu speichern 100 Millionen Datensätze und jeder Datensatz ist 10 Bytes (sagen wir 20, weil es wahrscheinlich Unicode ist). So speichere ich etwa 2 GB Daten im Speicher. Die Anwendung wächst jedoch auf 15 GB.

  1. Idealerweise würde ich gerne Dinge in einem IDictionary speichern. Kann ich etwas tun, um den Overhead zu reduzieren?

  2. Wenn jemand an einer Event-Sourcing-Architektur gearbeitet hat, die große Datenmengen im Speicher speichert, teilen Sie uns bitte Ihre Erfahrung damit mit und wie Sie Ihre Aggregate strukturiert haben.

+0

Warum würden Sie Aggregate im Speicher speichern? –

+0

Wenn ich Aggregate in einer Datenbank speichere, verliere ich dann einige der Vorteile von Event Sourcing, als ob ich keine CRUD-Operationen und objektrelationales Mapping durchführen müsste? – Sandy

+0

Sie verlieren nichts und Sie erhalten Skalierbarkeit. –

Antwort

0

Klassische Lösung für diese Frage steht in der Regel auf zwei Punkte:

  • richtigen Aggregate wählen Wurzel, so Zustand, wer von ihnen klein sein wird. Da die Kommunikation zwischen Aggregaten nicht zulässig ist, sollten Sie für die Ausführung eines unitären Befehls nur einen kleinen Status für einen Aggregatstamm laden. Es kann leicht abgerufen werden durch eine asynchrone Abfrage aus der Datenbank

  • Speichern Sie die Abfrageseite auf vielen verschiedenen Sammlungen, jedes Element auf es ist durch Dokument-ID getrennt. So muss Ihr Systemprozess nicht dauerhaft gespeichert werden.

+0

Können Sie bitte ausarbeiten? Wenn Sie sagen "Abfrageseite auf vielen verschiedenen Sammlungen speichern", meinen Sie in einer Datenbank? – Sandy

+1

@Sandy Im Allgemeinen sollte der Speicher in einer höheren Abstraktionsschicht dargestellt werden und datenbankunabhängig sein. Das Lesen des Modells mit seiner Einschränkung ist das Beste dafür, da jede gelesene Modelleinheit in geordnete Listen aufgeteilt werden kann, wie zum Beispiel die Liste der Ärger. In SQL Server-Sammlung ist Tabelle, und Dokument ist Tabellenzeile mit eindeutigen GUID und keine Beziehungen mit anderen Zeilen und Tabellen. In mongodb ist es eine natürliche Sammlung mit einigen Guid'ed-Dokumenten (Wenn Sie gerne antworten, bitte stimmen :) –

Verwandte Themen