Ich suche nach einer Eingabe, wie ein Windows-Dienst, der derzeit in meinem Unternehmen ausgeführt wird, zu skalieren. Wir sind mit .NET 4.0 (kann und wird zu einem bestimmten Zeitpunkt in der Zukunft 4.5 aufgerüstet werden) und läuft dies auf Windows Server 2012Skalieren von Windows-Diensten
Über den Service
Die Aufgabe des Service für neue Zeilen abzufragen, ist in eine Logging-Tabelle (Wir arbeiten mit einer Oracle-Datenbank), verarbeiten die Informationen, erstellen und/oder aktualisieren eine Reihe von Zeilen in 5 anderen Tabellen (nennen wir sie Tracking-Tabellen), aktualisieren Sie die Logging-Tabelle und wiederholen.
Die Protokolltabelle enthält große Mengen an XML (bis zu 20 MB pro Zeile), die in den anderen 5 Verfolgungstabellen ausgewählt und gespeichert werden müssen. Neue Zeilen werden die ganze Zeit mit der maximalen Rate von 500.000 Zeilen pro Stunde hinzugefügt.
Der Datenverkehr der Verfolgungstabellen ist viel höher und reicht von 90.000 neuen Zeilen in der kleinsten bis zu Millionen von Zeilen in der größten Tabelle pro Stunde. Ganz zu schweigen davon, dass es auch Update-Operationen für diese Tabellen gibt.
über die verarbeiteten Daten
Ich fühle mich dieses Bit wichtig ist es, eine Lösung für die Suche basierend auf, wie diese Objekte werden gruppiert und verarbeitet werden. Die Datenstruktur sieht wie folgt aus:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- Bericht ist die Protokolldaten Ich brauche
- auszuwählen und Verfahren für jede Nachricht dort im Durchschnitt 5 Reports sind. Dies kann in einigen Fällen zwischen 1 bis 100 variieren.
- Nachricht hat eine Reihe anderer Sammlungen und andere Beziehungen, aber sie sind für die Frage irrelevant.
Heute ist der Windows Service haben wir kaum die Last auf einem Server mit 16 Kernen verwaltet (Ich erinnere mich nicht die vollen Spezifikationen, aber es ist sicher diese Maschine zu sagen, ist ein Tier). Ich habe die Aufgabe, eine Möglichkeit zu finden, mehr Maschinen zu skalieren und hinzuzufügen, die all diese Daten verarbeiten und die anderen Instanzen nicht stören.
Derzeit erhält jede Nachricht ihren eigenen Thread und behandelt die relevanten Berichte. Wir verarbeiten Berichte in Stapeln, gruppiert nach ihrer MessageId, um die Anzahl der DB-Abfragen bei der Verarbeitung der Daten auf ein Minimum zu reduzieren.
Einschränkungen
- In dieser Phase darf ich neu schreiben dieser Service von Grund auf unter Verwendung eines beliebigen Architektur ich für richtig halten.
- Sollte eine Instanz abstürzen, müssen die anderen Instanzen in der Lage sein, dort aufzugreifen, wo die abgestürzte Version übrig geblieben ist. Es können keine Daten verloren gehen.
- Diese Verarbeitung muss so realitätsnah wie möglich von den Berichten sein, die in die Datenbank eingefügt werden.
Ich suche für jede Eingabe oder Ratschläge, wie man ein solches Projekt zu bauen. Ich nehme an, dass die Dienste zustandslos sein müssen, oder gibt es eine Möglichkeit, Caches für alle Instanzen irgendwie zu synchronisieren? Wie sollte ich alle Instanzen koordinieren und sicherstellen, dass sie nicht dieselben Daten verarbeiten?Wie kann ich die Last gleichmäßig zwischen ihnen verteilen? Und natürlich, wie man mit einer Instanz umgeht, die abstürzt und ihre Arbeit nicht abschließt?
EDIT
entfernt irrelevante Informationen
Das * klingt * wie ein ETL-Prozess. Haben Sie darüber nachgedacht, etwas wie SQL Server Integration Services (SSIS) zu betrachten und Pakete zu schreiben, die so geplant werden, dass sie regelmäßig ausgeführt werden? –
Wir verwenden Oracle und die höheren UPS wollen leider kein Wort über SQL Server hören. – Artless
Ich dachte nur den SSIS-Teil davon und nicht die Datenbank-Engine :) Alternativen wären etwas wie Pentaho Data Integration (http://www.pentaho.com/explore/pentaho-data-integration/) oder Talend etl analytics (http://www.talend.com/solutions/etl-analytics) –