Seit einigen Wochen verwenden wir Storm in unserem Projekt. Heute haben wir ein sehr merkwürdiges Verhalten entdeckt. Nehmen wir an, wir die folgende Topologie:Apache Storm: Veränderliches Objekt, das an verschiedene Schrauben ausgegeben wird
SpoutA ---> BoltB
---> BoltC
So haben wir eine SpoutA haben, die eine benutzerdefinierte Java-Objekt aussendet (nennen wir es Message) an zwei verschiedene Schrauben. BoltB und BoltC. Grundsätzlich führen wir einen Split durch.
Bis heute hatten wir die Annahme, dass wenn SpoutA das Message Object ausgibt, es auf SpoutA serialisiert und sowohl auf BoltB als auch auf BoltC deserialisiert wird. Diese Annahme scheint jedoch falsch zu sein. Heute haben wir festgestellt, dass das deserialisierte Objekt in BoltB identisch mit dem Objekt in BoltC ist (Same System.identitfyHashCode). Mit anderen Worten, wenn ich das Objekt in BoltB manipuliere, manipuliere ich auch das Objekt in BoltC, was zu vielen unvorhergesehenen Nebenwirkungen führt.
Darüber hinaus scheint mir dieses Verhalten sehr seltsam, da es nur gilt, wenn die SpoutA und die entsprechenden Bolts B und C in demselben Arbeiter ausgeführt werden. Wenn ich explizit die Verwendung von drei Werken erzwinge, dann ist das Objekt (wie erwartet) ein anderes Objekt für BoltB und für BoltC, da es in verschiedenen JVMs verwendet wird. Wenn wir also davon ausgehen, dass wir eine größere Topologie (50 verschiedene Schrauben) haben, die auf drei Arbeitern läuft, dann könnten wir nie sicher sein, ob Objekte momentan zwischen Schrauben geteilt sind oder nicht.
Also im Grunde wollen wir wirklich nicht, dass ein Objekt zwischen Schrauben geteilt wird. Wir würden normalerweise erwarten, dass während der Deserialisierung für jede Schraube neue Objekte erstellt werden.
Also hier ist meine Frage: Was sind unsere größten Fehler hier? Ist unser Hauptfehler, dass wir "veränderbare" Objekte aussenden? Verwenden wir Serialisierung/Deserialisierung falsch? Oder kann es sogar ein Konstruktionsfehler des Sturms sein?
Offensichtlich könnten wir die Schaffung neuer Objekte erzwingen, indem wir nur Byte-Arrays aussenden, aber das ist meiner Meinung nach im Gegensatz zu Storm.
Mit freundlichen Grüßen, André
Derzeit laufen wir 40 Bolzen Sturm Prozess auf unserer Produktion und erste hatten wir dünner Problem so wenn wir Objekt von einer Schraube zu anderen analysieren wir verwenden XML-Serialisierung und es wird als XML-Zeichenfolge übergeben. es löst unser Problem –
Ja, wir haben auch darüber nachgedacht, unsere eigene Serialisierung/Deserialisierung zu implementieren (aber dann auf Byte-Ebene). Die andere Lösung würde explizit übertragene Objekte als unveränderlich per Konvention definieren. Ich hoffte jedoch, dass es eine bessere Lösung geben könnte (z. B. nur eine Einstellung, um Storm zu zwingen, die Objekte getrennt zu deserialisieren ...) – Vion
ja aggregiert Sie können mit denen zu Optionen gehen –