Ho una configurazione piuttosto semplice (ho pensato) che mi causa un po 'di dolore.
Utilizzo un sistema di accodamento (AWS SQS) e alcuni container docker di lavoro con codice scritto in .net core che estrae da una coda e processa i messaggi. Più operatori possono effettuare il pull da una coda allo stesso tempo.
Alcune operazioni appartengono a un singolo lavoro. Per esempio. otteniamo 100 unità da elaborare, quindi possiamo creare un job
nel nostro db SQL e quindi inviare 100 messaggi a SQS da elaborare. Quando tutti i dipendenti hanno finito, e solo una volta, vogliamo eliminare il lavoro e inviare messaggi al servizio esterno che abbiamo terminato.
È fondamentale inviare un messaggio al servizio esterno solo una volta, poiché il servizio potrebbe comportare un'attività visibile all'utente.
Ciò che accade è che spesso l'ultimo paio di unità termina l'elaborazione quasi al millisecondo allo stesso tempo, quindi stiamo facendo uscire i messaggi duplicati (se prima scriviamo il messaggio e poi cancelliamo il job
record) o vari eccezioni se proviamo a eliminare il lavoro contemporaneamente.
Qual è il meccanismo più appropriato per gestire il blocco qui? Una cosa che abbiamo provato è aggiungere tempi di attesa casuali quando sappiamo che siamo vicini alla fine del lavoro, ma quelli non sembrano funzionare in modo affidabile.