2 Stimmen

Schreiben in 2 Datenquellen gleichzeitig beim Aufruf von SaveAll in CakePHP

Ich versuche, Werte in 2 Datenbanken zu schreiben (müssen nicht gleichzeitig sein), wenn die saveAll-Funktion aufgerufen wird. Dies gilt nicht für alle Tabellen, sondern nur für 4 der 10 Tabellen in den 2 Datenbanken.

Meine derzeitige Logik, in Pseudocode:

    $updateOk = $model->saveAll(...);

    if (!$updateOk)
      return error;

    /* start second source synchronizing */
    $model->changeDataSource('second');
    $updateOk = $model->saveAll(...);

    $model->changeDataSource('default');
    if (!$updateOk)
        return error;

    return;

Das Problem dabei ist, dass manchmal nicht in die zweite Quelle geschrieben wird, was zu Inkonsistenzen führt.

Ich brauche einen Rat, wie ich dieses Problem am besten lösen kann. Ich habe 3 mögliche Ideen:

  1. Folgen Sie dem obigen Code und fügen Sie Überprüfungen hinzu, um sicherzustellen, dass die Dinge gespeichert werden, und wenn dies nicht der Fall ist, setzen Sie die Standardeinstellungen zurück, um die Konsistenz zu wahren
  2. Schreiben Sie ein Serverskript, das bei jedem Aufruf von saveAll() eine Replikation durchführt. (Ressourcenintensiv und nicht wirklich skalierbar)
  3. Verwenden Sie eine Kombination aus beidem. Führen Sie vor dem Speichern eine Konsistenzprüfung durch und replizieren Sie das Skript einmal pro Tag.

Welches ist der beste Weg oder gibt es bessere Möglichkeiten, diese Anforderung umzusetzen? Gibt es Möglichkeiten, um Konsistenz zu gewährleisten?

1voto

robmcvey Punkte 785

Die Lösung liegt möglicherweise in der Replikation von Datenbanktabellen (richten Sie Ihre zweite Datenbank als Slave ein, der so konfiguriert ist, dass nur bestimmte Tabellen repliziert werden).

Außerdem: Wie wollen Sie das jemals skalieren?

Auf diese Weise müssen Sie sich nur einmal um das Schreiben in die DB kümmern (Ihre Modelle werden sehr aufgebläht, wenn Sie all diesen zusätzlichen Code benötigen, um jedes Mal in zwei Datenbanken zu schreiben), und Sie ermöglichen Ihrer Anwendung, in Zukunft horizontal zu skalieren (stellen Sie sich vor, Ihre Anwendung wäre so groß, dass Sie 20 x Datenbankserver benötigen würden).

Eine andere Lösung wäre die Erstellung eines Shell-Tasks, der mit einem Cron-Job geplant wird, um die Daten zu verschieben, aber ich würde zuerst die Replikation in Betracht ziehen.

Viel Glück!

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