2012-03-27 16 views
0

Wir haben einen externen Dienst, der uns kontinuierlich Daten sendet. Der Einfachheit halber lässt sich sagen, dass diese Daten drei Zeichenfolgen in tabulatorgetrennter Form aufweisen.Duplikate aus einem Stream

Diese Daten werden von einem unserer Server empfangen und dann an eine Verarbeitungs-Engine weitergeleitet, wo mit diesem Datensatz eine sinnvolle Aussage getroffen wird.

Eine der Anforderungen der Verarbeitungs-Engine besteht darin, dass doppelte Ergebnisse von der Verarbeitungs-Engine nicht verarbeitet werden. So erhielt die Verarbeitungsmaschine beispielsweise am Tag 1 A B C, und am Tag 243 wurde dieselbe A B C vom Server empfangen. In dieser speziellen Situation wird die Verarbeitungs-Engine eine Warnung "Datensatz bereits verarbeitet" ausspucken und diesen bestimmten Datensatz nicht verarbeiten.

Es kann ein paar Möglichkeiten, dieses Problem zu lösen:

  • Speichern Sie die eingehenden Daten in einem In-Memory-HashSet und stellen exculsion wird den Bearbeitungsstatus des bestimmten Datensatz anzuzeigen. Probleme treten auf, wenn dieser Dienst mit einer Ausfallzeit von ausgeführt wird. Je nach Datenstoss kann diese Sammlung die Speichergrenzen überschreiten. Im Falle von Systemausfällen müssen diese Daten auch an einem anderen Ort gespeichert werden.

  • Speichern Sie die eingehenden Daten in der Datenbank und der nächste Satz von Daten wird nur verarbeitet werden, wenn die Daten nicht in der Datenbank vorhanden sind. Diese
    hilft mit der Haltbarkeit der Geschichte im Falle einer Katastrophe , aber es gibt den Overhead der Aufrechterhaltung der richtigen Indizes und aggressive Sharing bei leistungsbezogenen Problemen.

.... oder eine andere Technik

Kann jemand einige Fallstudien oder etablierte Muster oder Praktiken dieses besondere Problem zu lösen hinweisen?

Dank

Antwort

1

benötigen Sie irgendeine Art von Unterstützung zu speichern, für die Persistenz, was auch immer die Lösung. also egal wie viel Arbeit umgesetzt werden muss. aber es muss nicht eine SQL-Datenbank für etwas so einfach sein - alternative to memcached that can persist to disk

Darüber hinaus könnten Sie bloom filters zur Reduzierung der In-Memory-Fußabdruck betrachten. Dies kann zu Fehlalarmen führen, sodass Sie auf eine zweite (langsamere, aber zuverlässigere) Schicht zurückgreifen müssen (was der Plattenspeicher sein könnte).

und schließlich die Notwendigkeit für idempotent Verhalten ist wirklich häufig in Messaging/Enterprise-Systeme, so dass eine search like this mehr Papiere/Ideen auftaucht (nicht sicher, ob Sie wissen, dass "idempotent" ist ein nützlicher Suchbegriff).

+0

Dank! Dies scheint ein Schritt in die richtige Richtung zu sein. –

1

Sie könnten einen Hash der Daten erstellen und speichern, die in einem Sicherungsspeicher, der kleiner ist als die tatsächlichen Daten sein würde (vorausgesetzt, Ihre Daten nicht kleiner als ein Hash)

Verwandte Themen