2 Stimmen

Anwendungsarchitektur - Wie würden Sie diesen Prozess gestalten?

Ich habe eine Anwendung, die aus folgendem besteht:

Eine zentrale Datenbank mit über 100.000 Datensätzen Eine Reihe von "Client"-Datenbanken, die jeweils etwa 10-20.000 Datensätze enthalten

Die Client-Datenbanken enthalten Details zu Kontakten, von denen jeder eine eindeutige ID (KontaktID) hat.
Die zentrale Datenbank enthält einige dieser Kontakte, die durch dieselbe KontaktID identifiziert werden.

Über Nacht müssen wir durch die Client-Datenbanken iterieren und die zentrale Datenbank nach Aktualisierungen für jeden Kontakt abfragen und sie dann in die Client-Datenbank bringen.
Die zentrale Datenbank wird von einem Dritten verwaltet, sodass wir nichts ändern können.
Das Unternehmen, das die zentrale Datenbank verwaltet, möchte dies über Web-Services tun, indem es jeden Kontakt durchläuft.

Meine Bedenken sind, dass dies über Web-Services aufgrund der Anzahl der Datensätze sehr langsam sein würde.

Derzeit denke ich daran, auf jedem Client eine Datei zu generieren, die eine Liste aller Kontakte für diesen Client enthält. Diese Datei würde dann an die zentrale Datenbank gesendet werden. Die zentrale Datenbank würde dann diese Datei verarbeiten und eine andere Datei zurücksenden, die alle Aktualisierungen enthält.

Wie würden Sie das erstellen, damit es so schnell wie möglich läuft?

3voto

Ilya Kochetov Punkte 17577

Ich würde nicht durch jeden Datensatz in dem Szenario gehen, das Sie beschreiben. Webdienste sind in Ordnung, aber Sie könnten sie genauso gut für Massenaktualisierungen verwenden.

Von der Spitze meines Kopfes aus würde etwas wie das hier ein wenig besser funktionieren:

  1. Holen Sie ein 'diff' mit allen Änderungen in der Master-Datenbank. Dies könnte vor dem Start der Synchronisation erfolgen und muss nur einmal täglich durchgeführt werden.
  2. Senden Sie eine vollständige Liste von Kontakten vom Client an den Server. Bei einer so großen Liste ist es egal, wie sie gesendet wird, aber wenn Sie SOAP-Webdienste nicht mögen, denken Sie über JSON nach. Ich würde Webdienste der Bequemlichkeit halber verwenden. Auch hier könnte die Kontaktliste im Voraus vorbereitet werden.
  3. Erstellen Sie eine Liste von Datensätzen, die aktualisiert werden müssen, indem Sie das 'diff' mit der Liste vom Client vergleichen.
  4. Holen Sie alle aktualisierten Details auf einmal (wenn Sie MS SQL verwenden, könnten Sie das mit XML tun, andere SQL-Dienste bieten unterschiedliche Wege)
  5. Senden Sie die Details an den Client

Derselbe Mechanismus könnte auch für die Aktualisierung eines einzelnen Datensatzes verwendet werden, Sie müssen nur eine andere Liste (mit 1 ID) im Punkt 2 verwenden.

1voto

Bravax Punkte 10341

Da Sie relativ eingeschränkt sind durch den Drittanbieter, möchten Sie möglicherweise eines der folgenden Dinge tun:

  1. Lassen Sie den Drittanbieter einen Webservice erstellen, der eine Liste aller IDs zurückgibt, bei denen sich in den letzten Tagen Details geändert haben.

  2. Dann durchlaufen Sie diese reduzierte Liste mithilfe eines Webservices (der hoffentlich viel kleiner ist als die gesamte Liste), und aktualisieren Ihre Kontakte entsprechend.

oder

  1. Lassen Sie den Drittanbieter einen Webservice erstellen, der ein XML-Dokument enthält, das einen Dump der Kontaktinformationen in ihrem System enthält, die sich in einem bestimmten Zeitraum geändert haben. Dann würden Sie dieses Dokument verarbeiten und Ihre Daten aktualisieren.

1voto

S.Lott Punkte 371691

Gehen Sie wann immer möglich mit Massentransfers.

Das Öffnen einer TCP/IP-Verbindung ist ein SEHR langsamer Prozess. Das Übertragen von 20K Kontakt-IDs (auch wenn die ID riesig ist) in einer einzelnen WS-Anfrage ist viel schneller als 20K Web-Service-Anfragen.

Sie möchten nicht auf ihre Antwort warten. Sie haben zwei Arten von potenziellen Workflows.

  1. Aktives Warten. Sie senden eine Charge. Sie fragen alle paar Minuten nach, bis die Charge abgeschlossen ist. Das ist ziemlich unangenehm, aber völlig einseitig. Sie erledigen die gesamte Arbeit, sie antworten nur mit "noch nicht abgeschlossen" oder "fertig". Dann fordern Sie Ihre Chargenergebnisse an.

  2. Benachrichtigung. Sie senden eine Charge mit einer Adresse, an der Sie benachrichtigt werden können. Es könnte eine E-Mail-Adresse sein oder es könnte eine URL (IP-Adresse, Port und Pfad) sein, an der Sie benachrichtigt werden möchten.

    • Wenn Sie sich für die Verwendung von E-Mail-Benachrichtigung (oder ähnlichem) entscheiden, können Sie dann eine ordnungsgemäße WS-Anfrage durchführen, um die Charge abzurufen.

    • Wenn Sie WS-Benachrichtigung verwenden möchten, haben Sie einen kleinen Webdienst, der entweder eine einfache Benachrichtigung erhält und eine WS-Anfrage zum Abrufen des Ergebnisses durchführt, oder sie senden Ihnen das gesamte Ergebnis.

  3. Wenn Sie unhöflich sein möchten, öffnen Sie mehrere hundert Threads und senden Sie mehrere hundert gleichzeitige Anfragen. Dies wird weniger Zeit in Anspruch nehmen, aber ihren Server überlasten.

0voto

Nrj Punkte 6513

Sie können eine Datei (XML) mit allen ID-Details aus der zentralen Datenbank anfordern und sie in einige Objektzuordnungen umwandeln lassen. Dann können Sie die Objektliste an Ihrem Ende vergleichen und entsprechend aktualisieren.

0voto

yanky Punkte 141

Wie wäre es mit Messaging? Auf der zentralen Datenbankseite kann ein Nachrichtenwarteschlangensystem erstellt werden, um Ereignisse für das Aktualisieren von Datenbankeinträgen zu speichern. Es kann ein Thema für jede Client-Datenbank geben, so dass der Client nur für diese interessanten Ereignisse abonnieren kann. Die Warteschlange ist dafür verantwortlich, den Client über Aktualisierungsevents von Datensätzen zu benachrichtigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X