Questions d'entretien Java (file d'attente de messages)

1. Qu'est-ce qu'une file d'attente de messages

        Une file d'attente de messages est un modèle de communication permettant de transmettre des messages entre des applications. Il permet à l'expéditeur (producteur) d'envoyer des messages à un middleware (file d'attente de messages), et le destinataire (consommateur) peut obtenir ces messages du middleware pour traitement. Les files d'attente de messages fournissent une méthode de communication asynchrone et découplée qui permet à différentes applications d'envoyer et de recevoir des messages indépendamment sans avoir besoin d'une communication point à point directe.

L'idée centrale de la file d'attente de messages est de découpler l'envoi et la réception de messages, afin que les producteurs et les consommateurs puissent fonctionner de manière indépendante sans interagir les uns avec les autres en temps réel. Ses principales caractéristiques comprennent :

  1. Communication asynchrone : une fois que le producteur a envoyé le message à la file d'attente de messages, il peut revenir immédiatement sans attendre la réponse du consommateur. Les consommateurs peuvent obtenir des messages de la file d'attente de messages pour traitement à un moment approprié sans attendre la disponibilité des producteurs.

  2. Découplage : la file d'attente de messages réalise le découplage entre les producteurs et les consommateurs, et ils n'ont pas besoin de communiquer directement. Les producteurs n'ont qu'à envoyer des messages à la file d'attente de messages, et les consommateurs n'ont qu'à obtenir des messages de la file d'attente de messages pour traitement. Ce découplage rend le système plus évolutif et flexible.

  3. Persistance des messages : les files d'attente de messages conservent généralement les messages sur les supports de stockage pour garantir la fiabilité des messages lors de l'envoi et de la réception. Même si le consommateur est temporairement indisponible après l'envoi du message, les messages sont conservés dans la file d'attente des messages jusqu'à ce que le consommateur soit prêt à les recevoir et à les traiter.

  4. Mode de messagerie : Message Queue prend en charge plusieurs modes de messagerie, tels que le mode point à point et le mode publication/abonnement. En mode point à point, les messages sont reçus et traités par un seul consommateur ; tandis qu'en mode publication/abonnement, les messages peuvent être reçus par plusieurs abonnés.

  5. Mise en mémoire tampon et écrêtage des pics : les files d'attente de messages peuvent être utilisées comme couche tampon pour équilibrer la différence de vitesse entre les producteurs et les consommateurs. Lorsque la puissance de traitement du consommateur n'est pas suffisante pour gérer un grand nombre de messages générés par le producteur, la file d'attente de messages peut tamponner les messages et les envoyer progressivement au consommateur pour éviter une surcharge du système.

        Les files d'attente de messages sont largement utilisées dans les systèmes distribués, les architectures de microservices, le traitement des tâches asynchrones, la collecte de journaux, les événements et d'autres scénarios pour améliorer l'évolutivité, la fiabilité et les performances du système. Les systèmes de file d'attente de messages courants incluent RabbitMQ, Apache Kafka, ActiveMQ, Redis, etc.

