Maison  >  Article  >  Java  >  Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

Java学习指南
Java学习指南avant
2023-07-26 16:07:261040parcourir

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

La haute concurrence est une expérience que presque tous les programmeurs souhaitent vivre. La raison est simple : à mesure que le trafic augmente, divers problèmes techniques seront rencontrés, tels qu'un délai de réponse de l'interface, une charge CPU accrue, des GC fréquents, des blocages, un stockage de données volumineux, etc. Ces problèmes peuvent nous pousser à nous améliorer continuellement notre profondeur technique.

Lors des entretiens précédents, si le candidat a travaillé sur un projet à haute concurrence, je demande généralement au candidat de parler de sa compréhension de la haute concurrence, mais peu de gens peuvent répondre systématiquement à cette question, probablement divisé en catégories suivantes :

1. Aucun concept d'indicateurs basés sur des données : Vous ne savez pas quel type d'indicateurs choisir pour mesurer les systèmes à haute concurrence ? Je ne peux pas faire la différence entre la simultanéité et le QPS, et je ne connais même pas le nombre total d'utilisateurs de mon système, le nombre d'utilisateurs actifs, le QPS et le TPS pendant les heures fixes et de pointe, ainsi que d'autres données clés.

2. Certains plans ont été conçus, mais les détails ne sont pas entièrement compris : Je ne peux pas vous indiquer les points techniques auxquels il faut prêter attention et les effets secondaires possibles du plan. Par exemple, s'il existe un goulot d'étranglement dans les performances de lecture, la mise en cache sera introduite, mais les problèmes tels que le taux d'accès au cache, les raccourcis clavier et la cohérence des données sont ignorés.

3. Compréhension unilatérale, assimilant la conception à haute concurrence à l'optimisation des performances : parle de programmation simultanée, de mise en cache multi-niveaux, d'asynchronisation et d'expansion horizontale, mais ignore la conception à haute disponibilité, la gouvernance des services, le fonctionnement et garanties d'entretien.

4. Maîtrisez le grand plan, mais ignorez les choses les plus élémentaires : Peut expliquer clairement les grandes idées telles que la superposition verticale, le partitionnement horizontal, la mise en cache, mais n'a aucune conscience pour analyser si la structure des données est raisonnable et l'algorithme, qu'il soit efficace ou non, je n'ai jamais pensé à optimiser les détails des deux dimensions les plus fondamentales des E/S et de l'informatique.

Dans cet article, je souhaite combiner mon expérience dans des projets à haute concurrence pour résumer systématiquement les connaissances et les idées pratiques qui doivent être maîtrisées en haute concurrence. J'espère que cela vous sera utile. Le contenu est divisé en 3 parties suivantes :

  • Comment comprendre la haute simultanéité ?
  • Quel est l'objectif de la conception de systèmes à haute concurrence ?
  • Quelles sont les solutions pratiques pour une simultanéité élevée ?

01 Comment comprendre la haute simultanéité ?

Une concurrence élevée signifie un trafic important, et des moyens techniques doivent être utilisés pour résister à l'impact du trafic. Ces moyens sont comme l'exploitation du trafic, permettant au trafic d'être traité plus facilement par le système et offrant aux utilisateurs une meilleure expérience.

Nos scénarios courants à haute concurrence incluent : le Double 11 de Taobao, la récupération de billets pendant la Fête du Printemps, les nouvelles brûlantes de Weibo Vs, etc. En plus de ces éléments typiques, les systèmes de vente flash avec des centaines de milliers de demandes par seconde, les systèmes de commande avec des dizaines de millions de commandes par jour, les systèmes de flux d'informations avec des centaines de millions d'actifs quotidiens par jour, etc., peuvent tous être classés. comme une concurrence élevée.

Évidemment, pour les scénarios de simultanéité élevée mentionnés ci-dessus, le degré de simultanéité varie Alors, quel degré de simultanéité est considéré comme une simultanéité élevée ?

