[JSP-Servlet] Répartition de charge d'une web-app

Répartition de charge d'une web-app [JSP-Servlet] - Java - Programmation

Marsh Posté le 13-01-2003 à 17:08:07    

Alors, voila mon pb. Je suis sur qu'une solution existe, surement dans J2EE.
J'ai une web-app, qui utilise le système de sessions de l'API de servlets. Tomcat4, IIS, jdk1.4
On fait tourner ma web-app sur 2 serveurs différents (donc 2 moteurs de servlet, 2 serveurs web). On utilise un système de répartition des charges, qui répartie chacune des requètes sur un des 2 serveurs.
Le problème est le suivant : Quand un utilisateur ouvre une session sur le serveur A, rien ne guaranti que celui-ci n'émmettra de requêtes, ni ne recevra de réponses QUE sur ce même serveur A. Et une session ouverte sur le serveur A est évidement inexistante sur le serveur B. D'ou : problème si la requète n'abouti pas sur le même serveur.
Le problème doit être assez banal, qqn saurait me dire comment  le résoudre ?

Reply

Marsh Posté le 13-01-2003 à 17:08:07   

Reply

Marsh Posté le 13-01-2003 à 17:11:11    

non le problème est loin d'etre banal et c'est le serveur qui doit s'en occuper.
 
Typiquement un WAS en intégration horizontale offre ce type de fonctionnalités pour peu que tu utilise la session IBM machin chose, en gros une sous classe de HttpSession (et donc tu perds la généricité de ton code). Je ne sais pas avec WAS 4 ou 5 mais en WAS 3.5 tu étais obligé en tout cas.
 
Regarde si tomcat offre ce genre de fonctionnalité. Quel système de répartition des charges utilises tu?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-01-2003 à 17:35:17    

il me semble pas que tomcat gère ca mais je peux me tromper.
 
En théorie, c'est plutot au frontal de gérer ca mais ca signifie qu'il doit être capable de repérer lorsqu'une requête fait partie d'une session ouverte et d'adresser le bon moteur de servlet derrière.
 
C'est loin d'être évident...

Reply

Marsh Posté le 13-01-2003 à 17:37:13    

benou a écrit :

il me semble pas que tomcat gère ca mais je peux me tromper.
 
En théorie, c'est plutot au frontal de gérer ca mais ca signifie qu'il doit être capable de repérer lorsqu'une requête fait partie d'une session ouverte et d'adresser le bon moteur de servlet derrière.
 
C'est loin d'être évident...


 
ah oui mais ca c'est différent hein :o C'est pour ca que je te demandais quel système de répartition de charge tu utilisais. Ton problème est intéressant cela dit, si j'y pense ce soir je jetterai un coup d'oeil


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-01-2003 à 17:42:20    

pkoi tu dis que c'est différent ? c'est en plein dans le problème non ?

Reply

Marsh Posté le 13-01-2003 à 17:47:08    

Je suis en train de me renseigné sur le système de répartition des charges utilisé (c pas ds ma boite).
Ms je trouve bisare que le problème ne soit pas déja archi connu, plusieurs serveurs pour une web-app, j'imaginais que c'était assez courant...

Reply

Marsh Posté le 13-01-2003 à 18:10:04    

ben si c'est mod_jk (ce qui est fort probable), il assure le suivi de session. En fait il concatène le nom du worker a la session et le relit a chaque requete, pour le filer au même que précédement.  
Si c'est bien ca que tu utilises, je peux te donner plus de détails, je m'étais amusé a lire le source  :o

Reply

Marsh Posté le 13-01-2003 à 19:03:55    

benou a écrit :

pkoi tu dis que c'est différent ? c'est en plein dans le problème non ?


 
bin non. Dans le cas de WAS par exemple c'est géré au niveau interne c'est pas le répartissuer de charge qui route la requete sur le bon serveur.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-01-2003 à 22:49:17    

lol
 
