Domanda

Ho diversi server che producono file xml da Python e alcuni altri server che consumano quei xmls usando Java. Ho esaminato JMS e ActiveMQ solo di recente e ho deciso di provare a usarlo per passare i file XML.

Quindi ho installato demoni ActiveMQ sui server consumer e ho pensato di implementare un metodo di ciclo sui prodotti per distribuire gli xmls in modo uniforme tra i consumatori.

Python  -----------------------------> ActiveMQ ---> Java
        \                           /
         \                         /
          ---------------------------> ActiveMQ ---> Java
                                 /  /
Python  ----------------------------

Per i test, ho gestito un produttore e un consumatore e ho esaminato i risultati.

Con mia sorpresa, i messaggi del produttore sono stati distribuiti su tutti i server ActiveMQ sulla rete. Dato che gestivo solo un consumatore, riceveva solo gli xmls che arrivavano al demone ActiveMQ su quella macchina, e il resto degli xmls attendeva pazientemente gli altri demoni ActiveMQ su altre macchine.

Python  -----------------------------> ActiveMQ ---> Java (work)
                                          |
                                          |
                                       ActiveMQ (xmls piling up)

MODIFICA: non è quello che è successo, scusa. Vedi sotto per i dettagli

Ora, non mi lamento, dato che questo è quello che volevo comunque, ma sono un po 'confuso: qual è il modo corretto di implementare questa coda molti-a-molti che sto cercando?

Devo impostare anche i demoni ActiveMQ sui miei computer produttori, inviare gli xmls agli ActiveMQ localhost e fidarmi del rilevamento automatico per portare gli xmls ai consumatori?

Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
                |                                      |
                |                                      |
                |                                -- ActiveMQ ---> Java
                |                               |  
Python ---> ActiveMQ----------------------------

Devo attenermi al mio piano originale e scorrere i messaggi tra le macchine dei consumatori, solo per sicurezza?

O c'è un'API che dovrei usare per nascondere quei dettagli ai miei processi?

A proposito, i produttori sono processi Python usando STOMP e i consumatori sono Java usando JMS.

Mi scuso se i tuoi occhi sono feriti dalla mia schifosa arte ASCII, non ero sicuro di essere abbastanza chiaro con solo parole.

Modifica

Apparentemente, quando gestivo "un produttore e un consumatore" Non ho notato che gli altri consumatori erano già in esecuzione. Non stavano facendo nulla di utile con gli xmls che hanno elaborato. Ecco perché stavo vedendo risultati parziali.

Dopo aver letto un po 'di più e sperimentato un po', ho capito quanto segue:

Per impostazione predefinita, ActiveMQ rileverà automaticamente altre istanze ActiveMQ sulla rete locale e creerà un store-and-forward rete di broker . Ciò significa che il produttore può pubblicare xmls su qualsiasi istanza ActiveMQ e troverà la strada per i consumatori che ascoltano altre istanze ActiveMQ sulla stessa rete.

Si noti che la documentazione afferma che il rilevamento automatico non è consigliato per le configurazioni di produzione.

La risposta accettata di seguito è comunque valida. Il modo più semplice di usare ActiveMQ è usare solo uno o due server come "Queue Server". Tuttavia, ho scelto di seguire il mio piano originale, perché penso ridurrà il traffico di rete (con un server intermedio, gli xmls devono entrare e uscire di nuovo).

È stato utile?

Soluzione

Itsadok, penso che probabilmente non stai considerando l'uso corretto della messaggistica.

Avere un'istanza MOM (sia ActiveMQ, RabbitMQ o qualsiasi altro broker MOM) su un caso uno per consumatore non ha davvero senso concettualmente. Piuttosto, è meglio pensare al tuo broker MOM come a un router di messaggi.

In tal caso, si avrebbe un'istanza del broker ActiveMQ (che potrebbe essere ridotta o altrimenti ridimensionata in caso di problemi di ridimensionamento o replicata se si hanno considerazioni HA) a cui si connettono tutti i produttori e tutti i consumatori. Quindi tutto l'XML passa alla stessa istanza del broker e tutti i consumatori leggono dalla stessa istanza del broker. In tal caso, il broker determinerà a quale consumatore dovrebbe andare il messaggio in base a qualsiasi euristica che utilizza.

Ciò significa anche che è possibile aggiungere e rimuovere produttori e consumatori in modo dinamico, e nulla cambia mai: si collegano tutti agli stessi broker, quindi è possibile aggiungere e rimuovere produttori e consumatori in caso di modifica del carico o in caso di guasto dei sistemi.

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