Ich habe gerade diesen Artikel gelesen und bin verwirrt.
Stellen wir uns eine Webanwendung und eine separate Anwendung als "Worker" vor, die beide dieselbe Datenbank verwenden .
Oh, ich sagte "Teilen" ... aber wovor warnt der Artikel? :
Viertens ist die gemeinsame Nutzung einer Datenbank zwischen Anwendungen (oder Diensten) eine schlechte Sache. Es ist einfach zu verlockend, einen amorphen geteilten Zustand einzurichten, und bevor Sie es merken, haben Sie ein enorm gekoppeltes Monster.
=> nicht einverstanden. Es gibt einige Fälle, in denen unterschiedliche Anwendungen immer noch Teil derselben Einheit sind, und daher macht der Begriff "Kopplungsproblem" in diesem Fall keinen Sinn.
Fahren wir fort: Die Webanwendung verarbeitet HTTP-Clientanforderungen und kann jederzeit einige Aggregate (DDD-Term) aktualisieren und die entsprechenden Domänenereignisse generieren.
Das Ziel des Workers wäre es, diese Domänenereignisse zu verarbeiten, indem die erforderlichen Jobs verarbeitet werden.
Der Punkt ist:
Wie sollen Ereignisdaten an den Worker übergeben werden?
Die erste Lösung, wie der gelesene Artikel bewirbt, wäre die Verwendung von RabbitMQ, einer großartigen nachrichtenorientierten Middleware.
Der Workflow wäre einfach:
Jedes Mal, wenn der Web-Dyno ein Ereignis generiert, veröffentlicht er es über RabbitMQ, das den Arbeiter füttert.
Der Nachteil wäre, dass nichts die sofortige Konsistenz zwischen dem Festschreiben des aggregierten Updates und dem Veröffentlichen des Ereignisses garantiert , ohne sich mit den möglichen Sendefehlern oder Hardwareproblemen zu befassen. das ist ein weiteres Hauptproblem.
Beispiel: Möglicherweise wurde ein Ereignis veröffentlicht, ohne dass die Gesamtaktualisierung erfolgreich war. Dies führte zu einem Ereignis, das eine falsche Darstellung des Domänenmodells darstellt.
Sie könnten argumentieren, dass globales XA (Zwei-Phasen-Commit) vorhanden ist, aber es ist keine Lösung, die für alle Datenbanken oder Middlewares geeignet ist.
Was könnte also eine gute Lösung sein, um diese sofortige Konsistenz sicherzustellen? :
IMO, Speichern des Ereignisses in der Datenbank in derselben lokalen Transaktion wie die Aggregataktualisierung.
Ein einfacher asynchroner Scheduler würde erstellt und dafür verantwortlich sein, aktuelle unveröffentlichte Ereignisse aus der Datenbank abzufragen und sie an RabbitMQ zu senden, das wiederum den Worker auffüllt.
Aber warum braucht man einen zusätzlichen Scheduler auf der Webapp-Seite und im Übrigen: Warum braucht man in diesem Fall RabbitMQ?
Bei dieser Lösung scheint es logisch, dass RabbitMQ unnötig sein könnte, insbesondere weil die Datenbank gemeinsam genutzt wird.
Tatsächlich, was auch immer der Fall ist , sahen wir , dass die unmittelbare Konsequenz beinhaltet eine Abfrage aus der Datenbank.
Warum sollte der Arbeitnehmer nicht direkt für diese Umfrage verantwortlich sein?
Deshalb frage ich mich, warum so viele Artikel im Web kaum Datenbankwarteschlangen kritisieren und gleichzeitig eine nachrichtenorientierte Middleware fördern.
Auszug aus dem Artikel:
Verwenden Sie einfach das richtige Tool für den Job: Dieses Szenario verlangt nach einem Messaging-System. Es löst alle oben beschriebenen Probleme. Keine Abfrage mehr, effiziente Nachrichtenübermittlung, keine Notwendigkeit, abgeschlossene Nachrichten aus Warteschlangen zu löschen, und kein gemeinsamer Status.
Und sofortige Konsistenz, ignoriert?
Zusammenfassend scheint es wirklich so zu sein, dass wir in jedem Fall, dh wenn eine Datenbank freigegeben ist oder nicht, eine Datenbankabfrage benötigen .
Habe ich einige kritische Begriffe übersehen?
Vielen Dank