Lors d'un entretien avec Ali, on m'a demandé comment concevoir un système de pointes

Architecture d'activité Spike

L'activité de pointe est une activité courante dans les projets de commerce électronique. Par exemple, des billets de concert sont achetés et Jingdong Taobao se précipite pour acheter des marchandises. Au moment de l'achat panique, un grand nombre d'utilisateurs demanderont simultanément le système d'application avec une forte concurrence, qui peut atteindre des dizaines de milliers ou des centaines de milliers de requêtes par seconde. Si le système ne peut pas gérer une demande aussi élevée, il plantera et rendra le système inutilisable.

Pour l'activité de pointe, il est nécessaire que le système ne semble pas être surchargé et effondré, et qu'il n'y ait pas de situation de survente ou de sous-vente.

Donc, dans le système de pointe, nous devons penser à:

"
  • Comment le système gère-t-il les demandes simultanées élevées

  • Comment le système garantit-il qu'il n'est pas survendu et d'autres problèmes

"

Ma solution à cela est:

"
  • Côté serveur, utilisez le cache pour réduire l'accès à la base de données

  • Bloquer le trafic de demande en amont, vous pouvez utiliser la technologie de limitation actuelle

  • Utilisez des files d'attente distribuées pour maximiser le trafic et sérialiser la concurrence

"

Diagramme d'architecture de pointe

Le diagramme d'architecture de pointe est comme ci-dessus.

Client

Port sur lequel l'utilisateur lance la demande. À l'heure actuelle, les principaux clients de l'activité de pointe du projet de commerce électronique incluent l'applet WeChat, H5 (navigateur) et diverses applications de plate-forme (telles qu'Android, iOS, Windows). Nous pouvons implémenter un mécanisme de limitation de courant côté client, afin que les utilisateurs puissent éviter d'envoyer un grand nombre de requêtes côté serveur.

La limite actuelle du client peut contrôler la fréquence de clic du bouton, comme le grisonnement du bouton.

Proxy inverse

Nous pouvons utiliser Nginx pour implémenter le shunt des requêtes et répartir uniformément les requêtes vers différents nœuds Web via l'équilibrage de charge.

Nginx peut également être utilisé comme limiteur de courant. Nginx peut contrôler le nombre de demandes par unité de temps et limiter le nombre de connexions en même temps.

Passerelle API

Si le nombre réel d'utilisateurs participant à l'activité de pointe est très important, les demandes simultanées sont très importantes. Nous devons limiter le flux dans la couche de passerelle API, où le nombre maximum de requêtes par seconde peut être limité à un seul nœud Web.

Nous pouvons également contrôler le nombre maximum de requêtes par utilisateur, et enregistrer le nombre de requêtes par utilisateur via Redis.

Cache

Dans le domaine de la couche de service, afin de réduire l'accès à la base de données, une conception de cache est nécessaire.Nous pouvons utiliser un cache local ou un cache distribué.

queue

Les files d'attente sont principalement utilisées pour réduire les pics de trafic et remplir les vallées du trafic.Nous pouvons utiliser des middlewares de messages tels que RocketMQ et Kafka comme files d'attente distribuées.

À propos de la limitation de courant

Pourquoi une limitation de courant est-elle nécessaire dans le système de pointe? Dans l'activité de pointe, l'inventaire des biens est limité et le nombre d'utilisateurs demandé est bien supérieur à l'inventaire des biens. La plupart des demandes des utilisateurs sont en fait incapables de récupérer le trafic invalide du produit. Par conséquent, cette partie du trafic peut être interceptée et limitée en amont.

Afin d'empêcher les utilisateurs d'utiliser des scripts ou de cliquer fréquemment pour envoyer un grand nombre de requêtes, empêchant les autres utilisateurs de participer normalement aux activités, nous devons également contrôler le nombre de requêtes par seconde des utilisateurs.

Nous pouvons implémenter la limitation de courant des aspects URI et utilisateur.

Exemple de code de limitation de courant URI:

Exemple de code pour la limitation de courant dans la dimension utilisateur:


Nous obtenons l'objet limiteur de courant dans la dimension URI et l'objet limiteur de courant uriLimiterdans la dimension utilisateur userLimiter. Si l' tryAcquire()autorisation est obtenue avec succès, la demande est transmise et l'entreprise de suivi est entrée. Sinon, une exception sera signalée directement et l'interface frontale fera des invites conviviales correspondantes.

Déduire l'inventaire dans le cache

Utilisez Redis pour stocker la quantité d'inventaire. Lorsqu'un utilisateur lance une demande urgente, déterminez d'abord si l'inventaire dans Redis est disponible. Si disponible, placez la demande urgente dans la file d'attente distribuée, traitez les opérations suivantes de manière asynchrone et terminez la commande. Dans le même temps, effectuez une déduction d'inventaire dans Redis.

L'exemple de code est le suivant:

Effectuez d'abord la déduction de stock et obtenez la quantité de stock déduite. Si la quantité de stock est supérieure ou égale à 0, envoyez la demande de création de commande à mq. Sinon, il renverra le message indiquant que l'achat a échoué.

Le consommateur crée une commande:

Comment initialiser l'inventaire?

Avant le début de l'activité d'achat panique, certains opérateurs synchronisent manuellement l'inventaire des produits de la base de données vers le cache en arrière-plan. La déduction d'inventaire est déduite dans le cache.

La fonctionnalité monothread de Redis peut être utilisée pour obtenir des mises à jour d'inventaire sécurisées sous plusieurs threads. Si la valeur dans le cache n'est pas trouvée lors de l'interrogation de la valeur, elle doit être interrogée à partir de la base de données, puis synchronisée avec le cache. Ce processus doit être verrouillé.

L'exemple de code est le suivant:

Pour résumer

La conception du pic est un système typique à haute concurrence. La conception du système de pointe est souvent posée lors des entretiens. Lors de la conception du système de pointe, nous devons prendre en compte:

"
  • Demander un équilibrage de charge de shuntage

  • Algorithme d'entonnoir utilisant la limite actuelle (comme la goyave RateLimiter), sémaphore Semaphore, comptage Redis, etc.

  • Redis déduit l'inventaire - réduit l'accès à la base de données

  • Implémentation de file d'attente distribuée de réduction de pointe

"

D'accord, c'est la fin de cet article, j'espère que cet article vous sera utile.

Recommandé dans le passé

Scannez le code QR pour devenir plus excitant. Ou recherchez Lvshen_9 sur WeChat , vous pouvez répondre pour obtenir des informations

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Autre: cliquez sur [ Mes avantages ] pour avoir plus de surprises.

Je suppose que tu aimes

Origine blog.csdn.net/wujialv/article/details/109065099
conseillé
Classement