2016-07-12 16 views
0

Stellen Sie sich einen Dienst wie Twitter vor, wo die Benutzer einen Ankernamen und einen vollständigen Namen haben. Nach dem CQRS-Muster generieren Sie Ansichten für die Tweets, die den Tweet-Body und den vollständigen Namen des Posters enthalten.CQRS: Impliziert die Aktualisierung einer Modelleigenschaft die Aktualisierung aller Ansichten, die diese Eigenschaft zwischenspeichern?

Wie würden Sie mit einem Update des vollständigen Benutzernamens umgehen? Soll ein langer Prozess zur Aktualisierung aller Ansichten gestartet werden? Ich denke in einem Szenario, wo die Benutzer Tausende von Tweets haben.

+0

Nun, das ist, was Twitter tut - [Zeitrahmen bei Stufen] (https://www.infoq.com/presentations/Twitter-Timeline-Scalability)/[Die Architektur Twitter Uses 150M aktive Benutzer, 300K QPS, eine 22 MB/s Firehose und Tweets in weniger als 5 Sekunden zu behandeln] (http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses- to-Deal-mit-150m-active-users.html). Und wie ich mich erinnere, sind ihre Lesevorgänge von Schreibvorgängen getrennt, was ziemlich genau wie bei CQRS ist. –

+0

Eureka. Im Grunde machen sie das, was ich getan habe, bevor ich DDD und CQRS entdeckt habe (ich hasse Joins): Da die Timeline nur Tweet-IDs enthält, müssen sie diese Tweets "hydratisieren", also den Text der Tweets finden. Mit einem Array von IDs können sie ein Multiget erstellen und die Tweets von T-bird parallel abrufen. Ich wette, sie machen dasselbe mit der UserId. – Villason

Antwort

0

Gehen Sie nicht auf die Elfen für Rat, denn sie sind ja und vielleicht beantworten.

Also "ja"; Die Daten im Write-Modell haben sich geändert, und daher wurde eine Reihe von Ansichten, die aus veralteten Daten erstellt wurden, ungültig gemacht und sollten neu erstellt werden. Sie können also an die Änderung des Schreibmodells denken, das ein UsernameChanged-Ereignis aufweist, und die Abonnenten dieses Ereignisses wissen, dass die Ansichten neu erstellt werden müssen.

"Vielleicht"; Sie haben diesen langwierigen Prozess sowieso schon. Sie müssen möglicherweise nicht verfolgen, welche Sichten für ungültig erklärt wurden, wenn Sie sie alle nach einem festen Zeitplan neu erstellen.

"Vielleicht"; Udi Dahan schreibt über diese Art von Sache, und machte die folgende Beobachtung

Ein Service ist die technische Autorität für eine bestimmte Geschäftsfähigkeit.

Jedes Stück von Daten oder Regel muss nur von einem Service gehört.

Seine Idee ist, dass der Benutzer volle Namen zu diesem Dienst privat sein würden - was es in der Verantwortung sowohl für die Aktualisierung haben würde und es präsentiert. Der Dienst würde die eigentlichen Daten für sich behalten und nur einen Bezeichner - eine Art Ersatzschlüssel - und ein Widget veröffentlichen, das weiß, wie man eine Darstellung des Namens abruft und darstellt.

So würde die Ansicht nicht mit Kopien der Benutzernamensdaten, sondern Kopien des Benutzername Widget, zusammen mit dem Zustand gefüllt werden benötigt, um die Instanz der Daten zu identifizieren, die von Interesse sind. Eine Änderung des Benutzernamens würde also "die Ansicht" überhaupt nicht ändern.

+0

Danke für Ihre Antwort. Wenn Sie das FullName-Widget verwenden, würden Sie den DB/Cache nicht einmal pro "Tweet" abfragen? Es scheint nicht sehr effizient, oder? – Villason

+0

Nein, das Widget fragt seinen lokalen Datenspeicher einmal pro Tweet ab. – VoiceOfUnreason

+0

Ja, ein Treffer pro Tweet/Sicht, den Sie dem Benutzer präsentieren. – Villason

0

Wie würden Sie ein Update des Benutzers vollständigen Namen umgehen?

Ist es etwas, das für historische Tweets benötigt würde? Sie könnten argumentieren, dass Sie die historische Ansicht überhaupt nicht aktualisieren sollten, wenn sie zum Zeitpunkt des Tweets einen anderen Namen hatten. Die Timeline würde dann ihren Namen zum Zeitpunkt des Tweetings anzeigen. Dies wäre natürlich eine geschäftliche Entscheidung.

Wenn es benötigt wird, könnte Ihre Ansicht das letzte NameChanged-Ereignis (zum Beispiel) lesen und das für jeden Tweet verwenden, unabhängig davon, was es zu der Zeit war.

Das letzte, was ich gehört habe, wie Twitter seine Daten speichert (von einem Podcast denke ich) ist im Wesentlichen eine Ansicht pro Benutzer, wo alle Tweets kopiert werden, also wenn ich 100 Anhänger habe, würden sie alle eine Kopie meiner bekommen Tweets in ihrer Timeline .... Es sei denn, es ist ein Benutzer mit einer hohen Follower-Anzahl, dann machen sie etwas anderes (ich könnte völlig falsch liegen!) - in diesem Szenario wird Ihr Problem schlimmer, weil jeder Tweet an jeden persönlichen Follower geht Zeitleiste.

Ich bin jetzt neugierig, was tatsächlich passiert! :)