2. Scénarios d'utilisation de la file d'attente de messages

  1. Traitement des tâches asynchrones : placez les tâches chronophages ou nécessitant un traitement asynchrone dans la file d'attente des messages, et les consommateurs obtiendront de manière asynchrone les tâches de la file d'attente pour le traitement, afin d'améliorer la vitesse de réponse et le débit du système.

  2. Découplage des composants du système : en utilisant les files d'attente de messages comme middleware, différents composants du système peuvent être découplés en publiant et en s'abonnant aux messages, réalisant ainsi un couplage lâche entre les systèmes et améliorant la maintenabilité et l'évolutivité du système.

  3. Détourage et traitement des pics de trafic : lorsque le système est confronté à un nombre élevé de demandes simultanées, les files d'attente de messages peuvent être utilisées comme couche tampon pour gérer en douceur les pics de trafic. Placez la demande dans la file d'attente des messages, puis le consommateur consommera et traitera progressivement la demande en fonction de la capacité de traitement du système pour éviter une surcharge du système.

  4. Synchronisation des données dans les systèmes distribués : dans les systèmes distribués, les files d'attente de messages peuvent être utilisées pour synchroniser les données entre différents nœuds. Lorsqu'un nœud change, l'événement de modification est publié dans la file d'attente de messages sous la forme d'un message, et d'autres nœuds peuvent s'abonner et recevoir ces messages pour maintenir la cohérence des données.

  5. Collecte et analyse des journaux : les journaux d'application sont envoyés à la file d'attente de messages sous la forme de messages, puis les consommateurs stockent les journaux dans le système de stockage centralisé des journaux pour une analyse et une surveillance unifiées des journaux.

  6. Architecture pilotée par les événements : la publication et l'abonnement aux événements sont réalisés via la file d'attente de messages, et différents services peuvent s'abonner aux événements intéressés selon leur propre logique métier, réalisant une architecture pilotée par les événements découplée.

  7. Découplage des applications et extension du système : la communication entre les différentes applications s'effectue via la file d'attente de messages, qui peut réaliser le découplage entre les applications et faciliter l'extension et la mise à niveau du système.

  8. Mise à jour du cache : dans le scénario de cache distribué, la notification de mise à jour du cache est implémentée via la file d'attente de messages. Lorsque les données changent, l'événement de modification est publié dans la file d'attente de messages, puis le consommateur met à jour le cache pour maintenir la cohérence du cache.

3. Comment la file d'attente de messages résout-elle le problème de la perte de messages

  1. Messages persistants : les files d'attente de messages offrent souvent la possibilité de conserver les messages sur le disque. Lorsqu'un message est envoyé à une file d'attente, il peut être marqué comme persistant pour s'assurer qu'il peut être récupéré même en cas de panne ou de redémarrage du système. Les messages persistants peuvent être stockés de manière persistante dans une file d'attente de messages pour éviter la perte de messages.

  2. Mécanisme de confirmation : la file d'attente de messages prend en charge un mécanisme permettant aux consommateurs d'envoyer des confirmations de message. Lorsque le consommateur obtient le message de la file d'attente et le traite avec succès, il peut envoyer un message de confirmation à la file d'attente de messages pour informer la file d'attente que le message a été traité. Si la file d'attente de messages ne reçoit pas de message d'accusé de réception, elle peut considérer que le message n'a pas été traité avec succès, puis renvoyer le message à d'autres consommateurs pour traitement, évitant ainsi la perte de message.

  3. Mécanisme de nouvelle tentative : une fois que la file d'attente de messages a envoyé un message au consommateur, si une erreur ou un échec se produit lorsque le consommateur traite le message, la file d'attente de messages peut prendre en charge la redistribution du message au consommateur afin que celui-ci puisse essayer de traiter le message. message à nouveau. En définissant le nombre de tentatives et l'intervalle entre les tentatives, vous pouvez réduire le risque de perte de messages.

  4. Mécanisme de tolérance aux pannes : les files d'attente de messages disposent généralement d'un mécanisme de tolérance aux pannes, qui peut protéger la livraison fiable des messages en cas d'exceptions ou d'échecs. Par exemple, utilisez un mécanisme de réplication pour répliquer les messages sur plusieurs nœuds ou utilisez un stockage redondant pour protéger les données des messages contre la perte de messages.

  5. Surveillance et alarme : la file d'attente de messages peut fournir des mécanismes de surveillance et d'alarme, afin que le personnel concerné puisse être averti à temps lorsque des conditions anormales se produisent. En surveillant l'état et les indicateurs de performance des files d'attente de messages, les problèmes potentiels de perte de messages peuvent être rapidement découverts et résolus.

        Bien que la file d'attente de messages puisse prendre les mesures ci-dessus pour éviter autant que possible la perte de messages, dans certains cas extrêmes (tels qu'une panne matérielle, des problèmes de réseau, etc.), une perte de messages peut toujours se produire. Par conséquent, lors de la conception et de l'utilisation des files d'attente de messages, vous devez choisir une solution de file d'attente de messages appropriée en fonction des besoins de l'entreprise et des exigences de fiabilité, prendre en compte le risque de perte de messages dans la conception du système et prendre les contre-mesures correspondantes.