1. Vous ne pouvez pas vous contenter de regarder des chiffres, vous devez examiner des scénarios commerciaux spécifiques. On ne peut pas dire que la vente flash de 10 W QPS est une simultanéité élevée, mais le flux d'informations de 1 W QPS n'est pas une simultanéité élevée. Le scénario de flux d'informations implique des modèles de recommandation complexes et diverses stratégies manuelles, et sa logique métier peut être plus de 10 fois plus complexe que le scénario de vente flash. Ils ne sont donc pas dans la même dimension et n’ont aucune signification comparative.

2. Les affaires se construisent de 0 à 1. La concurrence et le QPS ne sont que des indicateurs de référence. La chose la plus importante est la suivante : lorsque le volume d'affaires devient progressivement 10 ou 100 fois, utilisez-vous une concurrence élevée. méthodes de traitement, comment faire évoluer votre système et prévenir et résoudre les problèmes causés par une concurrence élevée depuis les dimensions de la conception de l'architecture, de la mise en œuvre du codage et même des solutions de produits ? Au lieu de mettre à niveau aveuglément le matériel et d’ajouter des machines pour une expansion horizontale.

De plus, les caractéristiques commerciales de chaque scénario à forte concurrence sont complètement différentes : il existe des scénarios de flux d'informations avec plus de lecture et moins d'écriture, et il existe des scénarios de transaction avec plus de lecture et d'écriture Y a-t-il. une solution technique universelle pour résoudre différents scénarios ? Qu'en est-il du problème de la haute concurrence ?

Je pense que nous pouvons apprendre des grandes idées et des projets des autres, mais dans le processus de mise en œuvre réel, il y aura d'innombrables pièges dans les détails. De plus, étant donné que l'environnement logiciel et matériel, la pile technologique et la logique du produit ne peuvent pas être complètement cohérents, ceux-ci conduiront au même scénario commercial. Même si la même solution technique est utilisée, des problèmes différents seront rencontrés et ces pièges doivent être évités. être surmontés un à un.

Par conséquent, dans cet article, je me concentrerai sur les connaissances de base, les idées générales et les expériences efficaces que j'ai pratiquées, dans l'espoir de vous donner une compréhension plus profonde de la haute simultanéité.

02 Quel est l'objectif de la conception de systèmes à haute concurrence ?

Clarifiez d'abord les objectifs de la conception de systèmes à haute concurrence, puis discutez du plan de conception et de l'expérience pratique pour qu'ils soient significatifs et ciblés.

2.1 Macro-objectif

Une concurrence élevée ne signifie pas seulement rechercher des performances élevées, qui est une compréhension unilatérale de nombreuses personnes. D'un point de vue macro, la conception de systèmes à haute concurrence vise trois objectifs : hauteperformance, haute disponibilité et haute évolutivité.

1. Hautes performances : Les performances reflètent la capacité de traitement parallèle du système avec un investissement matériel limité, améliorer les performances signifie économiser des coûts. Dans le même temps, les performances reflètent également l'expérience utilisateur. Les temps de réponse sont respectivement de 100 millisecondes et 1 seconde, ce qui donne aux utilisateurs des sentiments complètement différents.

2. Haute disponibilité  : indique l'heure à laquelle le système peut fonctionner normalement. L'un n'a pas de temps d'arrêt ni de pannes toute l'année ; l'autre a des accidents et des temps d'arrêt en ligne de temps en temps. Les utilisateurs choisiront certainement le premier. De plus, si le système ne peut être disponible qu’à 90 %, cela entravera grandement l’activité.

3. Expansion élevée  : indique l'évolutivité du système , si l'expansion peut être achevée en peu de temps pendant les heures de pointe et peut gérer plus facilement le trafic de pointe, comme les événements Double 11. , divorces de célébrités et autres événements chauds .

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

Ces trois objectifs doivent être considérés de manière globale, car ils sont interdépendants et s'influencent même mutuellement.