c hyper courant ton truc...... :bounce:  
la repartition des charges elle fonctionne comment?  :heink:  
la phrase qui me perturbe, et une session ouverte sur le serveur A est EVIDEMENT inexistante sur le serveur B  :cry:  
c pas possible de cloner les sessions?  :sarcastic:  
je deconne bien sur.
enfin c qd même bizarre que le repartiteur de charge ne gère pas les sessions des serveurs avec. c quoi ce repartiteur suit trés curieux  :ouch:  
bahhh dis moi le nom que je note.
ON VEUT CONNAITRE L'ARCHITECTURE DE TES SERVEURS  :lol:  
 
c hyper interessant ton sujet
 
ben tu l'as testé ton appli web?
ça fait quoi alors quand tu te connectes sur A, et B ensuite
 
heuuuuuu au fait IIS c bien?
Apache c pas mieux au fait? :??:


Message édité par einstein2 le 13-01-2003 à 23:22:01
Reply

Marsh Posté le 13-01-2003 à 23:51:06    

:heink:


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 13-01-2003 à 23:51:06   

Reply

Marsh Posté le 14-01-2003 à 03:00:26    


 
Crois-tu vraiment que ton poste fais avancer les choses ?

Reply

Marsh Posté le 14-01-2003 à 09:06:37    

Les clients n'ont pas encore répondu au mail ds lequel je demande comment est gérée leur répartition de charge. Mais en fait, g ma petite idée quand au pb. J'imagine que leur répartition de charge est faite au niveau d'IIS, avec un truc qui ne "connait" même pas l'existance de Tomcat (il n'y connaissent vraiment pas grand chose, c tjs moi qui dois leur dire comment faire quoi !). Ds ce cas là, ce ne serait pas étonnant que les sessions de Tomcat (Servlet/JSP) ne soient pas maintenues d'un serveur à l'autre, non ?

Reply

Marsh Posté le 14-01-2003 à 09:13:37    

einstein2 a écrit :


ben tu l'as testé ton appli web?
ça fait quoi alors quand tu te connectes sur A, et B ensuite
 
heuuuuuu au fait IIS c bien?
Apache c pas mieux au fait? :??:  


 
G testé mon appli web. J'vois pas l'rapport.
Qd j'me connecte sur A et que B répond !? g pas essayé (g lu un rapport du client!), ms ça me parait évident que, d'un coup, le client à une réponse comme quoi il est pas connecté.
 
IIS, si c bien. J'en sais rien. Moi je l'utilise que pour test. Pour tests il fonctionne, Apache aussi ! :D

Reply

Marsh Posté le 14-01-2003 à 10:27:48    

il me semble qu'en substance, le gusse te disais qu'il fallait que tu gères des sessions partagés. Ca signiffie mettre en place de la distribution d'objet, etc ...
 
Si il t'avais fillé des liens de produit qui gérait ca, son poste aurait été nettement plus utile !

Reply

Marsh Posté le 14-01-2003 à 10:45:58    

benou a écrit :

il me semble qu'en substance, le gusse te disais qu'il fallait que tu gères des sessions partagés. Ca signiffie mettre en place de la distribution d'objet, etc ...
 
Si il t'avais fillé des liens de produit qui gérait ca, son poste aurait été nettement plus utile !


 
sans doute ouais, parce que là...

Reply

Marsh Posté le 14-01-2003 à 13:49:32    

lorill a écrit :

ben si c'est mod_jk (ce qui est fort probable), il assure le suivi de session. En fait il concatène le nom du worker a la session et le relit a chaque requete, pour le filer au même que précédement.  
Si c'est bien ca que tu utilises, je peux te donner plus de détails, je m'étais amusé a lire le source  :o  


 
Pr l'instant, je sais pas ce que le client utilise. Mais peut être que si c pas le cas, on peut lui imposer d'utiliser ça. ça m'interresse énormément ce que tu me dis là. Tu peux approfondir ?

Reply

Marsh Posté le 14-01-2003 à 13:55:53    

El_gringo a écrit :


Pr l'instant, je sais pas ce que le client utilise. Mais peut être que si c pas le cas, on peut lui imposer d'utiliser ça. ça m'interresse énormément ce que tu me dis là.


ben en fait j'y crois plus trop la... C'est un module apache qui fait la redirection vers le worker tomcat quivabien(tm), mais s'ils utilisent IIS, ca doit pas être ca... a moins que ca marche aussi, faut que je verifie

Reply

Marsh Posté le 14-01-2003 à 13:56:00    

El_gringo a écrit :


 
Pr l'instant, je sais pas ce que le client utilise. Mais peut être que si c pas le cas, on peut lui imposer d'utiliser ça. ça m'interresse énormément ce que tu me dis là. Tu peux approfondir ?


 
Ha... ça m'interresse qd même, me je suis qd même vachement déçu. Apparement, mod_jk, c ce qui fait le lien entre Tomcat4 et le serveur web Appache. G dit que le client utilisait (pour l'instant) IIS et Tomcat4... :-(

Reply

Marsh Posté le 14-01-2003 à 13:57:35    

aparement y'a aussi jk pour iis, cf
http://jakarta.apache.org/tomcat/t [...] howto.html

Reply

Marsh Posté le 14-01-2003 à 13:57:52    

lorill a écrit :


ben en fait j'y crois plus trop la... C'est un module apache qui fait la redirection vers le worker tomcat quivabien(tm), mais s'ils utilisent IIS, ca doit pas être ca... a moins que ca marche aussi, faut que je verifie  


 
J'en doute ! Pour la redirection IIS-Tomcat aussi on utilise une module. Mais celui-ci est écrit en C++. Je doute qu'il ai sont mot à dire sur les sessions et compagnie. Et mon avis, il se contente de prendre l'html généré par Tomcat et de le brancher sur IIS...

Reply

Marsh Posté le 14-01-2003 à 13:59:41    


 
Ho !? miracle... c ce que j'utilise.
Et comment tu configure pour cette séparation dont tu parles !?

Reply

Marsh Posté le 14-01-2003 à 14:05:58    

Le config du module IIS ressemble à celle de mod_jk pour Apache ?

Reply

Marsh Posté le 14-01-2003 à 14:06:42    

comme ca :
 
http://jakarta.apache.org/tomcat/t [...] howto.html
 
avec ca et l'url précédente tu devrais t'en tirer, mais je peux te rassurer, c'est le module qui assure le suivi de session.

Reply

Marsh Posté le 14-01-2003 à 14:07:30    

El_gringo a écrit :

Le config du module IIS ressemble à celle de mod_jk pour Apache ?

chais pas, jamais utilisé IIS, mais vu que c'est fait par les mêmes, au sein du même projet, doit bien y'avoir des trucs identiques (style la definition des workers)

Reply

Marsh Posté le 14-01-2003 à 14:15:47    

lorill a écrit :

comme ca :
 
http://jakarta.apache.org/tomcat/t [...] howto.html
 
avec ca et l'url précédente tu devrais t'en tirer, mais je peux te rassurer, c'est le module qui assure le suivi de session.


 
J'étais déja en train de lire ça, merci.
ça m'a l'air bon tout ça, très bon. Lorill, je sent que tu vas être mon sauveur... :bounce:

Reply

Marsh Posté le 14-01-2003 à 14:18:07    

El_gringo a écrit :


Lorill, je sent que tu vas être mon sauveur... :bounce:  


 :non: faut dire merci aux gens qui maintiennent JK.
ca fait toujours plaisir  :)