4. Comment la file d'attente de messages garantit-elle l'ordre des messages

  1. Consommateur unique : utilisez le mode consommateur unique, c'est-à-dire que chaque file d'attente n'a qu'un seul consommateur pour traiter les messages. Cela garantit que les messages sont consommés séquentiellement dans l'ordre dans lequel ils ont été envoyés, mais limite en même temps le débit du système.

  2. Partitionnement ordonné : la file d'attente de messages est divisée en plusieurs partitions, et chaque partition est consommée par un seul consommateur. Cela peut garantir l'ordre des messages dans chaque partition, mais l'ordre des messages entre différentes partitions ne peut pas être garanti.

  3. Mise en mémoire tampon et tri des consommateurs : les consommateurs peuvent gérer une mémoire tampon pour recevoir des messages, trier les messages dans la mémoire tampon et les traiter dans l'ordre. Cette méthode convient aux scénarios dans lesquels l'ordre d'arrivée des messages peut changer, mais nécessite la capacité et les performances des consommateurs pour traiter les messages.

  4. Identification du groupe de messages : ajoutez une identification de groupe au message, telle que le numéro de séquence ou l'identifiant unique du message, grâce auquel les consommateurs peuvent identifier et traiter l'ordre des messages. Les consommateurs peuvent trier et réassembler les messages après les avoir reçus en panne.

  5. Transactions distribuées : certains systèmes de file d'attente de messages prennent en charge le concept de transactions distribuées, qui peut garantir que les messages envoyés dans une transaction sont traités dans l'ordre dans lequel la transaction a été validée. Cette méthode convient aux scénarios qui nécessitent des garanties de commande strictes, mais les performances et la complexité des transactions distribuées doivent être prises en compte.

        Il convient de noter que même si les mesures ci-dessus sont prises, la séquence absolue des messages ne peut pas être entièrement garantie. Dans un environnement à forte simultanéité et distribué, des facteurs tels que le retard du réseau et l'équilibrage de charge peuvent entraîner l'arrivée de messages dans le désordre. Par conséquent, lors de la conception d'une application, il convient de peser la séquentialité et les performances du système en fonction des besoins et des scénarios spécifiques de l'entreprise, et de choisir une stratégie de traitement des messages appropriée.

5. Comment la file d'attente de messages atteint-elle l'idempotence

  1. Identifiant unique : attribuez un identifiant unique à chaque message et utilisez cet identifiant pour l'évaluation de la déduplication lors du traitement des messages. Vous pouvez utiliser un champ du contenu du message comme identifiant unique ou ajouter un champ d'identifiant distinct au message. Avant de traiter le message, le consommateur vérifie si l'identifiant existe déjà dans l'enregistrement de traitement et ignore le traitement s'il existe.

  2. Contrôle d'idempotence : avant le traitement du message, un contrôle d'idempotence est effectué sur le message traité. Vérifier si un message a déjà été traité peut être effectué en interrogeant une base de données, un cache ou un autre magasin. Si le message a déjà été traité, le consommateur peut renvoyer directement une réponse de réussite sans le traiter réellement.

  3. Traitement transactionnel : dans le processus de traitement des messages, des opérations transactionnelles sont utilisées pour assurer l'idempotence des messages. Placez l'opération de traitement du message dans une transaction et assurez l'idempotence du message via l'annulation et la validation de la transaction. Si le message a déjà été traité, l'annulation de la transaction n'a pas d'impact réel, et si le message n'a pas été traité, la validation de la transaction exécute l'opération de traitement proprement dite.

  4. Indicateur d'idempotence : ajoutez un champ d'indicateur d'idempotence au message pour identifier l'état de traitement du message. Lorsqu'un consommateur traite un message, il vérifie d'abord l'état du champ de balise, et si la balise indique que le message a été traité, le traitement est ignoré. Une fois le traitement terminé, mettez à jour le champ d'indicateur à l'état traité afin que les messages en double suivants puissent être traités correctement.

  5. Mécanisme de nouvelle tentative : si le traitement des messages échoue, la file d'attente de messages peut prendre en charge le mécanisme de nouvelle tentative de message automatique. Au cours du processus de nouvelle tentative, la file d'attente de messages renverra le même message au consommateur pour traitement. Les consommateurs doivent garantir l'idempotence des opérations de traitement, c'est-à-dire que le résultat du traitement du même message plusieurs fois est cohérent avec un seul traitement.

        Les méthodes ci-dessus peuvent être utilisées seules ou en combinaison, et le choix spécifique dépend des besoins de l'entreprise et de l'architecture du système. Lors de la conception et de la mise en œuvre de l'idempotence, il est nécessaire d'examiner et de tester soigneusement différents scénarios et conditions aux limites pour s'assurer que le traitement des messages de la file d'attente de messages est idempotent, et même s'il y a des messages en double, cela n'entraînera pas d'effets secondaires.