que comme  : Considérez l'évolutivité du système , vous concevrez le service pour qu'il soit apatride , Ce genre de cluster Le designdesign garantit une grande évolutivité et, en fait, améliore également les performances et la convivialité du système.

Autre exemple : afin de garantir la disponibilité, des paramètres de délai d'attente sont généralement définis pour les interfaces de service afin d'empêcher un grand nombre de threads de bloquer des requêtes lentes et de provoquer une avalanche du système. Alors, qu'est-ce qu'un paramètre de délai d'attente raisonnable ? Généralement, nous effectuerons des réglages en fonction des performances des services dépendants.

2.2 Micro-objectifs

D'un point de vue micro, quels sont les indicateurs spécifiques pour mesurer la haute performance, la haute disponibilité et la haute évolutivité ? Pourquoi ces indicateurs ont-ils été choisis ?

❇ Indicateurs de performance

Les indicateurs de performance peuvent être utilisés pour mesurer les problèmes de performance actuels et servir de base d'évaluation pour l'optimisation des performances. D'une manière générale, le temps de réponse de l'interface sur une période donnée est utilisé comme indicateur.

1. Temps de réponse moyen : Le plus couramment utilisé, mais ses défauts sont évidents et il n'est pas sensible aux requêtes lentes. Par exemple, il y a 10 000 requêtes, dont 9 900 durent 1 ms et 100 durent 100 ms. Le temps de réponse moyen est de 1,99 ms. Bien que le temps de réponse moyen n'ait augmenté que de 0,99 ms, le temps de réponse pour 1 % des requêtes a augmenté de 100 ms. fois.

2, TP90, TP99 et autres valeurs quantiles : Triez le temps de réponse de petit à grand. TP90 représente le temps de réponse classé dans le 90ème centile. Plus la valeur du quantile est grande, plus elle est sensible. demandes lentes.

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

3. Débit : Il est inversement proportionnel au temps de réponse. Par exemple, le temps de réponse est de 1 ms, alors le débit est de 1000 fois par seconde.

Habituellement, lors de la définition des objectifs de performances, le débit et le temps de réponse seront pris en compte. Par exemple, en dessous de 10 000 requêtes par seconde, AVG est contrôlé en dessous de 50 ms et TP99 est contrôlé en dessous de 100 ms. Pour les systèmes à haute concurrence, les valeurs des quantiles AVG et TP doivent être prises en compte en même temps.

De plus, du point de vue de l'expérience utilisateur, 200 millisecondes sont considérées comme le premier point de division, et les utilisateurs ne ressentiront pas le retard, 1 seconde est le deuxième point de division, et les utilisateurs ressentiront le retard, mais c'est acceptable. .

Par conséquent, pour un système sain à haute concurrence, TP99 doit être contrôlé en 200 millisecondes et TP999 ou TP9999 doit être contrôlé en 1 seconde.

❇ DisponibilitéIndicateur

La haute disponibilité signifie que le système a une grande capacité à fonctionner sans pannes. Plusieurs 9 sont généralement utilisés pour décrire le système. . disponibilité.

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

Pour un système à haute concurrence, l'exigence la plus fondamentale est : garantir 3 9 ou 4 9. La raison est simple. Si vous ne pouvez atteindre que deux neuf, cela signifie qu'il y a un temps d'échec de 1 %. Par exemple, certaines grandes entreprises ont souvent plus de 100 milliards de GMV ou de chiffre d'affaires chaque année. niveau milliard.

❇ ÉvolutivitéIndicateur

Face à un trafic soudain, il est impossible de transformer temporairement l'architecture. Le moyen le plus rapide est d'ajouter des machines pour améliorer linéairement les capacités de traitement du système.

Pour les clusters métiers ou les composants de base, scalabilité = ratio d'amélioration des performances / ratio d'ajout de machines. La scalabilité idéale est : augmenter plusieurs fois les ressources et améliorer les performances plusieurs fois. D'une manière générale, la capacité d'expansion doit être maintenue au-dessus de 70 %.

