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?