6. Comment traiter le problème d'arriéré de file d'attente de messages

  1. Augmenter le nombre de consommateurs : en augmentant le nombre de consommateurs, la vitesse de traitement des messages peut être améliorée et l'arriéré peut être réduit. Le nombre de consommateurs peut être ajusté dynamiquement en fonction de l'arriéré de la file d'attente de messages pour maintenir la stabilité et les performances du système.

  2. Améliorer la capacité de traitement des consommateurs : optimiser la logique et l'algorithme de traitement des consommateurs, et améliorer l'efficacité du traitement des messages. Le traitement simultané, le traitement par lots, le traitement asynchrone et d'autres moyens techniques peuvent être utilisés pour améliorer le débit des consommateurs.

  3. Contrôle du flux des consommateurs : contrôlez l'arriéré des files d'attente de messages en limitant la vitesse de traitement des consommateurs. Vous pouvez définir le nombre maximal de consommateurs simultanés, limiter la vitesse de traitement maximale de chaque consommateur ou utiliser l'algorithme de seau à jetons pour lisser la vitesse de traitement des consommateurs et éviter la surcharge de la file d'attente des messages.

  4. Augmenter la capacité de la file d'attente des messages : si la capacité de la file d'attente des messages ne peut pas répondre à la demande de traitement des messages pendant la période de pointe, vous pouvez envisager d'augmenter la capacité de la file d'attente des messages pour augmenter la capacité de stockage du message, réduisant ainsi l'arriéré.

  5. Définir l'heure d'expiration des messages : pour certains messages urgents, vous pouvez définir l'heure d'expiration des messages. Une fois le délai d'expiration atteint, le message peut être ignoré ou déplacé vers la file d'attente de lettres mortes pour éviter l'accumulation de messages expirés.

  6. Surveillance et alarme : établissez un système de surveillance approprié, surveillez l'arriéré des files d'attente de messages dans le temps et configurez les mécanismes d'alarme correspondants. Une fois qu'un arriéré de files d'attente de messages est trouvé, prenez des mesures en temps opportun pour le traiter et informez le personnel concerné.

  7. Nouvelle tentative de message et traitement différé : pour les messages qui ne parviennent pas à être traités, un mécanisme de nouvelle tentative de message peut être mis en œuvre. Si un message ne peut pas être traité avec succès dans un certain laps de temps, le message peut être retardé ou déplacé vers une file d'attente de nouvelle tentative pour éviter de bloquer toute la file d'attente des messages.

  8. Optimisation des performances du système : Outre l'optimisation de la file d'attente de messages elle-même, l'optimisation des performances de l'ensemble du système doit également être envisagée. Par exemple, optimisez l'accès à la base de données, réduisez la latence du réseau, améliorez les performances du matériel, etc., pour augmenter la puissance de traitement de l'ensemble du système.

7. Laissez-vous écrire une file d'attente de messages, comment concevoir l'architecture