Mais du point de vue de l'architecture globale d'un système à haute concurrence, l'objectif de expansion n'est pas seulement de concevoir le service pour qu'il soit apatride, car lorsque le trafic augmente de 10 fois, le le service aux entreprises peut rapidement être multiplié par 10, mais la base de données peut devenir un nouveau goulot d'étranglement.

Les services de stockage avec état comme MySQL sont généralement techniquement difficiles à étendre si l'architecture n'est pas planifiée à l'avance (séparation verticale et horizontale), cela impliquera la migration d'une grande quantité de données.

Par conséquent, une grande évolutivité doit être prise en compte : clusters de services, middleware tels que bases de données, caches et files d'attente de messages, équilibrage de charge, bande passante, tiers dépendants, etc. Lorsque la concurrence atteint un certain niveau, chacun des facteurs ci-dessus Peut devenir un goulot d’étranglement pour l’expansion.


03 Quelles sont les solutions pratiques pour une concurrence élevée ?
Après avoir compris les trois objectifs majeurs de la conception à haute concurrence, nous résumerons systématiquement le plan de conception à haute concurrence, qui sera développé à partir des deux parties suivantes : d'abord, nous résumerons les méthodes de conception générales, puis nous nous concentrerons sur les méthodes de conception à haute concurrence. performances, haute disponibilité, haute expansion donnent respectivement des solutions pratiques spécifiques.
3.1 Méthode de conception universelle
La méthode de conception universelle part principalement des deux dimensions vertical et horizontale, communément appelé haute simultanéité transformation Deux défis majeurs : l'expansion verticale et l'expansion horizontale.

❇Expansion verticale (scale-up)

Son objectif est d'améliorer la puissance de traitement d'une seule machine, Le plan comprend également :

1. Améliorez les performances matérielles d'une seule machine : en augmentant la mémoire, les cœurs de processeur, la capacité de stockage ou en mettant à niveau le disque vers un SSD et d'autres matériels dans le carré styleViens pour t'améliorer.
2. Améliorez les performances logicielles d'une seule machine : utilisez le cache pour réduire le nombre d'E/S et utilisez des méthodes simultanées ou asynchrones pour augmenter le débit.

❇ Expansion horizontale (scale-out)

Parce qu'il y a toujours des limites aux performances d'une seule machine, il est finalement nécessaire d'introduire une expansion horizontale et d'améliorer encore les capacités de traitement simultané grâce au déploiement de clusters, y compris les éléments suivants Deux directions:

1. Développer une architecture hiérarchique : C'est une avancée vers l'expansion horizontale, car les systèmes à haute concurrence ont souvent des activités complexes et le traitement en couches peut simplifier les problèmes complexes et faciliter l'expansion horizontale.

Intervieweur : Que savez-vous de la haute simultanéité ? Moi : euh...

L'image ci-dessus est l'architecture en couches la plus courante d'Internet. Bien entendu, la véritable architecture du système à haute concurrence sera encore améliorée sur cette base. Par exemple, une séparation dynamique et statique sera effectuée et le CDN sera introduit. La couche proxy inverse peut être LVS+Nginx, la couche Web peut être une passerelle API unifiée, la couche de services métier peut être davantage micro-serviceée en fonction de l'activité verticale. , et la couche de stockage peut être constituée de diverses bases de données hétérogènes.

2. Expansion horizontale de chaque couche : expansion horizontale sans état, routage de fragments avec état. Les clusters d'entreprise peuvent généralement être conçus pour être sans état, tandis que les bases de données et les caches sont souvent avec état. Par conséquent, les clés de partition doivent être conçues pour le partitionnement du stockage. Bien entendu, les performances de lecture peuvent également être améliorées grâce à la synchronisation maître-esclave et à la séparation lecture-écriture.

