Domanda

Mi piacerebbe eliminare selettivamente i messaggi da una coda di AMQP senza nemmeno leggerli.

Lo scenario è il seguente:

L'invio di lato vuole scadere messaggi di tipo X sulla base di un dato di fatto che le nuove informazioni di tipo X è arrivato. Perché è molto probabile che l'abbonato non consumare ultimo messaggio di tipo X ancora, l'editore deve solo eliminare i messaggi precedenti X-tipo e mettere un più recente nella coda. L'intera operazione deve essere trasparente per l'utente -. In realtà egli dovrebbe usare qualcosa di semplice come STOMP per ottenere i messaggi

Come fare con AMQP? O forse è più conveniente in un altro protocollo di messaggistica?

mi piacerebbe evitare di un'infrastruttura complicata. Tutta la messaggistica necessaria è semplice come sopra:. Una coda, un abbonato, un editore, ma l'editore deve avere la capacità di ad-hoc Eliminazione del messaggio per un dato criterio

Il client editore userà Rubino, ma in realtà mi piacerebbe trattare con qualsiasi lingua, non appena scopro come farlo nel protocollo.

È stato utile?

Soluzione

Non è possibile attualmente fare questo in RabbitMQ (o più in generale, in AMQP) automaticamente. Ma, ecco una soluzione semplice.

diciamo Let si desidera inviare tre tipi di messaggi: Xs, Ys e Zs. Se ho capito bene la tua domanda, quando un messaggio X arriva, si desidera che il mediatore per dimenticare tutti gli altri messaggi di X che non sono stati consegnati.

Questo è abbastanza facile da fare in RabbitMQ:

  • il produttore dichiara tre code: X, Y e Z (sono automaticamente legati allo scambio di default con i loro nomi come chiavi di routing, che è esattamente quello che vogliamo),
  • durante la pubblicazione di un messaggio, il produttore prima elimina la coda in questione (così, se è la pubblicazione di un messaggio X, in primo luogo elimina la coda X); questo rimuove in modo efficace i messaggi obsoleti,
  • il consumatore consuma semplicemente dalla coda che vuole (X per i messaggi di X, Y per i messaggi Y, ecc); dal suo punto di vista, si deve solo fare un basic.get per ottenere il prossimo messaggio in questione.

Questo implica una condizione di competizione quando due produttori inviano lo stesso tipo di messaggio nella parte circa lo stesso tempo. Il risultato è che il suo possibile per l'una coda di avere due (o più) i messaggi allo stesso tempo, ma dal momento che il numero di messaggi è superiore delimitata dal numero di produttori, e dal momento che i messaggi superflui vengono eliminati sulla prossima pubblicazione , questo non dovrebbe essere un gran problema.

In sintesi, questa soluzione ha un solo passo in più dalla soluzione ottimale, vale a dire di spurgo coda di X prima di pubblicare un messaggio di tipo X.

Se avete bisogno di impostare questa configurazione di aiuto, il luogo ideale per chiedere un consiglio è la mailing list RabbitMQ-discutere.

Altri suggerimenti

Se non si desidera una coda di messaggi, si desidera un database chiave-valore. Per esempio si potrebbe usare Redis o Tokyo Tyrant per ottenere un semplice database chiave-valore accessibile in rete. O semplicemente utilizzare un memcache.

Ogni tipo di messaggio è una chiave. Quando si scrive un nuovo messaggio con la stessa chiave, sovrascrive il valore precedente in modo che il lettore di questo database sarà mai in grado di uscire da informazioni aggiornate.

A questo punto, avete solo bisogno di una coda di messaggi per stabilire l'ordine in cui devono essere lette le chiavi, se questo è importante. In caso contrario, basta continuamente eseguire la scansione del database. Se continuamente la scansione del database, è meglio mettere il database in prossimità dei lettori per ridurre il traffico di rete.

I probabilmente fare qualcosa di simile key: typecode value: lastUpdated, important data

Poi vorrei inviare messaggi che contengono typecode, lastUpdated In questo modo il lettore può confrontare LastUpdated per quella chiave a quello che loro ultima lettura dal database e saltare la lettura perché sono già aggiornati.

Se avete veramente bisogno di fare questo con AMQP, quindi utilizzare RabbitMQ e un tipo di scambio personalizzato, in particolare un Ultimo valore Cache Exchange. codice di esempio è qui https://github.com/squaremo/rabbitmq-lvc-plugin

Sembra funzionare anche dal RabbitMQ Web-UI, se si desidera solo per rimuovere primi messaggi n dalla coda

  • Selezionare la coda dal tab "code", scorrere fino alla sezione "Get messaggi"
  • impostare il parametro "riaccodamento = No" e il numero di messaggi che si desidera rimuovere dalla coda
  • premere "Get messaggi" pulsante

Questa domanda ha grande visibilità a causa del titolo di esso. Passando attraverso la descrizione si sofferma con lo scenario più specifico. Così, per quegli utenti che stanno cercando di eliminare effettivamente il messaggio successivo (ricordate FIFO) dalla coda, si può fare uso di rabbitmqadmin ed emettere il sotto comando:

rabbitmqadmin get queue=queuename requeue=false count=1

Questo comando è essenzialmente consumando il messaggio e non fare nulla. Un comando completo con la bandiera a prendere il backup del messaggio (s) potrebbe essere simile al di sotto di un. Assicurati di aggiungere altri parametri secondo il vostro requisito.

sudo python rabbitmqadmin -V virtualhostname -u user -p pass get queue=queuename requeue=false count=1 payload_file=~/origmsg

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