+0

gerade getestet, meinen Profilnamen auf Twitter ändern und es in der Timeline eines anderen Benutzers aktualisiert, auch für historische Tweets – tomliversidge

+0

Genau Tomliversidge, deshalb frage ich. – Villason

0

ich mit der Antwort stimmen @tomliversidge präsentiert, aber meine Antwort-Tool lang für einen Kommentar sein können, so wenden Sie sich bitte als Antwort akzeptieren das nicht ‚richtig‘ :)

Es ist gehen eine geschäftliche Entscheidung darüber treffen, was mit historischen Daten geschieht.

Nehmen wir ein anderes Beispiel zur Veranschaulichung. Als ich eine Bestellung aufgegeben habe, habe ich SKU-001 bestellt, was zufällig ein "roter Eimer" war. Doch während ich auf meine Bestellung wartete, entschied jemand, dass der "rote Eimer" tatsächlich ein "blauer Eimer" ist. Jetzt wird es interessanter. Wenn nur die ID von SKU-001 in der Bestellung gespeichert ist, bedeutet dies, dass sich das, was ich bestellt habe, jetzt geändert hat. Es wird zu einiger Verwirrung führen. Es gibt jedoch Möglichkeiten. Einer speichert historische Daten und findet den Artikel basierend auf dem Datum der Bestellung. Aber , dass ist schrecklich komplex und ineffizient. Aus diesem Grund wird manchmal ein Wertobjekt gespeichert, das sowohl eine ID als auch einige relevante Informationen wie die Beschreibung enthält. Im Bestellbeispiel würde man sicher nicht zurückgehen und die Beschreibung zu historischen Daten ändern.

In diesem speziellen Twitter-Fall scheint es, als ob die historischen Daten aktualisiert werden. Nun, ich kenne Twitter nicht und ich bin nicht dabei, also werde ich es ein bisschen anders betrachten. Es ist auch interessant, einen vollen Namen zu haben, da die Frage lautet: "Warum wurde der Name geändert?" Es passiert ziemlich oft, wenn eine Frau heiratet. Es mag sein, dass das Geschäft entscheidet, dass alte vollständige Namen so gehalten werden, wie es zu diesem Zeitpunkt den Stand der Dinge darstellte.

Wenn jedoch die Daten aktualisiert werden sollen, wird es auch ein bisschen eine technische Übung. Es gibt Optionen hier. Einer, wie in einer anderen Antwort angegeben, ist, den Benutzernamen einfach nachzuschlagen, wenn er Tweets findet. Ein anderer, auch gesagt, ist die Denormalisierung der Daten in den Tweet. Jemand weiß, wie das funktioniert. Selbst wenn wir die Tweets denormalisieren müssen, kann es sich um ein einzelnes Update handeln, das gegen das Lesemodell ausgeführt wird. Dies hängt alles von der technischen Implementierung ab.

Just my 2 cents :)