3.2 Solutions pratiques spécifiques
Combinée à mon expérience personnelle, je résumerai les solutions pratiques qui peuvent être mises en œuvre dans les trois aspects de haute performance, haute disponibilité et haute évolutivité.

❇ Solution pratique et performante

1, Déploiement de cluster, réduisant la pression sur une seule machine grâce à l'équilibrage de charge.

2. Mise en cache à plusieurs niveaux, y compris l'utilisation de CDN, de mise en cache locale, de mise en cache distribuée, etc. pour les données statiques, ainsi que le traitement des touches de raccourci, la pénétration du cache, la simultanéité du cache, la cohérence des données et d'autres problèmes dans les scénarios de mise en cache. .
3. Optimisation des sous-bases de données, des tables et des index, et utilisation des moteurs de recherche pour résoudre des problèmes de requêtes complexes.
4. Envisagez d'utiliser des bases de données NoSQL, telles que HBase, TiDB, etc., mais l'équipe doit être familiarisée avec ces composants et disposer de solides capacités d'exploitation et de maintenance.
5. Asynchrone, traitez les processus secondaires de manière asynchrone via le multi-threading, MQ et même des tâches retardées.
6. Limitation de courant Vous devez d'abord déterminer si l'entreprise autorise la limitation de flux (par exemple, les scénarios de vente flash sont autorisés), y compris la limitation de flux frontale. limitation du débit de couche, limitation de courant côté serveur.
7. Effectuez un écrêtement des pointes et un remplissage des vallées sur le trafic et gérez le trafic à travers MQ.
8. Traitement simultané, parallélisation de la logique série via le multi-threading.
9. Pré-calcul, tel que Scène de saisie d'enveloppe rouge, vous pouvez calculer le montant de l'enveloppe rouge à l'avance et le mettre en cache, et l'utiliser directement lors de l'envoi d'enveloppes rouges.
10, préchauffage du cache, via des tâches asynchrones préchauffer les données dans un cache local ou un cache distribué à l'avance .
11. Réduisez le nombre d'E/S, telles que la base de données et le cache lecture et écriture par lots, la prise en charge de l'interface par lots RPC ou éliminez les appels RPC via des données redondantes.
12. Réduisez la taille des paquets de données pendant les E/S, notamment en utilisant des protocoles de communication légers, des structures de données appropriées, en supprimant les champs redondants dans les interfaces, en réduisant la taille des clés de cache, en compressant les valeurs du cache, etc.
13. Optimisation de la logique du programme, telle qu'une logique de jugement de pré-positionnement qui a une forte probabilité de bloquer le processus d'exécution, l'optimisation de la logique de calcul des boucles For ou l'utilisation d'algorithmes plus efficaces.
14. Utilisation de diverses technologies de pooling et paramètres de taille de pool, y compris le pool de requêtes HTTP, le pool de threads (tenez compte de la consommation intensive de CPU ou d'E/S pour définir les paramètres de base), la base de données et le pool de connexions Redis, etc.
15. Optimisation de la JVM, y compris la taille de la nouvelle génération et de l'ancienne génération, la sélection de l'algorithme GC, etc., pour réduire autant que possible la fréquence et la durée du GC.
16. Sélectionnez le verrouillage, utilisez le verrouillage optimiste dans les scénarios où il y a plus de lecture et moins d'écriture, ou envisagez de réduire les conflits de verrouillage grâce au verrouillage segmenté.

La solution ci-dessus n'est rien de plus que de considérer tous les points d'optimisation possibles dans les deux dimensions de l'informatique et des E/S. Elle nécessite un système de surveillance de support pour comprendre les performances actuelles en temps réel et vous aider à effectuer une analyse des goulots d'étranglement des performances, et puis suivez 28 principes, saisissez les principales contradictions et optimisez-les.

❇ Solutions pratiques à haute disponibilité

1. Basculement des nœuds homologues Nginx et le cadre de gouvernance des services prennent en charge l'accès à un autre nœud après la panne d'un nœud.

2. Basculement de nœuds non homologues, via la détection des battements de cœur et la mise en œuvre de la commutation maître-esclave (comme le mode sentinelle ou le mode cluster de Redis, la commutation maître-esclave de MySQL, etc.).
3. Paramétrage du délai d'attente, stratégie de nouvelle tentative et conception idempotente au niveau de l'interface.
4. Traitement de déclassement : assurer les services de base, sacrifier les services non essentiels, coupure de circuit si nécessaire ou lorsqu'il y a un problème avec le lien principal, il existe un lien alternatif.
5. Traitement de limitation de courant : rejetez ou renvoyez directement les codes d'erreur pour les demandes qui dépassent la capacité de traitement du système.
6. Garantie de fiabilité des messages dans les scénarios MQ, y compris le mécanisme de nouvelle tentative du côté du producteur, la persistance du côté du courtier, le mécanisme d'accusé de réception du côté du consommateur, etc.
7. La version en niveaux de gris peut prendre en charge le déploiement d'un petit trafic en fonction de la dimension de la machine, observer les journaux système et les indicateurs commerciaux, puis augmenter le volume complet une fois l'opération stable.
8. Surveillance et alarme : un système de surveillance complet, comprenant la surveillance la plus élémentaire du processeur, de la mémoire, du disque et du réseau, ainsi que la surveillance des serveurs Web, de la JVM, des bases de données, de divers middlewares et la surveillance des indicateurs commerciaux. .
9. Exercice de reprise après sinistre : Semblable à « l'ingénierie du chaos » actuelle, utilisez des méthodes destructrices sur le système pour observer si des pannes locales entraîneront des problèmes de disponibilité.

Les solutions à haute disponibilité sont principalement envisagées sous trois angles : la redondance, les compromis, ainsi que l'exploitation et la maintenance du système. En même temps, elles doivent disposer de mécanismes de support et de processus de gestion des pannes lorsque des problèmes en ligne surviennent. peut être suivi dans le temps.

❇ Solution pratique hautement évolutive

1. Architecture en couches raisonnable : par exemple, l'architecture en couches la plus courante d'Internet mentionnée ci-dessus, en outre, elle peut être adaptée en fonction de la couche d'accès aux données et Couche de logique métier Les microservices sont superposés de manière plus fine (mais les performances doivent être évaluées, car il peut y avoir un saut supplémentaire sur le réseau).

2. Fractionnement de la couche de stockage : fractionnement vertical selon les dimensions de l'entreprise, et fractionnement horizontal supplémentaire selon les dimensions des caractéristiques des données (sous-base de données et sous-table).
3. Diviser la couche métier : la méthode la plus courante consiste à la diviser en fonction des dimensions commerciales (telles que les services de base, les services de commande, etc. dans les scénarios de commerce électronique). interfaces et interfaces non principales, et il peut également être divisé en fonction de la suppression de la source de la demande (telle que To C et To B, APP et H5).


Derniers mots

La concurrence élevée est en effet un problème complexe et systémique. En raison de l'espace limité, des points techniques tels que la trace distribuée, les tests de résistance de lien complet et les transactions flexibles doivent être pris en compte. De plus, si les scénarios commerciaux sont différents, les solutions de mise en œuvre à haute concurrence seront également différentes, mais les idées de conception globales et les solutions pouvant être utilisées à titre de référence sont fondamentalement similaires.

La conception à haute concurrence doit également adhérer aux trois principes de la conception architecturale : Simplicité, pertinence et évolution. "L'optimisation prématurée est la racine de tous les maux", ne peut être dissociée de la situation réelle de l'entreprise, et ne surconcevez pas , La solution appropriée est la plus parfaite.

J'espère que cet article pourra vous donner une compréhension plus complète de la haute concurrence. Si vous avez également une expérience et une réflexion approfondie dont vous pouvez tirer des leçons, veuillez laisser un message dans la zone de commentaires pour en discuter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer