1) primaria, la sobrecarga de la primavera JMS es el uso de JmsTemplate para enviar mensajes sin un mecanismo de caché debajo.Esencialmente, JmsTemplate hará lo siguiente para cada mensaje que envíe:
- Crear conexión
- Crear sesión
- Crear Productor
- Crear mensaje
- Enviar mensaje
- Cerrar Sesión
- Cerrar conexión
Este de podría ser comparado con el código escrito manualmente, donde se vuelve a utilizar cosas:
- Crear conexión
- Crear sesión
- Crear Productor
- Crear mensaje
- Enviar mensaje
- Crear mensaje
- Enviar mensaje
- Mensaje nuevo
- Enviar mensaje
- Cerrar Sesión
- Cerrar conexión
Desde la creación de conexiones, sesiones y productores necesita la comunicación entre el cliente y el proveedor de JMS y, por supuesto, la asignación de recursos, creará una sobrecarga bastante grande para muchos mensajes pequeños.
Puede solucionar esto almacenando en caché los recursos de JMS. Por ejemplo, utilice el resorte CachingConnectionFactory o ActiveMQs PooledConnectionFactory (si usa ActiveMQ, con el que ha etiquetado esta pregunta).
Si está ejecutando dentro de un contenedor completo de JavaEE, la agrupación/almacenamiento en caché suele estar incorporada e implícita cuando recupera su fábrica de conexiones JNDI.
Al receving, usando Spring Message Messageing Contenedor por defecto, hay una capa delgada en primavera que podría agregar poca sobrecarga, pero el aspecto principal es que puede ajustar el rendimiento en términos de concurrencia, etc. This article lo explica muy bien.
2)
PubSub es un patrón de uso, en el que el editor no necesita saber qué abonados que existe. No puedes simplemente emular eso con p2p. Y, sin ninguna prueba, defiendo que si desea enviar un mensaje idéntico de una aplicación a otras diez aplicaciones, una configuración de pub-sub sería más rápida que enviar el mensaje diez veces p2p.
Por otro lado, si solo tiene un productor y un consumidor, elija el patrón P2P con colas en su lugar, ya que es más fácil de administrar en algunos aspectos. P2P (colas) permite el equilibrio de carga, que pub/sub no (con la misma facilidad).
ActiveMQ también tiene una versión híbrida, VirtualDestinations - que esencialmente trata temas con equilibrio de carga.
La implementación real difiere según el proveedor, pero los temas y las colas no son fundamentalmente diferentes y deberían comportarse con un rendimiento similar. Lo que debe verificar es:
- ¿Persistencia? (= más lento)
- ¿Selectores de mensajes? (= más lento)
- ¿Concurrencia?
- ¿Suscriptores duraderos? (= Más lento)
- petición/respuesta, "sincrónica" con colas temporales (= sobrecarga = lento)
- Queue prefetching (rendimiento = impactos en algunos aspectos)
- almacenamiento en caché
Gran respuesta, sólo una pequeña adición a los temas vs colas (que son una especie de mencionarlo, pero sería bueno para que sea explícito). Los temas garantizan que cada suscripción en línea o fuera de línea duradera a un tema recibiría un mensaje. Las colas garantizan que uno y solo un suscriptor procesaría un mensaje. Además de eso, los temas se pueden usar para la comunicación 1-1, y las colas pueden tener varios editores y suscriptores de equilibrio de carga. Se piensa en equilibrar la carga con temas simples, y es ineficiente hacer la distribución de eventos con colas. Caballos de carreras. – ddimitrov
Buen punto, gracias por dejarlo en claro. –