(1) Introduction à la complexité des affaires
Allons droit au but Supposons que 500 000 personnes soient en ligne dans une salle de diffusion en direct en même temps, et là. Il y a 1 000 barrages par seconde, alors le système de barrage La fréquence de poussée est : 500W * 1000条/秒=50亿条/秒
Pensez à quel point le système de barrage de la fête du Nouvel An 2019 de la Station B était génial. De plus, un grand site Web ne peut pas avoir une seule salle de diffusion en direct !
Utiliser Go pour le développement WebSocket n'est rien de plus que trois situations :
golang.org/x/net
, mais ceci la bibliothèque officielle est vraiment pleine de bugs gorilla/websocket
, elle peut être combinée avec certains frameworks de développement web, comme Gin, iris, etc., à condition que le framework utilisé soit basé sur golang.org/net
, Ensuite, cette bibliothèque peut être combinée avec ce frameworkRecommandations d'apprentissage associées : Tutoriel de langage Go
Selon les résultats de l'estimation, lorsque la quantité de poussée de barrage est importante, le noyau Linux aura un goulot d'étranglement, car la fréquence maximale d'envoi de paquets lorsque le noyau Linux envoie des paquets TCP est de 100 W. Par conséquent, les messages de barrage au cours de la même seconde peuvent être fusionnés en une seule poussée, réduisant ainsi la transmission de petits paquets de données sur le réseau, réduisant ainsi la fréquence de poussée.
Le système de barrage doit maintenir des connexions à long terme pour les utilisateurs en ligne afin d'obtenir une diffusion ciblée vers les utilisateurs en ligne. Il utilise généralement une structure de dictionnaire de hachage, et les messages push traversent généralement le dictionnaire de hachage utilisé en ligne. Pendant la période de poussée du barrage, les utilisateurs sont constamment en ligne et hors ligne. Afin de maintenir les utilisateurs en ligne, le dictionnaire de hachage doit être constamment modifié et les opérations de verrouillage doivent être effectuées en continu. Un volume d'utilisateurs excessif entraîne des goulots d'étranglement de verrouillage. Par conséquent, la structure de hachage entière peut être divisée en plusieurs structures de hachage, ajouter différents verrous aux multiples structures de hachage et utiliser des verrous en lecture-écriture au lieu de verrous mutex.
Habituellement, le serveur interagit avec le client en utilisant une structure JSON, ce qui nécessite un encodage et un décodage constants des données JSON, ce qui provoquera un goulot d'étranglement du processeur. Les messages sont d'abord fusionnés, puis codés, et enfin la structure de hachage est interrogée pour le push.
Les problèmes ci-dessus concernent une architecture unique. Afin de prendre en charge davantage de charges d'utilisateurs, le système de barrage adopte généralement une architecture distribuée pour l'expansion et la contraction élastiques.
(2) Pousser ou tirer ?
Si le client extrait les données côté serveur, il y aura les problèmes suivants :
Par conséquent, nous considérons le mode push : lorsque les données sont mises à jour, le serveur les pousse activement au client, ce qui peut réduire efficacement le nombre de demandes des clients. Si le message push doit être implémenté, cela signifie que le serveur maintient un grand nombre de connexions longues.
(3) Pourquoi utiliser WebSocket ?
Pour réaliser des mises à jour en temps réel des messages de barrage, Socket doit être utilisé, alors pourquoi utiliser WebSocket ? De nos jours, la plupart des développements d'applications de diffusion en direct sont multiplateformes. Cependant, l'essence du cadre de développement multiplateforme est le développement Web, il doit donc être indissociable de WebSocket, et certains utilisateurs choisiront de regarder des vidéos sur le Web, comme Bilibili. De nos jours, certaines applications de bureau sont également développées à l'aide de frameworks multiplateformes tels qu'Electron, tels que Lark et Feishu, donc la meilleure façon d'implémenter le push de messages est d'utiliser WebSocket.
En utilisant WebSocket, vous pouvez facilement maintenir une longue connexion côté serveur. Deuxièmement, WebSocket est construit sur le protocole HTTP et peut également utiliser HTTPS. Par conséquent, WebSocket est une transmission fiable et ne nécessite pas de paiement pour les développeurs. attention aux détails sous-jacents.
Pourquoi utiliser Go pour WebSocket ? Tout d'abord, lorsque vous parlez de WebSocket, vous pensez peut-être à Node.js, mais Node.js est un modèle monothread. Si vous souhaitez obtenir une concurrence élevée, vous devez créer plusieurs processus Node.js, mais ce n'est pas le cas. il est facile pour le serveur de parcourir l'ensemble de la collection de connexions ; si vous utilisez Java, cela semble fastidieux. Le déploiement de projets Java et l'écriture de fichiers Docker ne sont pas aussi concis que le binaire cible de Go, et les coroutines Go peuvent facilement atteindre une concurrence élevée, comme mentionné dans le précédent. chapitre, le langage Go dispose actuellement également d'une roue WebSocket mature.
(4) Démo de base du serveur
Construisez d'abord un framework :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Ensuite, améliorez la fonction messageHandler :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
Maintenant, implémentez essentiellement la fonction WebSocket , mais l'API native de websocket n'est pas thread-safe (la méthode Close est thread-safe et réentrante), et les autres modules ne peuvent pas réutiliser la logique métier, elle est donc encapsulée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
|
Jusqu'à présent, vous avez appris à utiliser Go pour créer un service WebSocket .
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!