qu'est-ce que JMS bon?
Je suis à la recherche (simple) exemples de problèmes pour lesquels JMS est une bonne solution, et aussi les raisons pour lesquelles JMS est une bonne solution dans ces cas. Dans le passé, j'ai simplement utilisé la base de données comme un moyen de faire passer des messages de A à B lorsque le message ne peut pas nécessairement être traités par B immédiatement.
Un exemple hypothétique d'un tel système est l'endroit où tous les nouveaux utilisateurs enregistrés doivent être envoyés un e-mail de bienvenue dans un délai de 24 heures d'enregistrement. Pour les besoins de la discussion, supposons que le DB ne prend pas de record de l'heure à laquelle chaque utilisateur inscrit, mais au lieu d'une référence (clé étrangère) à chaque nouvel utilisateur est stocké dans le pending_email table. L'e-mail de l'expéditeur travail s'exécute une fois toutes les 24 heures, envoie un e-mail à tous les utilisateurs de ce tableau, puis supprime tous les pending_email dossiers.
Cela semble être le genre de problème dont JMS doit être utilisé, mais il n'est pas clair pour moi, quel est l'avantage de JMS sur l'approche que j'ai décrit. Un avantage de la DB approche est que les messages sont persistantes. Je comprends que JMS files d'attente de messages peuvent également être conservées, mais dans ce cas, il semble y avoir peu de différence entre JMS et la "base de données en tant que message de la file d'attente" approche que j'ai décrit?
Ce qui me manque?
- Ne
- Vous essentiellement à l'aide de la
pending_email
table comme un message de la file d'attente actuellement.
Vous devez vous connecter pour publier un commentaire.
JMS et de messagerie est vraiment 2 choses totalement différentes.
Voir plus d'informations sur comment une file d'attente se compare à un sujet
Le cas dont vous parlez, est le deuxième cas, où oui, vous pouvez utiliser une base de données de la table pour un peu de simuler un message de la file d'attente.
La principale différence est JMS message queue est une haute performance hautement simultanées d'équilibrage de charge, conçu pour l'énorme débit; vous pouvez envoyer habituellement des dizaines de milliers de messages par seconde à de nombreuses concurrentes des consommateurs dans de nombreux processus et les threads. La raison pour cela est qu'un message de la file d'attente est fondamentalement très asynchrone - un bon fournisseur JMS sera diffuser des messages à l'avance de l'heure à chaque consommateur de sorte qu'il y a des milliers de messages disponibles pour être traité dans la RAM dès qu'un consommateur est disponible. Cela conduit à une massive throughtput et une très faible latence.
par exemple, d'imaginer l'écriture d'un site web d'équilibrage de la charge à l'aide d'une table de base de données 🙂
Lors de l'utilisation d'une table de base de données, généralement un fil a tendance à verrouiller l'ensemble de la table si vous avez tendance à obtenir de très faible débit lors de la tentative de mettre en œuvre une haute performance d'équilibrage de la charge.
Mais comme la plupart des intergiciels tout dépend de ce que vous avez besoin, si vous avez un faible débit du système avec seulement quelques messages par seconde - n'hésitez pas à utiliser une table de base de données comme une file d'attente. Mais si vous avez besoin d'une faible latence et débit élevé - alors JMS files d'attente sont fortement recommandés.
À mon avis JMS et d'autres basés sur des messages systèmes sont destinés à résoudre des problèmes qui ont besoin d':
JMS mise en œuvre est "push", dans le sens que vous n'avez pas à interroger la file d'attente pour découvrir de nouveaux messages, mais vous vous inscrivez une fonction de callback qui est appelée dès qu'un nouveau message arrive.
à l'adresse le commentaire d'origine. ce qui a été décrit à l'origine est l'essentiel (point-to-point) JMS. les avantages de JMS sont, cependant:
vous n'avez pas besoin d'écrire le code vous-même (et éventuellement vis de la logique, de sorte que ce n'est pas tout à fait aussi persistante que vous pensez que c'est). aussi, la troisième partie impl peut-être plus évolutif que de la simple approche de base de données.
jms poignées de publier/souscrire, ce qui est un peu plus compliqué que le point-à-point de l'exemple que vous avez donné
vous n'êtes pas lié à une mise en œuvre spécifique, et peut l'échanger si vos besoins changent à l'avenir, sans déconner w/votre code java.
Un avantage de JMS est de permettre le traitement asynchrone qui peut en solution de base de données ainsi. Cependant voici quelques autres avantages de JMS plus de solution de base de données
a) Le consommateur du message peut être dans un emplacement distant. L'exposant de la base de données pour l'accès à distance est dangereux. Vous pouvez contourner ce problème en fournissant d'autres services pour la lecture des messages de la base de données, qui nécessite plus d'efforts.
b) Dans le cas de la base de données le message consommateur n'a qu'à interroger la base de données pour les messages où que JMS fournit de rappel lorsqu'un message est arrivé (comme sk mentionné)
c) l'équilibrage de la Charge si il y a beaucoup de messages à venir, il est facile d'avoir un pool de processeurs de messages dans JMS.
d) En général, la mise en œuvre via JMS sera plus simple et de prendre moins d'effort que la base de données de l'itinéraire
JMS est une API utilisée pour le transfert des messages entre deux ou plusieurs clients. C'est les specs sont définies en vertu de la JSR 914.
JMS sont juste une sorte d'interfaces/Api et les classes concrètes doivent être mises en œuvre. Ceux-ci sont déjà mises en œuvre par divers organismes de services et des Fournisseurs. ils sont appelés fournisseurs JMS. Exemple est WebSphere par IBM ou FioranoMQ par le circuit de Fiorano Logiciels ou par Apache ActiveMQ, HornetQ, OpenMQ etc. .D'autres terminologies utilisées sont des Objets d'administration(les Sujets,les Files d'attente,ConnectionFactories),JMS producteur/Éditeur, client JMS et le message lui-même.
Donc, pour en venir à votre question -
what is JMS good for?
Je voudrais donner un exemple concret pour illustrer son importance.
Day Trading
Il y a cette fonctionnalité appelée LVC(Dernière valeur de cache)
Dans le commerce, les prix des actions sont publiés par un éditeur à intervalles réguliers. Chaque action est associée à un Sujet sur lequel il est publié. Maintenant, si vous savez ce qu'un Sujet est, alors vous devez connaître les messages ne sont pas enregistrés comme des files d'attente. Les Messages sont publiés pour les abonnés en vie au moment où le message a été publié(Exception étant les biens Durables les abonnés qui reçoivent tous les messages publiés depuis le moment où il a été créé, mais encore une fois nous ne voulons pas trop vieux stock, des prix qui jeter la possibilité de l'utiliser). Donc, si un client vous voulez connaître un prix des actions lui créer un abonné, puis il doit attendre jusqu'à la prochaine du prix des actions est publié(ce qui n'est pas ce que nous voulons). C'est là que LVC entre en image. Chaque LVC message est associé à une clé. Si un message est envoyé avec un LVC clé(un stock particulier) et puis un autre message de mise à jour avec la même clé eux le plus tard remplace la précédente. Quand jamais un abonné souscrit à une question(qui a LVC activé), l'abonné pourra obtenir tous les messages distincts avec LVC clés. Si nous observons une nette clé par la société cotée puis lorsque le client souscrit à lui, il va obtenir les derniers prix des actions et, finalement, toutes les mises à jour.
Bien sûr c'est l'un des facteurs autres que la fiabilité,la sécurité, etc ce qui rend JMS si puissant.
Guido a la définition complète. De mon expérience, tous ces éléments sont importants pour un bon ajustement.
Une des utilisations que j'ai vu est de l'ordre de la distribution dans les entrepôts. Imaginez un bureau d'approvisionnement de l'entreprise, qui a un certain nombre de magasins qui fournissent les grands bureaux avec des fournitures de bureau. Ces ordres viennent dans un emplacement central et être groupées en place pour le bon entrepôt à distribuer. Les entrepôts n'ont pas ou veulent les connexions haut débit dans la plupart des cas, de sorte que les commandes sont poussés vers le bas sur la numérotation des modems et c'est là que asynchrone est en. Les lignes téléphoniques ne sont pas vraiment important, de sorte que la moitié de la commande peut obtenir dans et c'est là où la fiabilité est importante.
Le principal avantage est sans rapport avec le découplage des systèmes plutôt que de les partager comon bases de données ou le développement de services personnalisés pour transmettre des données autour de.
Les banques sont un exemple vif, avec intraday de messagerie utilisée pour transmettre en direct les modifications de données comme ils se produisent. Il est très facile pour le système source pour lancer un message "sur le mur"; l'inconvénient est qu'il ya très peu dans la voie de contrat entre ces systèmes, et vous voyez normalement l'hospitalisation d'être mis en œuvre sur la du côté des consommateurs. C'est presque trop faiblement couplés.
D'autres avantages sont à la baisse le support pour la JMS hors de la boîte pour de nombreux serveurs d'applications, etc. et tous les outils autour de cela: la durabilité, de surveillance, de déclaration et de limitation.
Il y a une belle écriture-up avec quelques exemples ici: http://www.winslam.com/laramee/jms/index.html
La base de données en tant que message de la file d'attente de solution peut être lourde pour la tâche. Le JMS solution est moins étroitement couplé en ce que le message de l'expéditeur n'a pas besoin de savoir quelque chose au sujet du bénéficiaire. Ceci pourrait être accompli avec une certaine abstraction supplémentaire dans la base de données en tant que message de la file d'attente' ainsi donc, il n'est pas un gain énorme...vous pouvez Aussi utiliser la file d'attente dans un "publier et s'abonner' manière qui peut être pratique en fonction de ce que vous essayez d'accomplir. C'est aussi une belle façon de dissocier davantage vos composants. Si l'ensemble de votre communication est à l'intérieur d'un système et/ou d'avoir un journal qui est immédiatement disponible pour une application est très important, votre méthode semble bonne. Si vous êtes à la communication entre les différents systèmes de JMS est un bon choix.
JMS en combinaison avec JTA (Java Transaction API) et JPA (Java persistence API) peut être très utile. Avec une simple annotation, vous pouvez mettre plusieurs actions de base de données + message de l'envoi/réception dans la même transaction. Donc, si l'un d'eux échoue tout est roulé en arrière en utilisant le même mécanisme de transaction.