OK alors la file d'attente de messages MQ Qu'est-ce que les routines font? (Ce sujet converti dureté brute même j'avais peur!)
1. Les scénarios et les avantages de l'application Message Queue:
- Asynchronous - coupure du trafic
Regardons au niveau du serveur traditionnel reçoit un processus de demande de traitement
Comme indiqué plus haut, lorsqu'ils ne sont pas en cours d'utilisation de la file d'attente de messages du serveur, les requêtes des utilisateurs sont la base de données de haine droit, en cas d'une base de données concurrente de choc à haute pression, de sorte que non seulement la vitesse de réponse est plus lente et donc peut également suspendre la base de données, ce qui dans les pages de l'utilisateur directement erreur, le chef de projet est venu à la porte, puis * #! % @! # ** ...... (PS: En dépit d'être lié à un service, mais un trésor de l'utilisateur, un message d'alerte sera pot jeté au réseau nulle part oh ~)
Nous attendons après l'ajout du serveur de file d'attente de messages reçoit le flux de traitement des demandes de ce qui se passe
Comme on le voit ci-dessus, la file d'attente de message après utilisation, l'utilisateur demande pour renvoyer des données même dans le cas de concurrente élevée immédiatement après la transmission de la file d'attente de messages, puis obtenir des données à partir de la file d'attente de message par un processus de consommation de la file d'attente de message, écrit de façon asynchrone à la base de données. Étant donné que le serveur de file d'attente de messages traite le message beaucoup plus vite que la base de données, de sorte que le taux de réponse (grippe expérience utilisateur) a été grandement améliorée.
Nous pouvons donc conclure que la file d'attente de messages a un bon flux écrêtage des fonctions d'effet - qui est, par le traitement asynchrone, les messages sont stockés pour une plus forte à court temps de transactions simultanées générées dans la file d'attente de messages, réduisant ainsi le pic de transactions simultanées. Comme dans une partie de l'activité de pointe de certaines plate-forme de commerce électronique, l'utilisation rationnelle des files d'attente de messages peut résister à un grand nombre d'activités au début de l'afflux de demandes d'impact sur le système.
Étant donné que l'utilisateur a demandé des données immédiatement après avoir écrit le dos de la file d'attente de messages à l'utilisateur, mais les données de demande dans un service peuvent échouer vérifier, d'écriture et d'autres opérations dans la base de données. Ainsi, après avoir utilisé les files d'attente de messages pour le traitement asynchrone, nécessitent des changements appropriés aux processus d'affaires avec, par exemple, l'utilisateur après avoir soumis une commande, les données de commande sont écrites dans la file d'attente de messages, l'ordre ne peut pas être renvoyé à l'utilisateur, vous avez besoin immédiatement soumis avec succès pour traiter vraiment l'ordre dans la file d'attente des messages du processus de consommation après l'achèvement de l'ordre, même après la bibliothèque, puis en informer l'utilisateur via les commandes par courriel ou SMS avec succès, afin d'éviter les différends commerciaux. Ceci est similaire à un téléphone mobile, nous entraînons habituellement des billets et ainsi de suite.
- Asynchronous - système découplé
Je ne regarde d'abord alors que le système traditionnel mode de transfert de données
Comme indiqué plus haut, le système principal et les autres systèmes de couplage aussi, sont un appel direct, ou un changement de petits bits ajouter des modules, les deux doivent changer le code, est trop lourde
Puis, après que nous regardons en ajoutant la file d'attente de messages, la structure du système de ce qui se passe
Comme indiqué ci-dessus, nous savons qu'il n'y a pas d'appels directs entre le module si, puis ajouter ou modifier le module sur le module à d'autres modules d'impact plus faible, de sorte que l'évolutivité du système est sans doute mieux.
Les files de messages utilisent la publication - travail modèle abonnez-vous, l'expéditeur du message (producteur) a annoncé qu'un ou plusieurs destinataires du message (consommateurs) un message d'abonnement. De la figure on peut voir qu'il n'y a pas de couplage direct entre l'émetteur du message (producteur) et le récepteur de message (consommation), l'émetteur du message pour envoyer un message à une file d'attente de message qui est distribué termine le traitement du message, le message de destinataire à partir de la distribution après la file d'attente de messages de traitement ultérieur et obtenir le message, il n'a pas besoin de connaître le message provient. Pour les nouvelles affaires, aussi longtemps que intéressé par ce type de nouvelles, vous pouvez vous abonner à ce message, pas d'impact sur les systèmes et services existants, ce qui permet la conception de site Web d'entreprise évolutive.
En outre, pour éviter les temps d'arrêt du serveur de file d'attente de messages causée par la perte d'un message, le message sera envoyé avec succès à la file d'attente des messages stockés sur le producteur de serveur de messages et d'autres consommateurs après que le message est traité serveur réel pour supprimer le message. Après les fabricants temps d'arrêt du serveur de file d'attente de messages, le serveur choisir d'autres serveurs distribués serveur de MSMQ poster des messages de cluster.
En plus de publier le mode d'abonnement, les files d'attente de messages, il y a d'autres modes de transport
Point à point modèle
Le modèle de base, seulement un émetteur, un récepteur et une file d'attente distribuée.
Producteur modèle de consommation
Si l'expéditeur et le récepteur peuvent avoir plusieurs instances de déploiement, même de types différents, mais partagent la même file d'attente, il devient un modèle standard producteur-consommateur. Dans ce modèle, le rôle de trois communément appelé à la production (producteur), file d'attente distribuée (file d'attente), les consommateurs (consommateurs).
Résumé façon: la file d'attente de messages a amélioré la capacité de traitement simultané et l'évolutivité du système
2. Utilisez la file d'attente du message apportera le problème:
- Disponibilité réduite: Avant de rejoindre MQ, vous ne considérez le blocage de la situation serveur de MQ, après l'introduction de MQ vous devez tenir compte de la disponibilité diminue.
- La complexité croissante: Après avoir ajouté MQ, vous devez vous assurer que le message ne se répète pas la consommation, le traitement de la perte de message, assurer une messagerie ordonnée et d'autres questions. Alors, ce qui doit être considéré comme la complexité augmente et plus du système.
- Cohérence des données: les files d'attente de messages asynchrones peuvent en effet apporter une réactivité plus rapide du système, cependant, si le message est vraiment pas correct nouvelles consommateur consommateurs comment faire? Cela conduira à la situation des données incohérentes.
2.1 Quelles solutions
- Pour les problèmes d'utilisation
Après l'introduction de la file d'attente de messages, la disponibilité du système diminue. Le projet réel d'envoyer des messages MQ, sinon un cluster, où mq accident à la baisse des machines, les messages mq ne peut pas être envoyé, le système se sont effondrés, nous avons donc besoin de regrouper MQ, MQ lorsque l'un d'entre eux est tombé en panne, le reste de la machine MQ peut alors continuer à fonctionner dans la production, l'utilisation ne autonome des files d'attente de messages. Si oui, il est certainement dans l'ordre et avec (ce qui semble techniquement complexe, bon scintillement d'argent surchargée), pour cette question, le besoin d'avoir une meilleure compréhension de la technologie de cluster MQ, une variété de cluster middleware de messagerie, dans l'ordre suivant ActiveMQ le cluster comme un exemple (Zookeeper + ActiveMQ), regarder la carte
changement eeper supprimera le nud temporaire. Lorsque le serveur est enregistré avec le Zookeeper, Zookeeper attribuera un numéro de série, nous croyons que le petit numéro de série, est le « maître », le numéro de série du grand, est « préparé ».
Lorsque l'adresse qui définit le serveur « maître » de notre client (généralement un serveur web) nécessaires pour accéder au service, besoin de se connecter Zookeeper, obtenir une liste temporaire des noeuds dans le répertoire spécifié, qui est une information de serveur enregistré, l'accès au petit numéro de série , opération d'accès ultérieur. Afin d'atteindre « toujours accéder au serveur principal. ». Lorsque le serveur « maître » échoue, Zookeeper supprimer le nud temporaire correspondant à partir du répertoire spécifié, et peut informer tous les clients concernés au sujet de ce changement, la diffusion efficace et rapide de ces informations. Le moment où la demande suivante ou une connexion ZooKeeper, mais dans ce cas l'accès fait l'autre MQ.
Pour savoir comment configurer un cluster est de ne pas montrer ici, sur leur propre tutoriel de recherche sur Internet, beaucoup!
- Pour la complexité du problème
1. Comment faire en sorte que les messages ne se répètent pas la consommation de celui-ci?
Pour répondre à cette question, il faut d'abord savoir pourquoi le message sera répété la consommation, ce qui entraîne la plupart du temps en déraisonnable parce que le réseau, les informations ne sont transférées plus à la file d'attente de messages, la file d'attente de messages ne se traduit pas au courant des consommateurs qu'ils ont eu le message, et à nouveau la distribution des messages à d'autres consommateurs. Nous avons donc les trois idées suivantes pour résoudre le problème de la manière
2. Comment assurer la fiabilité de la transmission du message il?
En fait, c'est une extension de la première question, en d'autres termes, nous voulons assurer la fiabilité de la transmission, en fait, il est d'assurer que les producteurs empêchent la perte de données, les files d'attente de messages, les données perdues, les données de consommation perdu seulement
En fait, ces questions très tôt dans les développeurs middleware ont pris en compte, mais fournit également un certain nombre de documents peut être configuré pour définir les paramètres de notre propre, les files d'attente de messages généralement persisté sur le disque Ne vous inquiétez pas de la perte de données si le producteur puis MQ transactions seront annulées, peuvent essayer de le renvoyer, les consommateurs perdus mots sont généralement utilisés en mode automatique de message de confirmation conduit à l'information des consommateurs est supprimée, tant que les modifications apportées à la confirmation manuelle sur la ligne, c'est-à-dire après l'achèvement des dépenses de consommation, un appel à la MQ procédé de confirmation sur la ligne
3. Comment obtenir l'assurance de la file d'attente de messages ordre d'exécution de données?
Par algorithme, nous aurons besoin de maintenir l'ordre des messages dans la même file d'attente de messages, et seulement avec un consommateur de passer la file d'attente.
4. Comment résoudre les retards et les files d'attente de messages expireront problème? Il y a des millions d'arriéré de messages a continué pendant plusieurs heures, comment résoudre?
Le problème est, examiner comment vous résoudre le problème rapidement après environnement de production ,, accident a retardé la file d'attente des messages et mécanisme d'auto-protection est la file d'attente de messages expiré, le but est de s'empêcher d'être dégringolé, bien sûr, peut être fermé pour protéger, par exemple, lorsqu'un message est le consommateur échoue cinq fois, a mis les nouvelles a chuté, etc., essayez de ne pas désactiver le mécanisme de protection, la question est, qui le message est rejeté, ne le faites pas? Pas vraiment, nous pouvons pour cette entreprise, consultez le lot de données seront perdues, et écrire un programme temporaire, consultez un peu, puis re-versé mq à l'intérieur, les données perdues rendre jusqu'à lui.
Les données sont données au consommateur final en mode push ou pull, dont chacun a des inconvénients?
- Brouette en temps réel, mais à cause de l'état d'entretien et d'autres questions, il est difficile de mettre en pratique le middleware de message, comme
- En fin de compte la nécessité de maintenir l'état Broker des consommateurs, et non pas pour Broker pour soutenir un grand nombre de consommateurs scène
- Les taux de consommation des consommateurs est incompatible, courtier poussera difficile à gérer une situation différente des consommateurs
- Courtier consommateurs difficile de faire face à la situation ne peut pas consommer des messages, parce qu'ils ne savent pas le temps d'arrêt à la consommation est temporaire ou permanent)
- Aussi message push (le montant peut être important) augmentera la charge ou écrasé à la consommation à la consommation.
- Si le correspondant seulement à la consommation, mieux qu'avec push-pull.
- mode Pull sera relativement simple à mettre en uvre, mais en temps réel en fonction de la fréquence en rotation haute exigeant en temps réel des scènes qui ne conviennent pas à l'emploi.
3. Comment utiliser MQ (par exemple pour ActiveQM)
Fixez le site officiel: http: //activemq.apache.org/
Fixer pour démarrer l'accès au service à l'adresse: http: //127.0.0.1: 8161 / admin / nom d'utilisateur / mot de passe admin / admin
Publié modèle d'abonnement
Producteur - Poste
public class {JMSProducer static private String = USERNAME ActiveMQConnection.DEFAULT_USER // Nom d'utilisateur de connexion par défaut static private String = MOT DE PASSE ActiveMQConnection.DEFAULT_PASSWORD; // mot de passe de connexion par défaut static private String = BROKEURL ActiveMQConnection.DEFAULT_BROKER_URL; // adresse de connexion par défaut // numéro de message d'envoi; private static final int SENDNUM = 10 public static void main (String args) { ConnectionFactory connectionFactory; // Factory Connection Connexion de raccordement = null; // connecteur session de session; // envoyer un message d'acceptation de session ou fil destination de destination; // destination du message MessageProducer MessageProducer; // producteur de nouvelles // usine de connexion instancier connectionFactory = new ActiveMQConnectionFactory (JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL); try { connexion = connectionFactory.createConnection (); // Obtenir l'usine de connexion via connection.start (); // démarrer la connexion session = connection.createSession (Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // Création d'une session // destination = session.createQueue ( "FirstQueue1"); // créer une file d'attente de messages destination = session.createTopic ( "FirstTopic1"); MessageProducer = session.createProducer (destination); // créer un producteur de messages sendMessage (session, MessageProducer); // envoyer un message session.commit (); } Catch (Exception e) { // TODO bloc catch généré automatiquement e.printStackTrace (); } Enfin { if (connexion! = null) { try { Connection.close (); } Catch (JMSException e) { // TODO bloc catch généré automatiquement e.printStackTrace (); } } } } / ** * Envoyer un message * Séance @param * @Param MessageProducer * Exception @throws * / sendMessage vide de public static (session Session, MessageProducer MessageProducer) throws Exception { pour (int i = 0; i < JMSProducer.SENDNUM; i ++) { TextMessage message = session.createTextMessage ( "message transmis ActiveMQ" + i); System.out.println ( "Envoyer un message:" + "annonce ActiveMQ" + i); messageProducer.send (message); } } }Les consommateurs - Inscription
/ ** * Écoute du message - un abonné * Administrateur @Author * * / public class {Listener outils MessageListener @Override onMessage public void (message Message) { // TODO stub méthode généré automatiquement try { System.out.println ( "abonnés un message reçu:" + ((TextMessage) un message) .getText ()); } Catch (JMSException e) { // TODO bloc catch généré automatiquement e.printStackTrace (); } } } public class {JMSConsumer static private String = USERNAME ActiveMQConnection.DEFAULT_USER // Nom d'utilisateur de connexion par défaut static private String = MOT DE PASSE ActiveMQConnection.DEFAULT_PASSWORD; // mot de passe de connexion par défaut static private String = BROKEURL ActiveMQConnection.DEFAULT_BROKER_URL; // adresse de connexion par défaut public static void main (String args) { ConnectionFactory connectionFactory; // Factory Connection Connexion de raccordement = null; // connecteur session de session; // envoyer un message d'acceptation de session ou fil destination de destination; // destination du message Le message des consommateurs; MessageConsumer MessageConsumer // usine de connexion instancier connectionFactory = new ActiveMQConnectionFactory (JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL); try { connexion = connectionFactory.createConnection (); // Obtenir l'usine de connexion via connection.start (); // démarrer la connexion session = connection.createSession (Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // Création d'une session // destination = session.createQueue ( "FirstQueue1"); // crée une connexion de file d'attente de messages destination = session.createTopic ( "FirstTopic1"); MessageConsumer = session.createConsumer (destination); // Création d'un message consommateur messageConsumer.setMessageListener (nouveau Listener ()); // enregistrer l'écouteur de message } Catch (JMSException e) { // TODO bloc catch généré automatiquement e.printStackTrace (); } } }Je pense qu'une bonne file d'attente de messages distribués, vous devez avoir les fonctionnalités suivantes: débit élevé, une faible latence (en raison de scènes différentes), la transmission d'évolutivité transparente, forte, la capacité d'avoir une catastrophe redondante, la cohérence de l'ordre de livraison, asynchrone, synchrone + envoyer, améliorer le fonctionnement et l'entretien des outils de contrôle et open source