Momentane Situation
Wir implementieren (und warten jetzt) eine Online-Shopping-Webanwendung in einer Microservice-Architektur.
Eine der Anforderungen ist, dass das Unternehmen in der Lage sein muss, Regeln für das Hinzufügen unserer Kunden zu ihrem Warenkorb anzuwenden, um ihre Erfahrung und die eventuelle Bestellung anzupassen. Ganz offensichtlich musste eine Business Rules Engine eingerichtet werden, und wir haben dafür einen speziellen "Microservice" implementiert (wenn wir es noch so nennen könnten).
Im Laufe eines Jahres wurde diese Regelengine immer komplexer und erforderte immer mehr Daten (z. B. Inhalt des Warenkorbs, aber auch Benutzerinformationen, seine Rolle, seine vorhandenen Dienste, einige Rechnungsinformationen usw.), um in der Lage zu sein Berechnen Sie diese Regeln.
Im Moment shopping-cart
sammelt unser Microservice all diese Daten von anderen Microservices. Obwohl ein Teil dieser Daten von verwendet wird shopping-cart
, wird sie meistens hauptsächlich zum Zuführen der Regelengine verwendet.
Neue Anforderungen
Jetzt besteht die Notwendigkeit, dass andere Anwendungen / Mikrodienste die Regelengine für ähnliche Anforderungen wiederverwenden. In der aktuellen Situation müssten sie daher dieselbe Art von Daten übertragen, dieselben Mikrodienste aufrufen und (fast) dieselben Ressourcen aufbauen, um die Regelengine aufrufen zu können.
Wenn wir so weitermachen, werden wir mit mehreren Problemen konfrontiert sein:
- Jeder (Aufruf der Regelengine) muss das Abrufen der Daten erneut implementieren, auch wenn er sie nicht für sich selbst benötigt.
- Die Anforderungen an die Regelengine sind komplex.
- Wenn wir in dieser Richtung fortfahren, müssen wir diese Daten für viele Anforderungen im gesamten Netzwerk transportieren (denken Sie an μs A, das μs B aufruft und die Regelengine aufruft, aber A hat bereits einige der Daten, die die Regelengine benötigt).
shopping-cart
ist aufgrund all des Datenabrufs riesig geworden;- Ich vergesse wahrscheinlich viele ...
Was können wir tun, um diese Probleme zu vermeiden?
Im Idealfall würden wir vermeiden, die Regelengine komplexer zu gestalten. Wir müssen auch sicherstellen, dass es nicht zu einem Engpass kommt - zum Beispiel sind einige Daten ziemlich langsam abzurufen (10s oder sogar mehr), daher haben wir das Vorabrufen so implementiert, shopping-cart
dass die Daten mit größerer Wahrscheinlichkeit vorhanden sind, bevor wir die Regeln aufrufen Motor, und halten Sie eine akzeptable Benutzererfahrung.
Einige Ideen
- Lassen Sie die Regelengine die benötigten Daten abrufen. Dies würde die Komplexität noch erhöhen und das Prinzip der Einzelverantwortung verletzen ( noch mehr… ).
- Implementieren Sie einen Proxy μs vor der Regelengine, um die Daten abzurufen.
- Implementieren Sie einen "Datenabruf" μs, den die Regelengine aufruft, um alle benötigten Daten auf einmal abzurufen (zusammengesetzte Abfrage).
shopping-cart
, aber wir könnten sie ganz einfach an die Bedürfnisse der anderen Microservices anpassen (sie beziehen sich immer noch auf Benutzer, Produkte und Bestellungen). Aus unserer Sicht benötigen sie dieselben Eingabedaten, insbesondere da das Unternehmen die anzuwendenden Prädikate auswählen kann. Alle Daten werden von anderen Microservices mit Ausnahme des Warenkorbinhalts selbst bereitgestellt. Die Daten - Abruf ist nicht komplex per se , aber es wird komplizierter , wenn Sie ~ 10 andere Microservices verlangen und mit dem durch die Regel - Engine erwartet aufrechtzuerhalten.