2016-11-05 4 views
0

Diese Frage bezieht sich auf Datomic im Zusammenhang mit Spark-Streaming. Ich habe zwei Tabellen T1 und T2. Aktualisierungen, die an diesen zwei Tabellen (aktualisierte Aufzeichnung) stattfinden, können zu einer der zwei Maschinen M1 und M2 gehen (verarbeitet werden).Daten-und Tabellen-Join-Operation

Ich möchte die T1- und T2-Datensätze auf M1 und M2 verbinden, wenn neue Datensätze von T1 oder T2 auf M1 oder M2 ankommen. Hier ist das Problem, dass der M1- und der M2-Cache einige Daten von sowohl T1 als auch T2 enthalten können.

Wenn ein neuer T1-Datensatz auf M1 eintrifft, dann wird T1 mit dem entsprechenden Datensatz von T2 verknüpft (im Cache gespeichert, was veraltet sein könnte). Gleichzeitig wurde dieser/entsprechende T2-Datensatz aktualisiert und auf M2 empfangen. Jetzt auf M2, wird T2 Datensatz mit entsprechenden Datensatz von T1 (im Cache auf M2, könnte abgestanden sein) und die gerade aktualisiert und wird auf M1 verarbeitet werden. In dieser Situation berechnen sowohl M1 als auch M2 Join von T1- und T2-Datensätzen in falscher Weise, weil beide Cached/Stale-Werte von Datensätzen und Änderungen in T1- und T2-Datensätzen (Novum Info Propagation) verwenden, obwohl sie an Backend DB übergeben werden Transactor, hat den Cache von M1 und M2 nicht erreicht.

Ist diese Situation in Datomic möglich und wie löst man das? Ist Datomic auch eine gute Wahl für solche Anwendungsfälle?

Antwort

1

Diese Situation ist in Datomic nicht möglich, da Datomic den Writer (Transactor) nur auf einem einzelnen Server/einer einzigen Instanz in einem Prozess in einem einzigen Thread ausführt. Im Gegensatz dazu sind die Leser (Peers) vollständig elastisch.

Ich denke Datomic ist vielleicht nicht gut für Ihr Szenario geeignet, da Sie ein Multi-Writer-Setup beschreiben, was Datomic nicht unterstützt. Datomic eignet sich im Allgemeinen sehr gut, wenn Sie die Funktionen von Datomic nutzen möchten und nicht mehr als Hunderte von Schreibvorgängen pro Sekunde in einer einzigen Datenbank ausführen müssen.

Wenn Sie mit Datomic eine hohe Verfügbarkeit erreichen, handelt es sich um einen Failover-Transaktor, der bereit ist, zu übernehmen, wenn der Hauptabwickler ausfällt.

http://docs.datomic.com/architecture.html

http://docs.datomic.com/ha.html

0

Ein Weg, dies mit Datomic lösen könnten die Aktualisierungen von T1 und T2 haben sein gehen in eine Datomic Datenbank. Oder Sie könnten T1 in die T1-Datenbank, T2 in die T2-Datenbank, optional mit einem Transactor für jede Datenbank übertragen.

Dann sind M1 und M2 Peers der Datenbank/s hören die tx-queue oder Warteschlangen. Die Leser der Warteschlangen können das Update für die Verarbeitung beanspruchen, indem sie beispielsweise ein Attribut zu der Transaktion hinzufügen, die es verarbeitet, wenn es nicht bereits dort ist (was anzeigen würde, dass es bereits beansprucht wird).

Ob dies eine gute Wahl ist oder nicht, kann ich nicht wirklich mit den bereitgestellten Informationen beantworten, aber ich stelle es hier für Vergleiche mit anderen Lösungen.

+0

Sorry, das verstehe ich nicht ganz. Sowohl M1 als auch M2 haben Daten in Bezug auf T1 und T2 in ihrem Cache. Sowohl M1 als auch M2 können einen beliebigen neuen Datensatz von T1 oder T2 für die Verarbeitung/Verknüpfung erhalten. Wenn die Caches von M1 und M2 nicht synchron sind (obwohl die DB alle Aktualisierungen hat, sind die von M1 vorgenommenen Änderungen für M2 noch nicht sichtbar und umgekehrt und ihr Cache enthält veraltete Daten bezüglich der letzten Änderungen), dann besteht das Risiko, dass sie dies tun kann JOIN falsch berechnen. – sunillp

+0

Ok Ich denke, mein Hauptpunkt ist, dass es scheint, dass Sie Datomic als Ihren Cache benutzen könnten, um das Problem der Veralterung zu vermeiden. – henryw374

+0

urgh. eingereicht, dass zuvor fertig. jetzt scheint nicht in der Lage zu sein, es zu bearbeiten.Ich wollte hinzufügen, dass ich nicht das Gefühl habe, dass ich wirklich genug über Ihr Problem weiß, um hier viel weiter zu gehen. Caching ist immer schwierig ... einige Architekturen, die das Caching und die gemeinsame Nutzung weniger Daten beinhalten, wären meine erste Untersuchung. – henryw374