La conception d'une architecture de file d'attente de messages doit prendre en compte de nombreux aspects, notamment la production et la consommation des messages, le stockage et la persistance des messages, la fiabilité et les performances de la livraison des messages, etc. Voici un aperçu de la conception architecturale de base d'une file d'attente de messages :

  1. Producteur de messages : le producteur de messages est chargé de générer des messages et de les envoyer à la file d'attente de messages. Les producteurs peuvent envoyer des messages via la bibliothèque cliente ou l'API fournie par la file d'attente de messages. Lors de la conception, vous devez réfléchir à la manière d'assurer la fiabilité et le haut débit des messages. Vous pouvez utiliser des moyens techniques tels que l'envoi asynchrone, l'envoi par lots de messages et la mise en mémoire tampon des messages pour améliorer les performances des producteurs.

  2. Files d'attente de messages : les files d'attente de messages sont les principaux composants de stockage et de distribution des messages. Il doit fournir des capacités de stockage et de récupération de messages hautes performances et prendre en charge le stockage persistant pour éviter la perte de messages. La file d'attente de messages doit également avoir la capacité de distribuer des messages pour s'assurer que les messages sont remis de manière fiable aux consommateurs. Les systèmes de file d'attente de messages courants incluent Kafka, RabbitMQ, ActiveMQ, etc.

  3. Consommateur de messages : le consommateur de messages obtient les messages de la file d'attente de messages et les traite. Les consommateurs peuvent recevoir des messages en s'abonnant aux rubriques ou aux files d'attente qui les intéressent. Lors de la conception, vous devez déterminer comment gérer la consommation simultanée de messages et garantir l'ordre des messages. Plusieurs consommateurs peuvent être utilisés pour un traitement parallèle et un mécanisme de garantie de commande pour la consommation de messages peut être défini en fonction des besoins.

  4. Stockage et persistance des messages : les files d'attente de messages doivent fournir des mécanismes fiables de stockage et de persistance des messages pour garantir que les messages peuvent être récupérés même lorsque le système tombe en panne ou redémarre. Les messages peuvent être conservés à l'aide d'un stockage de journaux, d'un stockage de base de données ou d'un stockage de fichiers.

  5. Fiabilité et gestion des pannes : lors de la conception, vous devez réfléchir à la manière de gérer la livraison fiable des messages et la récupération des pannes. La fiabilité du système peut être améliorée en utilisant un mécanisme de confirmation de message, un mécanisme de nouvelle tentative, un mécanisme de basculement et de redondance, etc. Il est également nécessaire de mettre en place des systèmes de surveillance et d'alarme pour détecter et traiter les conditions de défaut potentielles en temps opportun.

  6. Évolutivité et hautes performances : les files d'attente de messages doivent avoir une bonne évolutivité et des performances élevées. Les nœuds et les partitions de la file d'attente de messages peuvent être augmentés par expansion horizontale pour améliorer la capacité de traitement des messages. Dans le même temps, il est nécessaire de déterminer comment optimiser les performances de la file d'attente de messages, par exemple en utilisant des moyens techniques tels que l'indexation des messages, la compression des messages et le traitement par lots.

  7. Sécurité et contrôle des autorisations : afin de protéger la sécurité des messages, la file d'attente de messages doit fournir des mécanismes d'authentification et de contrôle des autorisations. Des listes de contrôle d'accès (ACL) ou une authentification par jeton peuvent être utilisées pour garantir que seuls les utilisateurs autorisés peuvent envoyer et recevoir des messages.

  8. Surveillance et gestion : la file d'attente de messages doit fournir des fonctions de surveillance et de gestion pour la surveillance et la gestion en temps réel du système. Des métriques et des journaux clés peuvent être collectés pour l'analyse des performances et le dépannage. Dans le même temps, il devrait également fournir une interface de gestion ou un outil de ligne de commande pour configurer et gérer divers paramètres de la file d'attente de messages.

        Ce qui précède est un aperçu d'une conception d'architecture de file d'attente de messages de base. La conception réelle doit également être affinée et optimisée en fonction des besoins spécifiques de l'entreprise, de l'échelle du système et des exigences de performances.

 Bienvenue à visiter: http://mumuxi.chat/

おすすめ

転載: blog.csdn.net/zz18532164242/article/details/130836284