Résumé : Le côté serveur du module réseau Kafka, présente le processus de démarrage, de réception et de traitement des requêtes côté serveur.
Cet article est partagé par Huawei Cloud Community "Kafka Network Module - Server Side" , l'auteur original : middleware brother.
SocketServer est un module utilisé par le serveur Kafka pour traiter les requêtes. Il est créé, initialisé et démarré lors du processus de démarrage de Kafka.
Processus de démarrage de SocketServer :
-
Initialisez l'accepteur dans l'ordre des points de terminaison, chaque point de terminaison correspond à un accepteur, créez un processeur pour chaque accepteur (le nombre est déterminé par l'élément de configuration num.network.threads) et démarrez l'accepteur. Après le démarrage de l'accepteur, il surveiller la connexion via le sélecteur, et la connexion nouvellement établie est transmise au processeur (interrogation pour sélectionner le processeur)
-
démarrer tous les processeurs
-
L'accepteur démarre et écoute le processus de connexion :
-
Après le démarrage de l'accepteur, il créera un serverSocketChannel, écoutera sur le point de terminaison correspondant à l'accepteur et enregistrera OP_ACCEPT sur le sélecteur, puis entrera dans une boucle infinie. Dans chaque boucle, la clé prête (c'est-à-dire le serverSocketChannel précédemment enregistré) est obtenu via le sélecteur, indiquant qu'il y a Lorsque la connexion arrive, créez un socketChannel correspondant à la connexion via accept(), puis interrogez pour en sélectionner un parmi les processeurs responsables de l'accepteur, et remettez le socketChannel au processeur sélectionné pour le traitement , c'est-à-dire remettre la connexion au processeur.
-
L'accepteur transmet la connexion au processeur pour le traitement, qui consiste à ajouter le socketChannel à la file d'attente de connexion du processeur newConnection, et le processeur l'obtiendra et le traitera en continu dans la méthode run.
-
Une fois que le processeur a obtenu le socketChannel de newConnection, il enregistre OP_READ sur le sélecteur et crée le KafkaChannel correspondant.
Le processus de réception et de traitement des requêtes côté serveur :
-
Une fois que le processeur a reçu l'événement OP_READ et qu'il est prêt, vérifiez et essayez de terminer la poignée de main SSL et la vérification SASL (la poignée de main peut ne pas être terminée à ce moment, donc une fois que le processeur a reçu l'événement OP_READ et est prêt, il doit d'abord vérifier et assurez-vous que la poignée de main a été effectuée, SSL/SASL Référence relative (Section 9.4)
-
Une fois la poignée de main SSL et la vérification SASL terminées, lisez les données du canal, construisez un objet NetworkReceive et placez-le en file d'attente dans stagedReceives
-
Sortez le premier élément de l'équipe stagedReceives (supprimez) et ajoutez terminéReceives
-
Retirez (ne supprimez pas) les éléments de filledReceives, construisez un objet Request, rejoignez la file d'attente request, supprimez l'enregistrement d'événement pour OP_READ, définissez le KafkaChannel correspondant sur MUTED, puis définissez-le sur MUTED_AND_RESPONSE_PENDING
-
KafkaRequestHandler prend des éléments (supprime) de la requestQueue et les remet au module KafkaApi pour traiter la requête
-
Une fois que KafkaApi a traité la requête, il place la réponse dans la file d'attente responseQueue et inflightResponses du processeur correspondant, et réveille son sélecteur
-
Le processeur prend la réponse (la supprime) de la file d'attente de réponses. Si la réponse doit être renvoyée au client, il attribue l'envoi de la réponse à KafkaChannel et enregistre l'événement OP_WRITE
-
Lorsque le canal est prêt à écrire, écrivez l'envoi dans le tampon d'écriture du canal, lorsque l'envoi est terminé, supprimez l'enregistrement pour l'événement OP_WRITE et ajoutez l'envoi aux envois terminés
-
Supprimez la réponse correspondante de inflightResponses, exécutez le rappel de réponse, définissez KafkaChannel sur MUTED, puis de MUTED sur NOT_MUTED, et rajoutez l'enregistrement d'événement OP_READ