Die Firma, für die ich arbeite, untersucht den Wechsel von unserer derzeitigen monolithischen API zu Microservices. Unsere aktuelle API ist stark vom Frühling abhängig und wir verwenden SQL Server für die meisten Persistenz. Unsere Microservice-Untersuchung orientiert sich an Spring-Cloud, Spring-Cloud-Stream, Kafka und Polyglot Persistence (isolierte Datenbank pro Microservice).microservice messaging db-assigned identifiers
Ich habe eine Frage darüber, wie Messaging über Kafka typischerweise in einer Microservice-Architektur erfolgt. Wir planen eine Koordinierungsschicht zwischen den Microservices und unseren Client-Anwendungen, die Aktivitäten über verschiedene Microservices hinweg koordinieren und Clients von Änderungen an Microservice-APIs isolieren. Die meisten Dinge, die wir über die Verwendung von spring-cloud-stream und kafka gelesen haben, weisen darauf hin, dass wir Ströme auf der Koordinationsebene (Quelle) für Ressourcenwechseloperationen (Einfügungen, Aktualisierungen, Löschungen) verwenden sollten, wobei der Microservice ein Verbraucher der Mitteilungen.
Wo habe ich Probleme mit diesem ist Einsätze. Wir verwenden stark Datenbank-zugewiesene Bezeichner (Identitätsspalten/Autoinkrementspalten/-sequenzen/Ersatzschlüssel) und sie werden normalerweise als Teil einer Postanforderung zugewiesen und an den Aufrufer zurückgegeben. Die Koordinationsschicht kann unter Verwendung verschiedener Microservices mehrere Dinge speichern und benötigt oft den zugewiesenen Identifizierer von einer Einfügung, bevor sie mit der nächsten Operation fortfahren kann. Die Verwendung von Nachrichtenaustausch zwischen der Koordinationsebene und den Microservices für Einfügungen bewirkt, dass die Koordinationsebene keine Antwort von der Einfügeoperation erhalten kann, so dass sie nicht die zugewiesene Kennung erhalten kann, die sie benötigt. Außerdem benötigen andere Verbraucher im Strom (d. H. Verbraucher, die die Daten in einem Data Warehouse veröffentlichen) die Nachricht, dass sie den zugewiesenen Bezeichner enthalten müssen.
Wie gehen Menschen mit diesem Problem um? Sind Datenbank-zugewiesene Identifikatoren ein Anti-Pattern in Microservices? Sollten wir separate Microservice-Endpunkte verfügbar machen, die datenbankzugewiesene Identifikatoren zurückgeben, so dass die Koordinationsebene einen synchronen Aufruf durchführen kann, um vor dem Aufruf des asynchronen Einfügens einen Bezeichner zu erhalten? Wir könnten UUIDs verwenden, aber unsere DBAs hassen diese als Primärschlüssel, und sie könnten nicht als Bestellnummer oder andere benutzergenerierte generierte IDs verwendet werden.