🎲 — mikrobloggeriet olorm — olorm-26 · olorm-27 · olorm-28
Race conditions er kanskje mest omtalt i forbindelse med tråder, men jeg fant en artig en.
På prosjektet har vi mange tjenester, og en veldig nyttig kommunikasjonsform mellom dem, er meldingskøer. Spesifikt bruker vi Kafka-køer. En vanlig egenskap ved meldingskøer er FIFO-oppførsel: First In, First Out. Altså at rekkefølgen til meldingene blir bevart.
Kafka skiller seg fra mange andre meldingskøer ved at køene gjerne deles opp i partisjoner for å få høyere gjennomstrømming.
Hver melding har et innhold, og en key. Denne key’en brukes til å velge partisjon, og innenfor hver partisjon er man garantert FIFO-rekkefølge.
Vi gjorde noe slikt:
Her blir ID
(A
, B
) brukt som
key. Hvis A
og B
beholder innbyrdes
rekkefølge gjennom hele løypa går alt fint.
Men følgende blir et problem:
B
, endret Adresse, fyker gjennom boksene til
Behandling
A
, Status bestiltA
, endret Ordre, kjører også gjennom løypa og ankommer
Behandling
A
, Status kansellert, sendes
videreA
fra punkt 1 blir sendt videreVi ender opp med en Status: bestillt
etter
“kanselleringen”.
Konklusjon: Ikke anta at meldinger ankommer i gitt rekkefølge gjennom et distribuert system (med ulik key).
Løsninger på det aktuelle problemet kan være:
Behandling
kan sende “Ordre A er endret” i stedet for
“Ordre A har fått status X”Bestilling
kan alternativt ignorere utdaterte meldinger
ved å sammenligne Versjon e.l.Send gjerne spørsmål eller kommentarer til Richard Tingstad :)