Stripe-tapahtumalukko
Taulurivi, joka estää saman Stripe-tapahtuman käsittelyn kahdesti. Stripe
uudelleenlähettää tapahtuman, kunnes se saa 2xx-vastauksen, joten sama
checkout.session.completed voi saapua monta kertaa — ilman lukkoa tenantti
provisioitaisiin uudelleen ja laskutustila kirjoitettaisiin uudelleen jokaisella
yrityksellä.
Mikä ja missä
- Tyyppi: DynamoDB-taulurivi (Azure-asennuksessa Cosmos DB -dokumentti;
pääsy kulkee
boto3-resurssin kautta suoraan, eidb_provider-abstraktion läpi — ks. "Rajoitteet") - Taulu:
veraframe-stripe-webhook-events-{Environment},deployment/template.yaml:244. YmpäristömuuttujaSTRIPE_WEBHOOK_EVENT_TABLE(deployment/template.yaml:761) - Määrittely: avainskeema
deployment/template.yaml:249–262, rivin kirjoitusstripe_webhook/handler.py:197(_try_claim_event) jastripe_webhook/handler.py:224(_mark_event_processed) - Missä käytössä: Stripe-tapahtuman käsittely, vaihe 2
Kentät
| Kenttä | Tyyppi | Pakollinen | Sisältörakenne | Kuvaus |
|---|---|---|---|---|
pk |
S (partition key) |
kyllä | — | stripe#{event_id}, jossa event_id on Stripen evt_… |
sk |
S (sort key) |
kyllä | — | Vakio event. Lajitteluavain on skeemassa mutta sillä on vain yksi arvo |
event_id |
S |
kyllä | — | Sama tunnus ilman etuliitettä |
status |
S |
kyllä | — | processing (varaus tehty) → processed (käsittely valmis). Vain processed estää uudelleenkäsittelyn (stripe_webhook/handler.py:213) |
event_type |
S |
ei | — | Stripen tapahtumatyyppi. Kirjoitetaan vasta onnistuneen käsittelyn yhteydessä (stripe_webhook/handler.py:226) |
updated_at |
N |
kyllä | — | Unix-sekunnit |
expires_at |
N |
kyllä | — | TTL-kenttä: nyt + 30 vrk (stripe_webhook/handler.py:204). Taulun TTL on päällä (deployment/template.yaml:259), joten rivit poistuvat itsestään |
Rajoitteet ja suhteet
- Varaus tehdään ehdollisella kirjoituksella.
put_item+ConditionExpression="attribute_not_exists(pk)"(stripe_webhook/handler.py:206). Jos rivi on jo olemassa, koodi lukee sen ja palauttaaprocessedvain silloin, kunstatus == "processed"(stripe_webhook/handler.py:213). - Rinnakkaisuus on jätetty auki tarkoituksella tai vahingossa. Jos rivi on
tilassa
processing(toinen suoritus on kesken), funktio palauttaa"claimed"(stripe_webhook/handler.py:217) ja käsittely jatkuu — sama tapahtuma voi siis olla käsittelyssä kahdesti samanaikaisesti. Vasta valmistunut käsittely torjuu uusinnat. - Taulu on valinnainen. Jos
STRIPE_WEBHOOK_EVENT_TABLEon tyhjä,_webhook_tablepalauttaaNoneja koko idempotenssi on pois päältä (stripe_webhook/handler.py:181–187): jokainen varaus "onnistuu" eikä mitään merkitä käsitellyksi. SAM-malli asettaa muuttujan aina, mutta Azure-asennuksessa ja paikallisessa ajossa se voi puuttua hiljaa. - Virhe vapauttaa varauksen. Käsittelyn poikkeus poistaa rivin
(
_release_event_claim,stripe_webhook/handler.py:236), jotta Stripen uusinta pääsee yrittämään uudelleen. Poisto tehdään ennen DLQ-kirjoitusta. - Suora
boto3-käyttö. Tämä on projektin harvinainen poikkeus pilvineutraaliin sääntöön:_webhook_tableluoboto3.resource("dynamodb")-olion suoraan (stripe_webhook/handler.py:186) sen sijaan että käyttäisidb_provideria. Azure- asennuksessa lukko ei siis toimi ilman erillistä muutosta.
Liittyvät
- Prosessi: Stripe-tapahtuman käsittely
- Datavirta: Stripe-tapahtumasta tuoteoikeuksiksi