DRY: A propos de MQ, vous ne savez pas

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!)

  • Et les avantages de l'utilisation du message scène Queuing
  • Message Queuing apportera le problème, quelles solutions
  • Comment utiliser MQ (par exemple, un exemple simple avec ActiveMQ)
  • 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

  • Si le message est de faire insérer le fonctionnement de la base de données, ce message est de faire une clé primaire unique, même si la situation se produit une consommation répétée, cela conduira à un conflit de clé primaire, afin d'éviter la base de données apparaissent des données sales.
  • Si vous obtenez l'opération de nouvelles définir les Redis, ne résolvent pas, car vous avez défini plusieurs fois si les résultats sont les mêmes, même si le pouvoir avait mis l'opération et d'autres opérations.
  • Si ce qui précède deux conditions ne suffit pas, préparer un tiers à faire les dossiers des consommateurs de services. Pour Redis exemple, un identifiant global attribué au message, tant que le consommateur par le message, < id, un message > Redis écriture pour former K-V. Avant les consommateurs commencer à dépenser, allez Redis il n'y a pas requête d'enregistrement de consommation peut être.
  • 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.

  • rabbitmq: une pluralité de files d'attente partagée, chaque file d'attente d'un consommateur, il est un peu plus file d'attente, est gênant en effet le point, ou il correspond à une file d'attente, mais un consommateur, le consommateur avec une mémoire interne file d'attente ne file d'attente, puis distribué pour le sous-jacent travailleur à poignée
  • kafka: un sujet, une cloison, un consommateur, une consommation interne mono-thread, et la file d'attente de mémoire d'écriture de N, N fils sont ensuite consommation à une file d'attente de mémoire
  • 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

    190617 Partager Reba studio aujourd'hui fée de style tapis rouge Chang E est de saisissants débuts
    Précédent
    C2B ensemble pour créer les premiers projets de personnalisation intelligents axés sur les utilisateurs en surpoids nouveaux formats
    Prochain
    Le sit boy anti-bus, descendez le pilote Pro glisse un morceau de papier, chaud ouvert pleurer ???
    route haute performance Analyse source FastThreadLocal Netty (rapide et sécurisé)
    Après Sun Yang a annoncé abandonner la course, au Japon, mais son tir des publicités feu
    Message-Driven --Spring Nuage flux
    Message: Liverpool et l'Inter Ao Liji Suite longueur totale d'environ 70 millions d'euros offre Loukakou
    Un salaire mensuel de 50000, alors quoi? En cela, il suffit à peine pour laver une voiture
    618 nouveaux Raiders de réception complète de téléphone portable: Comment vérifier le téléphone est authentique?
    Il était un examen d'entrée au collège, le Nord a gagné une bourse d'études, mais a couru vers les zones rurales: seulement pour le cur pastoral
    BBC exposer la vérité de l'exercice, vainquit le sens commun: des centaines de millions de personnes sont inutiles exercice
    28 340000 jeune couple a acheté une petite maison de jardin mobiles, amovible amovible peut ranger
    On ne peut que l'entretien régulier comme une voiture, mais aussi ne pas souffrir examen?
    Graphique Java mécanisme de collecte des ordures, très bien écrit