Reply

Marsh Posté le 14-01-2003 à 14:32:09    

Ha... merde, ce que j'étais en train de lire, j'pense pas que ça soit vraiment ce que je cherche. Ils expliquent comment créer plusieurs worker (1 par instance de Tomcat j'imagine). Mais ça, ça permet de répartir la charge selon l'url demandée, tu crois pas ?


Sometimes you want to serve different contexts with different Tomcat processes (for example to spread the load among different machines). To achieve such goal you will need to define several workers and assign each context with its own worker.  
 
Defining workers is done in workers.properties, this file includes two types of entries:  
 
 
 
An entry that lists all the workers defined
worker.list=worker1, worker2  
 
Entries that define the host and port associated with these workers
worker.worker1.host=localhost  
worker.worker1.port=8009  
worker.worker1.type=ajp13  
worker.worker2.host=otherhost  
worker.worker2.port=8009  
worker.worker2.type=ajp13  
 
 
 
 
The above example defined two workers, now we can use these workers to serve two different contexts each with its own worker :  
 
 
example uriworkermap.properties fragment
/examples/*=worker1  
/webpages/*=worker2  
 
 
 
 
As you can see the examples context is served by worker1 while the webpages context is served by worker2 .  
 
More informations on using and configuring workers in the Workers HowTO  


 
Toi t'avais rien à configurer pour que le mécanisme dont tu parlais fonctionne ?
"il concatène le nom du worker a la session et le relit a chaque requete, pour le filer au même que précédement"


Message édité par El_gringo le 14-01-2003 à 14:36:10
Reply

Marsh Posté le 14-01-2003 à 14:38:04    

Ms en fait, j'y pense, pour le mécanisme dont tu parlais, il faut n'avoir qu'une seule instance du serveur web (Apache ou IIs), et autant d'instance de Tomcat qu'on veut, non ?
Je suis sur qu'ils font tourner 2 IIS à la fois. C impossible que ça marche comme ça !

Reply

Marsh Posté le 14-01-2003 à 14:53:42    

Apparement, que ce soit pour servir Apache ou IIS, on s'en fout. Ma question est : comment paramètrer plusieurs "worker", ou chaque "worker" correspond à une instance de Tomcat. Ces worker étant utilisés pour répartir la charge, ils seront utilisés indifférement de l'url demandée.
Lorill, tu sais répondre à cette question simplement ou pas ?

Reply

Marsh Posté le 14-01-2003 à 15:00:57    

ha bon j'ai ecrit que des conneries?
 
ben j'attend les explications alors ... :bounce:  
les sessions doivent etre prises en charge par le repartiteur, c le mieux amha, car c'est le seul élément de l'architecture qui coordonne les taches sur les serveurs, les serveurs eux recoivent une requete mais le fait que l'on rajoute un serveur est transparent pour lui.
 
aprés que la requete aille sur a, b, c ....ou x on s'en contre balance si le repartiteur a bien fait son boulot tous les serveurs connaissent le USER.
 
moi je vois un ordinateur Frontal qui distribue avec des serveurs derrière....pkoi vous voyez koi vous?
 
si ça existe pas, faut le faire, le programmer koi!


Message édité par einstein2 le 14-01-2003 à 15:04:14
Reply

Marsh Posté le 14-01-2003 à 15:34:17    

El_gringo a écrit :

comment paramètrer plusieurs "worker", ou chaque "worker" correspond à une instance de Tomcat. Ces worker étant utilisés pour répartir la charge, ils seront utilisés indifférement de l'url demandée.
Lorill, tu sais répondre à cette question simplement ou pas ?


je peux essayer  [:sinclaire]
 
pour plus de détails faudra attendre ce soir (si je retrouve mon rapport de stage, c'est pas gagné).
 
En gros, tu as un fichier workers.properties dans lequel tu mets la config des workers : nom, incrément de charge (pour pouvoir diriger plus de trafic sur un que sur l'autre), port, host, ...).
 
Un worker est bel et bien une instance de tomcat.
Apres, dans la config d'apache (je sais pas pour iis), tu précise s quels sont les chemins (urls) a traiter avec jk. Par exemple JkMount /mawebapp/* malistedeworkers.
 
Quand apache recoit une requete sur /mawebapp/ il appelle le module, qui traite la requete.

Reply

Marsh Posté le 14-01-2003 à 16:26:30    

lorill a écrit :


je peux essayer  [:sinclaire]
 
pour plus de détails faudra attendre ce soir (si je retrouve mon rapport de stage, c'est pas gagné).
 
En gros, tu as un fichier workers.properties dans lequel tu mets la config des workers : nom, incrément de charge (pour pouvoir diriger plus de trafic sur un que sur l'autre), port, host, ...).


 
ça g déja vu comment faire pour déclarer plusieurs worker. Ce qui me pose pb, c'est : comment dire à jk d'utiliser tel ou tel worker de telle ou telle façon. parce que ds l'exemple que g vu, ils font ça (ds uriworkermap.properties) :


/examples/*=worker1  
/webpages/*=worker2  


ce qui dit d'utilise tel ou tel worker selon l'url. ça m'interresse pas ça. C que je voudrais c'est ce dont tu parles : l'incrément de charge.
 

lorill a écrit :


Apres, dans la config d'apache (je sais pas pour iis), tu précise s quels sont les chemins (urls) a traiter avec jk. Par exemple JkMount /mawebapp/* malistedeworkers.
 
Quand apache recoit une requete sur /mawebapp/ il appelle le module, qui traite la requete.


 
Cette partie est déja faite, elle fonctionne nickel.
 
Si tu peux me parler plus de ça, j'pense que t'as compris que ça m'interresse vraiment très très beaucoup...
@+  :hello:

Reply

Marsh Posté le 14-01-2003 à 16:31:12    

El_gringo a écrit :



/examples/*=worker1  
/webpages/*=worker2  


ce qui dit d'utilise tel ou tel worker selon l'url. ça m'interresse pas ça.  


ben si tu précises de worker par url il fait la répartition de charge de base : 50% des requetes sur le premier, 50% sur le deuxieme, a peu pres.
 
l'incrément de charge (lbfactor dans la doc jk) sert juste a biaser la répartition, pour avoir 75% sur l'un et 25% sur l'autre, par exemple.

Reply

Marsh Posté le 14-01-2003 à 16:51:23    

lorill a écrit :


ben si tu précises de worker par url il fait la répartition de charge de base : 50% des requetes sur le premier, 50% sur le deuxieme, a peu pres.
 
l'incrément de charge (lbfactor dans la doc jk) sert juste a biaser la répartition, pour avoir 75% sur l'un et 25% sur l'autre, par exemple.


 
Comment ça !? moi j'aurais dit que, ds le cas que je te présente, "worker1" va prendre 100% des requêtes du contexte "/example/" et "worker2" va prendre 100% des requêtes sur "/webpages/".
Je cherche pas ça moi...

Reply

Marsh Posté le 14-01-2003 à 16:53:26    

El_gringo a écrit :


Comment ça !? moi j'aurais dit que, ds le cas que je te présente, "worker1" va prendre 100% des requêtes du contexte "/example/" et "worker2" va prendre 100% des requêtes sur "/webpages/".
Je cherche pas ça moi...


j'ai mal lu, désolé.
 
en fait ca doit etre un truc style :
/mmawebapp/*=worker1,worker2
 
je verifie ce soir :hello:

Reply

Marsh Posté le 14-01-2003 à 17:28:48    

lorill a écrit :


j'ai mal lu, désolé.
 
en fait ca doit etre un truc style :
/mmawebapp/*=worker1,worker2
 
je verifie ce soir :hello:  


 
c cool. Merci.

Reply

Marsh Posté le 15-01-2003 à 10:40:24    

t'as pas u l'temps de voir Lorill ?

Reply

Marsh Posté le 15-01-2003 à 11:05:22    

El_gringo a écrit :

t'as pas u l'temps de voir Lorill ?

j'y ait pas pensé, désolé  :hello:  
t'as essayé de mettre  
 
chemin=listedesworkers ?

Reply

Marsh Posté le 15-01-2003 à 11:42:07    

Non, ms j'fais d'autre trucs en ce moment, j'demandais ça comme ça. Si t'as pas l'temps, j'pense que j'me débrouillerais.

Reply

Marsh Posté le 15-01-2003 à 16:55:39    

Fiou, c pas simple tout ça.
Ms bon, g trouvé.
En fait, si on a 2 worker de type ajp13 (worker simple correspondant à une instance de Tomcat4.x ou 5.x, il faut un autre worker, de type lb (loadBalancer), qui ne correspond pas à une instance de Tomcat, mais qui à pour but d'équilibrer les requêtes entre les 2 worker ajp13.
Personne ne m'écoute, ms c pas grave. Voila la solution à mon pb :


worker.list=router  
 
# Define a 'local_worker' worker using ajp13
worker.worker1.port=8009  
worker.worker1.host=node1.domain.org  
worker.worker1.type=ajp13  
worker.worker1.lbfactor=1  
worker.worker1.local_worker=1  
 
# Define another 'local_worker' worker using ajp13
worker.worker2.port=8009  
worker.worker2.host=node2.domain.org  
worker.worker2.type=ajp13  
worker.worker2.lbfactor=1  
worker.worker2.local_worker=0  
 
# Define the LB worker
worker.router.type=lb  
worker.router.balanced_workers=worker1,worker2  
worker.router.local_worker_only=1  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed