Come si preserva l'ordine dei messaggi quando si consumano messaggi da ActiveMQ?

StackOverflow https://stackoverflow.com/questions/426532

  •  06-07-2019
  •  | 
  •  

Domanda

Ho un servizio .NET che utilizza il client ActiveMQ. Ho implementato un MessageListener con una connessione trattata per consumare i messaggi.

Di tanto in tanto ricevo messaggi in un ordine diverso in cui sono stati messi in coda.

È stato sbagliato usare un MessageListner? C'è un modo per preservare l'ordine dei messaggi?

FYI: c'è un produttore che mette i messaggi in coda e un consumatore che estrae i messaggi dalla coda.

È stato utile?

Soluzione 2

Ulteriori informazioni: il server che chiamo è di terze parti e non ho alcun controllo sui messaggi che invia. Lo so, in base agli ID dei messaggi, che sono stati inseriti nel giusto ordine. Inoltre, in questo sistema c'è una differenza tra ACK e Acknowledge. L'ACK viene ricevuto quando il mio messaggio originale viene inserito in " in uscita " coda. Quindi monitoro un "inbound" coda per le risposte. Di solito ricevo un " Riconoscimento " seguito da un " Pass " o un "fallimento". L'ID di correlazione per questi messaggi è l'ID del messaggio da ACK.

Inizialmente avevo usato un listener di messaggi e avevo risposto a un evento OnMessge. Ho abbandonato questo approccio dopo aver realizzato che, usando questo metodo, i messaggi vengono recapitati in modo asincrono e quindi in nessun ordine particolare. Quindi, ho cambiato il mio codice in polling usando un timer (System.Threading.Timer) per chiamare consumer.Receive () e ottenere un messaggio alla volta. Funziona come voglio.

Apro il consumatore una volta all'avvio del servizio e continuo a cercare messaggi.

Altri suggerimenti

Non dovresti fare nulla per mantenere l'ordine; questa è una delle cose che una coda di messaggi fa per te. Penserei che se un singolo utente ascolta la coda e sta elaborando i messaggi fuori servizio, allora hai trovato un bug o i messaggi non sono accodati nell'ordine che pensi che siano.

Inoltre, c'è questa domanda dalle FAQ di ActiveMQ che potrebbero aiutare.

Modifica: dalla lettura dei commenti su la risposta di duffymo , sembra che tu stia un po 'esagerando. In generale, una coda di messaggi come ActiveMQ, MQ Series, joram, ecc. Hanno due caratteristiche: recapitano i messaggi nello stesso ordine in cui sono accodati e garantiscono la consegna dei messaggi. L'invio di un messaggio ACK separato è ridondante; è un po 'come eseguire una transazione di database, quindi richiedere nuovamente le stesse informazioni per ricontrollare che il database le abbia effettivamente memorizzate.

Detto questo, il tuo server è multithread? In tal caso, è possibile che accoda la risposta prima accoda l'ACK.

Perché è importante l'ordine dei messaggi? A MessageListener non dovrebbe importare.

Se hai bisogno di un ID di correlazione per abbinare una risposta a una particolare richiesta, è un'altra questione. È questo che intendi?

Tutto ciò che Jason ha appena detto. Alcune altre cose di cui fare attenzione. Stai mantenendo il consumatore aperto per molti messaggi giusto? Non stai creando un consumatore per alcuni messaggi e poi chiudendolo? Solo la chiusura di un consumatore provoca la reimpostazione dei messaggi associati a un consumatore in una coda che può interrompere l'ordine.

È correlato ai rollback? (Stai eseguendo il rollback di eventuali transazioni?).

Infine, puoi sempre garantire l'ordine utilizzando un Resequencer per riordinare le cose per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top