Messagerie JMS haute performance
J'ai lu des diapositives à partir de cette année UberConf et l'un des haut-parleurs est de faire l'argument que le Printemps JMS ajoute une surcharge de performance à votre message, le système de file d'attente, mais je ne vois pas de preuve à l'appui que dans les diapositives. L'orateur a également fait le cas que de point-à-point est plus rapide que le traditionnel "publish-subscribe" méthode parce que chaque message est envoyé qu'une seule fois au lieu d'être diffusé à tous les consommateurs.
Je me demandais si tout expérimenté Java messaging gourous peuvent peser d'ici et d'éclaircir quelques points techniques:
- Est-il réellement une charge de travail générée par l'aide de Printemps JMS au lieu de simplement une pure JMS? Si oui, comment et où est-il introduit? Est-il un moyen de contourner cela?
- Les preuves à l'appui que le P2P est plus rapide que la pub-sub modèle, et si oui, sont-il jamais tous les cas, quand vous voulez pub-sub P2P (c'est à dire pourquoi aller plus lentement?!?)?
source d'informationauteur IAmYourFaja
Vous devez vous connecter pour publier un commentaire.
1) de la Primaire, la surcharge de Printemps JMS est l'utilisation de JmsTemplate pour envoyer des messages ne bénéficiant pas d'un mécanisme de mise en cache en dessous. Essentiellement, JmsTemplate va faire ce qui suit pour chaque message que vous envoyez:
Cela pourrait être comparée à l'écrit manuellement le code là où vous réutilisez les choses:
Depuis la création de connexions, des sessions et des producteurs besoins de communication entre votre client et le fournisseur JMS et, bien sûr, l'allocation des ressources, il va créer assez grand frais généraux pour beaucoup de petits messages.
Vous pouvez facilement venir autour de ce par la mise en cache des ressources JMS. Par exemple utiliser le printemps CachingConnectionFactory ou ActiveMQs PooledConnectionFactory (si vous utilisez ActiveMQ, qui vous tagged cette question).
Si vous exécutez l'intérieur d'un complet de conteneur JavaEE, la mise en commun/mise en cache est souvent construit dans et implicite lorsque vous récupérez votre connexion JNDI de l'usine.
Lors de la réception, à l'aide de printemps de Message par Défaut à l'Écoute Conteneur, il y a une fine couche au printemps qui pourrait ajouter un peu de surcharge, mais les principaux aspects est que vous pouvez optimiser la performance en termes de simultanéité etc. Cet article l'explique très bien.
2)
PubSub est un modèle d'utilisation, où l'éditeur n'a pas besoin de savoir que les abonnés qui existe. Vous ne pouvez pas simplement imiter qu'avec le p2p. Et, sans aucune preuve à part, je serais argu que si vous voulez envoyer un message identique à partir d'une application à dix autres applications, un pub-sub de l'installation est plus rapide que d'envoyer le message à dix fois le p2p.
D'autre part, si vous avez seulement un producteur et un consommateur, choisissez le P2P modèle avec les files d'attente au lieu de cela, car il est plus facile à gérer dans certains aspects. P2P (files d'attente) permet l'équilibrage de la charge, qui pub/sub n'est pas (facilement).
ActiveMQ a aussi une version hybride, VirtualDestinations - qui est essentiellement sujets avec équilibrage de la charge.
La mise en œuvre effective diffère par différents fournisseurs, mais aussi des sujets et des files d'attente ne sont pas fondamentalement différentes de se comporter avec des performances similaires. Ce que vous devez vérifier est:
Êtes-vous parler à propos de Mark Richards, de diapositives? Il a affiché le code source de ses repères, de sorte que vous pouvez réellement tester son affirmation sur JmsTemplate performance. Son indice de référence le code de n'utiliser le Printemps CachingConnectionFactory, et pourtant, en dépit de la mise en cache il le montre encore une importante perte de performance avec JmsTemplate. J'ai exécuté, profilés et analyser son code. La réponse courte est que la surcharge de JmsTemplate est négligeable et le rendement mesurables disparité dans son code, a à voir avec ActiveMQ asynchrone vs synchronisation de l'envoi de modes. J'ai posté mon analyse ici:
JmsTemplate est pas mal
1) Printemps modèles d'ouvrir/fermer les connexions/sessions pour chaque message envoyé/reçu. C'est pourquoi il est plus lent. La plupart des JMS implémentations fonctionne mieux lorsque les connexions/session reste ouverte, de sorte qu'ils peuvent utiliser des optimisations comme message pré-chargement pour ne pas mentionner éviter la surcharge de la configuration de la connexion/démonter bits.
2) les Thèmes sont généralement plus lents si elles sont la copie/réplication des données de plus d'un consommateur. C'est juste une question de physique. Si 10 mégas de messages de la file d'attente envoyé à une file d'attente, puis seulement 10 mégas de données doivent être transmises aux consommateurs. Alors que sur le sujet, si vous avez 10 consommateurs, et de vous envoyer 10 mégas de données, puis de 100 mo de données sont transmis aux consommateurs. Si, pour la plupart JMS implémentations:
Je ne suis pas gourou de messagerie, je vous souhaite de ne pas me partager ma pensée ici 😉
Il y aura toujours des frais généraux, parce que vous avez supplémentaire d'indirection. Même il est simplement un niveau supplémentaire dans la pile d'appel, il est toujours une surcharge. Cependant, je crois que cette surcharge est minime. Vous pouvez prendre un coup d'oeil dans le code source de JmsTemplate. Il n'y a pas beaucoup de choses supplémentaires ajoutés par Printemps, lors de l'envoyer. JmsTemplate est principalement ce que vous devez faire si vous êtes en utilisant JMS de toute façon. Vous pouvez toujours affirmer que ceux des vérifications supplémentaires et plus profonde de l'appel de méthode prend toujours plus de cycle du PROCESSEUR et de la mémoire. C'est vrai, mais je me demande comment il est significatif.
PubSub et P2P (Sujet et dans la File d'attente JMS terminologie) sont deux modèles différents. Je crois qu'ils sont ne peuvent pas remplacer les uns des autres. Vous ne pouvez pas avoir "envoyer une fois et diffusé à plusieurs récepteur" comportement à l'aide de la File d'attente, et en même temps vous ne pouvez pas avoir la garantie de livraison de comportement lors de l'utilisation de Sujet (sauf si utilisation Durable de l'Abonné, mais c'est un autre sujet). Donc, à choisir le type dépend de ce que vous faites, au lieu de dire aveuglément que le P2P est supérieure à celle de PubSub (qui je crois est un non-sens)