Open marcvanandel opened 2 years ago
Goed gevonden dat die volgorde niet klopt in de EventStore! Kan bevestigen dat de events ook in de verkeerde volgorde op de chain staan.
Misschien een race condition in de backend? Gezien deze sensoren in bulk opgevoerd waren. Het is 1 enkele API call naar de backend om het device aan te maken, wat 2 events produceert: DeviceRegistered
en DeviceLocated
. Als het goed is kan die tweede pas opgeslagen worden zodra die eerste bestaat, maar dat zou een startpunt zijn om te kunnen zoeken.
Lijkt een effect te zijn van het feit dat de events asynchroon worden verwerkt.
Dit is hoe de device geregistreerd wordt:
aggregate.registerDevice(
command.legalEntityId,
command.name,
command.description,
command.category,
command.connectivity,
command.location,
);
aggregate.commit();
De events worden samen in de registerDevice
klaargezet.
registerDevice(...) {
this.simpleApply(new DeviceRegistered(this.aggregateId, legalEntityId, name, description, category, connectivity));
this.simpleApply(new DeviceLocated(this.aggregateId, location.name, location.description, location.location));
}
Ze worden echter pas (gelijktijdig) gedispatched zodra er gecommit
wordt. Hier is het dus denkbaar we de volgorde waarin de handlers de events oppakken niet gegarandeerd is.
We hebben zelf wel getest met een grote bulk aan devices opvoeren, wat geen crashes opleverde. We hebben echter, naar mijn weten, nooit gevalideerd of de data ook daadwerkelijk goed opgeslagen werd
Blijkbaar is het mogelijk dat een
Device
ontstaat ... maar dat toch hetDeviceRegistered
event niet het eerste event is dat wordt opgeslagen in de Eventstore: zie https://github.com/kadaster-labs/sensrnet-home/discussions/305#discussioncomment-2485777In de projectie zou een Device aangemaakt moeten kunnen worden met elk event. Zodra er een event binnenkort op een aggregate (met een
aggregateId
) die nog niet bestaat, dan moet deze aangemaakt worden met de informatie die beschikbaar is. Dat is functioneel wellicht niet compleet ... maar wel zoals een client (Registry Node) 'm heeft aangemaakt. De projecties / views volgen hierin gewoon wat daar ontstaat, of dat nou (functioneel) logisch is of niet.Discussed in https://github.com/kadaster-labs/sensrnet-home/discussions/305