web-dev-qa-db-fra.com

Comment un seul servlet gère-t-il plusieurs demandes du côté client

Comment un seul servlet gère-t-il plusieurs demandes clientes sous forme de demandes utilisateur? Sur la base du modèle de conception singleton, je sais que nous obtenons une seule instance de servlet créée, mais comment un seul servlet gère-t-il des millions de demandes. Confus au sujet du filetage impliqué également.

Les spécifications ou paramètres du navigateur sont également utiles ici pour envoyer les demandes ou générer les threads envoyés pour les demandes.

Est-ce la même chose pour tous les frameworks ou cela diffère disons par exemple struts v/s springs?

23
shivam-shekhar

Les frameworks Struts/Spring sont en fait écrits au-dessus des spécifications des servlets, donc peu importe ce que vous utilisez en dessous, utilisez les servlets.

Vous avez raison, une seule instance de Servlet est créée, mais cette instance est partagée sur plusieurs threads. Pour cette raison, vous ne devriez jamais avoir partagé d'états mutables dans vos servlets.

Par exemple, vous avez le servlet suivant mappé sur http://localhost/myservlet

class MySerlvet extends HttpServlet {

     public void doGet(HttpServletRequest req, HttpServletResponse res) {
          // Get Logic
     }    
}

Le serveur Web aura quelque chose de similaire (pas nécessairement le même) dans son code.

MyServlet m = new MyServlet(); // This will be created once

// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));
19
shazin

Chaque demande est traitée dans un thread séparé. Cela ne signifie pas que Tomcat crée un thread par demande. Il existe un pool de threads pour traiter les demandes. Il existe également une seule instance pour chaque servlet et c'est le cas par défaut. ( Plus d'informations ). Votre servlet doit être Thread Safe.

enter image description here

Si votre servlet implémente l'interface SingleThreadModel, chaque thread utilise une instance distincte de servlet. SingleThreadModel est déconseillé , Ne l'utilisez pas.

SingleThreadModel

J'ai fait cette réponse en tant que wiki communautaire.

28
Ali Sepehri.Kh

Vous ne créez pas plusieurs instances de servlet. Le moteur de servlet crée un thread distinct pour chaque demande (jusqu'à un certain nombre maximum de threads). Les performances sont liées au nombre de threads et non au nombre d'instances de la servlet.

Par exemple, s'il y a 1000 requêtes et que le nombre maximal de threads pouvant être générés par le servlet est de 100, il y aura une dégradation des performances.

Afin d'éviter ce problème, nous pouvons utiliser équilibreur de charge en plaçant plusieurs serveurs derrière un équilibreur de charge. L'équilibreur de charge doit être configuré pour "acheminer" les demandes vers n'importe lequel des serveurs en fonction de différents paramètres/paramètres (distribution à tour de rôle, distribution de charge, etc.). Plus vous avez besoin de charge, plus vous devez ajouter de serveurs. Cependant, cela envoie tout le trafic via l'équilibreur de charge, il est donc important qu'il soit redondant et sécurisé en cas de basculement.

5
siddhartha