idempotenza e memorizza con notifica

1

Vorrei chiedere che cosa è un modo preferibile quando si ha un tale codice, (si tratta di una transazione distribuita poiché non posso eliminare l'elemento e pubblicare ToKafka atomicamente), e non voglio avere l'event sourcing in questo momento:

if(exists(Item))
   DeleteItem(Item)
   PublishEventKafka(ItemDeleted)

Ovviamente, se un crash si verifica tra DeleteItem, in caso di riavvio, PublishEventKafka non viene chiamato perché if(exists) restituisce false .

Stavo anche pensando a:

if(exists(Item))
   PublishEventKafka(ItemDeleted)
   DeleteItem(Item)

Questo, tuttavia, è una bugia perché l'oggetto è ancora lì, quindi la mia conclusione è stata:

if(exists(Item) || DeleteInProgress(Item))
   DeleteItem(Item, InProgress)
   PublishEventKafka(ItemDeleted)
   DeleteItem(Item, Finish)

Ad esempio, cambierei lo stato dell'oggetto in "eliminazione" e, una volta inviato, eliminerei l'elemento effettivo. Altri penserebbero che sia stato cancellato se avessero provato a leggere l'articolo ...

Ad ogni modo, penso che ci sia un modo più generico per risolvere questo tipo di problema o che non ci sia?

    
posta Martin Kosicky 01.02.2018 - 07:50
fonte

0 risposte

Leggi altre domande sui tag