2016-03-23 11 views
5

TL; DR: Ho bisogno di "riprodurre" i messaggi di lettere morte nelle loro code originali dopo aver corretto il codice del consumatore che originariamente causava il rifiuto dei messaggi.Gestione delle lettere morte in RabbitMQ

Ho configurato il Dead Letter Exchange (DLX) per RabbitMQ e sto inoltrando correttamente i messaggi rifiutati a una coda di messaggi non recapitati. Ma ora voglio guardare i messaggi nella coda delle lettere morte e cercare di decidere cosa fare con ciascuno di essi. Alcuni (molti?) Di questi messaggi dovrebbero essere rieseguiti (rimessi in coda) nelle loro code originali (disponibili nelle intestazioni "x-death") una volta che il codice del consumatore illecito è stato corretto. Ma come faccio a fare questo? Devo scrivere un programma one-off che legge i messaggi dalla coda delle lettere morte e mi consente di specificare una coda di destinazione per inviarli? E che dire della ricerca della coda di lettere morte? Cosa succede se so che un messaggio (diciamo che è codificato in JSON) ha un determinato attributo che voglio cercare e riprodurre? Ad esempio, correggo un difetto che so consentirà il messaggio con PacketId: 1234 per elaborare correttamente ora. Potrei anche scrivere un programma una tantum per questo, suppongo.

Non posso certamente essere il primo a incontrare questi problemi e mi chiedo se qualcun altro li abbia già risolti. Sembra che ci dovrebbe essere una sorta di coltellino svizzero per questo genere di cose. Ho fatto una ricerca piuttosto ampia su Google e Stack Overflow ma non mi è venuta molto in mente. La cosa più vicina che ho trovato sono pale, ma non mi sembra lo strumento giusto per il lavoro.

risposta

4

Devo scrivere un programma one-off che legge i messaggi dalla coda di messaggi non recapitabili e mi consente di specificare una coda di destinazione a cui inviarli?

in generale, sì.

È possibile impostare una riprogrammazione ritardata per rinviare il messaggio alla coda originale, utilizzando una combinazione di delay message exchange plugin.

ma questo solo automatizza i tentativi su un intervallo e potrebbe non aver risolto il problema prima che i tentativi si ripetessero.

in alcune circostanze questo è ok - come quando l'errore è causato da una risorsa esterna che è temporaneamente non disponibile.

nel tuo caso, però, credo che i vostri pensieri sulla creazione di un app per gestire le lettere morte è il modo migliore per andare, per diverse ragioni:

  • è necessario cercare attraverso i messaggi che isn 't possibile RMQ
  • questo significa che avrete bisogno di un database per memorizzare i messaggi dalla DLX/coda di

perché si sta tirando i messaggi fuori del DLX/coda, è necessario assicurarsi ottieni tutte le informazioni dell'intestazione dal messaggio in modo da poterlo ri-pubblicare su t lui corregge la coda quando arriva il momento.

Non posso certo essere il primo a incontrare questi problemi e mi chiedo se qualcun altro li abbia già risolti.

e tu no!

ci sono molte soluzioni a questo problema che tutto si riduce alla soluzione che hai suggerito.

alcune implementazioni di "service bus" più grandi hanno questo tipo di funzionalità integrato. Credo che NServiceBus (o la versione SaaS di esso) abbia incorporato questo, per esempio - anche se non ne sono sicuro al 100%.

se si desidera esaminare ulteriormente, eseguire una ricerca del termine "messaggio velenoso", che in genere è il termine utilizzato per questa situazione. Ho trovato un paio di cose su Google con una rapida ricerca, che possono aiutare a lungo il sentiero:

speranza che aiuta!

+0

Non ho trovato i collegamenti particolarmente utili, ma per il resto apprezzo molto la tua risposta approfondita. Grazie! – Dan

+0

sì, davvero non ho letto quei link. Stavo solo cercando di trovare qualcosa che potesse essere d'aiuto. probabilmente dovrebbe averli letti prima di pubblicarli. : P –