Kennismaking met Gebeurtenisgestuurde Architecturen en Idempotentie
De Opkomst van Gebeurtenisgestuurde Architecturen
Modere e-commercesystemen vertrouwen vaak op gebeurtenisgestuurde architecturen om schaalbaarheid en reactievermogen te waarborgen. Bijvoorbeeld, wanneer een gebruiker een bestelling plaatst, worden gebeurtenissen zoals “Bestelling geplaatst,” “Betaling verwerkt” en “Voorraad bijgewerkt” asynchroon geactiveerd.
Waarom Idempotentie Belangrijk is in Gedistribueerde Systemen
In gedistribueerde systemen kunnen gebeurtenissen dubbel worden uitgevoerd of opnieuw worden geprobeerd vanwege netwerkstoringen, wat leidt tot problemen zoals dubbele bestellingen of onjuiste voorraadaanpassingen. Idempotentie zorgt ervoor dat het verwerken van een gebeurtenis meerdere keren hetzelfde resultaat oplevert als het eenmaal verwerken ervan.
Begrip van Idempotentie
Wat Is Idempotentie?
Idempotentie zorgt ervoor dat een bewerking hetzelfde effect heeft, ongeacht hoe vaak het wordt uitgevoerd. Bijvoorbeeld, als een “Plaats Bestelling” API tweemaal wordt aangeroepen vanwege een netwerkstoring, mag er slechts één bestelling worden gecreëerd.
Idempotentie vs. Andere Fouttolerantiemechanismen
Idempotentie richt zich op correctheid bij herhalingen, terwijl fouttolerantiemechanismen zoals herhalingen of schakelaars zich bezighouden met storingen maar duplicaten niet noodzakelijk voorkomen.
Uitdagingen bij het Bereiken van Idempotentie
Gemeenschappelijke oorzaken van dubbele evenementen
- Netwerkstoringen: Een API-gateway zoals AWS API Gateway kan een verzoek opnieuw proberen als de reactie niet tijdig wordt ontvangen.
- Herhalingen en vertragingen bij ontvangstbevestiging: Een betalingsgateway kan een “Betalingsbevestiging” evenement opnieuw verzenden als de ontvangstbevestiging vertraagd is.
- Defecte producenten of consumenten: Een microservice voor het afrekenen in een e-commerce kan dubbele “Bestelling aangemaakt” evenementen afgeven als gevolg van een bug in het systeem.
Mogelijke valkuilen zonder idempotentie
- Gegevensinconsistenties: Verwerking van dubbele “Voorraadupdate” evenementen kan leiden tot onjuiste voorraadniveaus.
- Bedrijfslogica-fouten: Een klant twee keer in rekening brengen voor dezelfde bestelling schaadt het vertrouwen en veroorzaakt problemen met terugbetalingen.
Stroomdiagram van het e-commerce proces
Het volgende diagram illustreert de volgorde van operaties en interacties tussen verschillende componenten van een e-commerceplatform. Het benadrukt de reis van een klant van het bladeren door producten tot het voltooien van een aankoop en het volgen van de bestelling. Dit diagram omvat doorgaans kernprocessen zoals gebruikersinteracties, workflows van backend-systemen, betalingsverwerking, voorraadupdates en leveringsmechanismen. De stroom biedt een holistisch overzicht van hoe verschillende componenten interactie hebben om een naadloze winkelervaring te bieden. Bovendien zorgt het implementeren van idempotentie in kritieke workflows, zoals betalingsverwerking en voorraadupdates, ervoor dat het systeem betrouwbaar en consistent blijft, zelfs bij netwerkstoringen of herhalingen. Het aannemen van enkele AWS-diensten zoals AWS SQS FIFO-queues, DynamoDB, en SNS kan de implementatie van idempotentie in op gebeurtenissen gebaseerde architecturen aanzienlijk vereenvoudigen.
Belangrijke processen in het diagram
1. Gebruikers Browsen en Zoeken
- Gebruikers bladeren door de Productcatalogus of zoeken naar specifieke artikelen.
- De backend haalt gegevens op uit de Productcatalogusdienst, vaak gecached met behulp van AWS ElastiCache voor snellere resultaten.
2. Verlanglijstbeheer
- Gebruikers kunnen artikelen aan hun verlanglijst toevoegen.
- Operaties zijn idempotent om ervoor te zorgen dat hetzelfde product niet meerdere keren wordt toegevoegd.
3. Toevoegen aan Winkelmandje en Afrekenen
- Producten worden toegevoegd aan de winkelwagen, waarbij idempotente hoeveelheidsaanpassingen worden gedaan om duplicatie te voorkomen.
- Bij het afrekenen controleert het systeem de inhoud van de winkelwagen en berekent de totaalprijs.
4. Betalingsverwerking
- De betaalgateway start de transactie.
- Idempotentie zorgt ervoor dat slechts één betaling wordt verwerkt, zelfs als er herhaalpogingen zijn als gevolg van time-outs van de gateway.
5. Bestelling Plaatsen
- Na een succesvolle betaling wordt een “Bestelling geplaatst” gebeurtenis geactiveerd.
- Het systeem maakt het bestelrecord aan en idempotentie voorkomt dat er duplicaatbestellingen worden gemaakt.
6. Voorraadupdate
- De voorraad wordt aangepast op basis van de geplaatste bestelling.
- Idempotente updates zorgen ervoor dat de voorraadniveaus nauwkeurig zijn, zelfs bij duplicaat- of herhaalgebeurtenissen.
7. Bestellingsafhandeling en Levering
- De bestelstatus vordert door fasen zoals “Verwerking,” “Verzonden” en “Geleverd.”
- Updates zijn idempotent om onjuiste statuswijzigingen door duplicaatevenementen te voorkomen.
8. Bestelling Volgen en Meldingen
- Gebruikers kunnen hun bestelstatus controleren.
- Meldingen (bijv. e-mail/SMS) worden idempotent verzonden om gebruikers niet met duplicaten te spammen.
Vereisten voor Idempotentie
1. Winkelwagenupdates
Het toevoegen van hetzelfde product tweemaal zou de hoeveelheid moeten bijwerken, niet dubbele winkelwagenvermeldingen creëren.
- Implementatie: Gebruik een unieke winkelwagenitem-identificator en een voorwaardelijke update in DynamoDB.
2. Betalingsgateway
Betalingspogingen mogen niet leiden tot dubbele kosten.
- Implementatie: Gebruik een
IdempotencyKey
opgeslagen in DynamoDB om voltooide transacties bij te houden.
3. Orderplaatsing
Dubbele “Order Created”-gebeurtenissen van een herhaalpoging mogen geen meerdere bestellingen creëren.
- Implementatie: Gebruik een unieke
orderID
en voorwaardelijkePutItem
-bewerking in AWS DynamoDB.
4. Voorraadupdates
Het aanpassen van voorraadniveaus moet rekening houden met herhaalpogingen om overmatige verlaging te voorkomen.
- Implementatie: Gebruik gedistribueerde vergrendelingen (bijv. met AWS DynamoDB TTL) om gelijktijdige updates te verwerken.
5. Meldingen
E-mail- of sms-meldingen die worden geactiveerd door een gebeurtenis, moeten slechts één keer worden verzonden.
- Implementatie: Gebruik een duplicaatdetectiesleutel met services zoals Amazon Simple Notification Service (SNS).
Conclusie
In gebeurtenisgestuurde systemen, vooral in e-commerceplatforms en cloudarchitecturen zoals AWS, is idempotentie essentieel om betrouwbaarheid, fouttolerantie en gegevensconsistentie te garanderen. Door robuuste idempotente patronen te implementeren en gebruik te maken van tools zoals DynamoDB, SQS en SNS, kunnen ontwikkelaars de risico’s van herhalingen en dubbele gebeurtenissen verminderen. Deze gids laat zien hoe het aannemen van deze praktijken niet alleen de betrouwbaarheid van systemen verbetert, maar ook vertrouwen opbouwt bij gebruikers door naadloze en foutloze ervaringen te leveren. Naarmate de vraag naar veerkrachtige en schaalbare systemen groeit, wordt het beheersen van idempotentie een hoeksteen van modern softwareontwerp.
Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems