2013-03-09 25 views
7

ho trovato questo gioiello:riconnettersi automaticamente i canali RabbitMQ

In caso di un errore di connessione, il cliente avrà bisogno di stabilire una nuova connessione al broker. Tutti i canali aperti sulla connessione precedente verranno automaticamente chiusi e anche questi dovranno essere riaperti.

Quindi non va bene. Sto per scrivere un grande livello di gestione delle riconnessioni automatiche e ricreare i canali, quindi incapsulare questo evento da tutto il mio codice. Il problema è che dovrebbe essere già fatto. Questo è possibile nelle librerie RMQ di Java?

+0

Non sono sicuro di seguire il problema relativo ai canali. Sono come connessioni lite. Quindi, se ti disconnetti, perderai anche i tuoi canali. – robthewolf

+0

Lo hai mai capito? O hai scritto il tuo livello di ricollegamento automatico? Qualche possibilità che tu condivida? – StFS

+0

@StFS Ho scritto un livello di riconnessione molto * kludgey *.Non è particolarmente facile per me aprire l'open source a questo punto, ma sarei felice di consigliarlo - pubblica una domanda su programmers.SE chiedendo aiuto per progettare questo livello e ti risponderò. – djechlin

risposta

1

Sì, sono d'accordo che questo è uno svantaggio principale dell'attuale implementazione del client RabbitMQ. Ho usato RMQ per circa 2 anni (la libreria .NET), e non molto è cambiato a riguardo in quel momento. Deve essere completamente riscritto da zero e non ho ancora avuto il tempo di farlo.

Ma io ho alcune indicazioni. Per prima cosa creerei una classe wrapper per la connessione/oggetto canale (è necessario che il canale esegua le operazioni AMQP, l'unica cosa per cui la connessione è utilizzata è creare canali). Quindi, la classe wrapper può tenere traccia di se il canale o la connessione è aperta e agire di conseguenza.

Il mio codice finisce per assomigliare a questo:

while (_iNeedToBeSendingAndReceiving) { 
try { 

//This blocks indefinitely while waiting for a connection. 
using (var channel = ConnectionWrapper.CreateChannel(string connectionString) { 

    //Do stuff, blah, blah 
    //When the connection or channel closes, an exception is thrown and 
    //I move to the catch block. 
    }  
    catch(ConnectionInterruptException ex) { 
    //Eat, yummy! 
    } 
} 

mio eventuale piano è quello di astratto, anche questa roba via, e creare un modo completamente nuovo di interagire con il RabbitMQ (o qualsiasi altro messaggistica) libreria. Ti farò sapere quando avrò lavorato su questo, potrebbe essere un paio di mesi.

+0

Hai detto che ci avresti fatto sapere. È mai successo? –

6

Check out Lyra: Un client RabbitMQ ad alta disponibilità che recupera automaticamente le risorse (connessioni/canali/consumatori) quando vengono chiuse in modo imprevisto.

+0

Può mantenere lo stato come se un consumatore stia attualmente consumando? – djechlin

+0

@djechlin Definitely - Tutti i consumatori che stanno consumando attualmente sono recuperati. – Jonathan

2

A partire da RabbitMQ 3.3.0 (aprile 2014) questo è possibile con i client Java.

Questa versione. . . consente ai client basati su Java di riconnettersi automaticamente dopo un errore di rete.

Non so se si tratta di una modifica solo del server, una modifica solo alle librerie client che lo rende possibile, ecc. Ricerca ancora.

6

Forse questa è una nuova funzionalità del client RabbitMQ, ma ho trovato questo nei loro documenti:

per consentire il ripristino di connessione automatica, utilizzare factory.setAutomaticRecoveryEnabled (vero):

https://www.rabbitmq.com/api-guide.html

Sembra che dovrebbe risolvere il problema.

Problemi correlati