1) primaria, il sovraccarico di primavera JMS è il uso di JmsTemplate per inviare messaggi senza un meccanismo di memorizzazione nella cache sottostante.In sostanza, JmsTemplate farà quanto segue per ogni messaggio inviato:
- Crea connessione
- Crea sessione
- Crea Produttore
- Crea messaggio
- Invia Messaggio
- Chiudi sessione
- Chiudi collegamento
Ciò potrebbe essere paragonato a scritti manualmente il codice in cui si riutilizza le cose:
- Crea connessione
- Crea sessione
- Crea Produttore
- Crea messaggio
- Invia Messaggio
- Crea messaggio
- Invia messaggio
- Crea messaggio
- Invia Messaggio
- Chiudi sessione
- Chiudi connessione
Dal momento che la creazione di connessioni, sessioni e produttori ha bisogno di comunicazione tra il client e il provider JMS e, naturalmente, l'allocazione delle risorse, creerà un sovraccarico piuttosto ampio per molti piccoli messaggi.
È possibile aggirare il problema memorizzando nella cache le risorse JMS. Ad esempio, usa la molla CachingConnectionFactory o ActiveMQs PooledConnectionFactory (se stai usando ActiveMQ, con cui hai codificato questa domanda).
Se si esegue all'interno di un contenitore JavaEE completo, il pooling/caching è spesso incorporato e implicito quando si recupera il factory di connessione JNDI.
In fase di receving, utilizzando Spring Message Listening Container, c'è un sottile strato in primavera che potrebbe aggiungere poco overhead, ma gli aspetti primari è che è possibile modificare le prestazioni in termini di concorrenza ecc. This article lo spiega molto bene.
2)
PubSub è un modello di utilizzo, in cui l'editore non ha bisogno di sapere che gli abbonati che esiste. Non puoi semplicemente emularlo con p2p. E, senza alcuna prova a portata di mano, direi che se si desidera inviare un messaggio identico da un'applicazione a dieci altre applicazioni, una configurazione pub-sub sarebbe più veloce di inviare il messaggio dieci volte p2p.
D'altra parte, se si dispone di un solo produttore e un solo consumatore, scegliere il modello P2P con le code, poiché è più semplice da gestire in alcuni aspetti. P2P (code) consente il bilanciamento del carico, che pub/sub non (come facilmente).
ActiveMQ dispone anche di una versione ibrida, VirtualDestinations, che essenzialmente tratta gli argomenti con il bilanciamento del carico.
L'implementazione effettiva differisce da diversi fornitori, ma gli argomenti e le code non sono fondamentalmente diversi e devono comportarsi con prestazioni simili. Quello che invece dovresti controllare è:
- Persistenza? (= più lento)
- Selettori dei messaggi? (= più lento)
- Concorrenza?
- abbonati durevoli? (= Più lento)
- richiesta/risposta, "sincrono" con code temporanee (= sovraccarico = più lento)
- coda prefetching (rendimento = impatti in alcuni aspetti)
- Caching
Grande risposta, solo una piccola aggiunta agli argomenti vs code (si sta sorta di citarlo, ma sarebbe bene rendere esplicito). Gli argomenti garantiscono che ogni abbonamento duraturo o offline a un argomento riceverà un messaggio. Le code garantiscono che uno e un solo abbonato elaborino un messaggio. Oltre a ciò, gli argomenti possono essere utilizzati per la comunicazione 1-1 e le code possono avere più editori e utenti con bilanciamento del carico. È tuttavia necessario eseguire il bilanciamento del carico con argomenti semplici ed è inefficiente eseguire la distribuzione di eventi con le code. Cavalli per i corsi. – ddimitrov
Buon punto, grazie per averlo chiarito. –