Problème d'architecture...

Problème d'architecture... - PHP - Programmation

Marsh Posté le 22-05-2003 à 12:22:21    

Bonjour,
 
Je me permets de solliciter votre avis sur la solution que j'ai imaginé pour résoudre mon problème.
 
Le Problème :
Notre équipe développe une application web en PHP / Oracle 8.1.7.
Nous utilisons des connexions Oracle permanentes car le temps de connexion est rédhibitoire.
Notre problème, c'est que le serveur Oracle n'accepte pas plus de 100 connexions, ce qui nous oblige à limiter à 100 le nombre de clients.
C'est un problème, car toutes les requêtes HTTP n'ont pas forcément besoin d'Oracle, ce qui fait qu'on arrive rapidement à des messages d'apache nous demandant d'augmenter 'MaxClients'.
 
Ce qu'il nous faudrait, c'est un système capable de gérer un pool de 100 connexions Oracle à la disposition de 250 clients Apaches potentiels.
 
La Solution :
 
J'ai imaginé une architecture avec 2 serveurs Apache.
SRV-1 pour le web avec 250 clients Max.
SRV-2 pour le SRV1 avec 100 clients max.
 
Quand SRV-1 à besoin de données, il fait une requête HTTP vers SRV-2 avec en POST tous les paramètres nécessaires.
Les requêtes Oracles (Uniquement des appels de procédures stockées ) sont réalisés par SRV-2 qui renvoie la réponse sous la forme d'un XML.
SRV-1 reçoit donc une réponse HTTP dont le corps contient du XML.
 
Ce changement d'architecture est presque Gratuit en terme de développement car dans la situation actuelle, tous les appels Oracles sont centralisés, et les réponses sont déjà en XML.
 
Voilà.
 
Je suppose que ce genre de chose se fait couramment, j'ai entendu parler de RPC, SOAP...
J'ai cherché sans succès des solutions existantes capable de s'intercaler "facilement" entre PHP et Oracle.
Je me doute que j'ai une fois de plus réinventé la roue, mais dans notre cas, le concept et sa mise en oeuvre sont très simples.
 
Me trompe'je ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 12:22:21   

Reply

Marsh Posté le 22-05-2003 à 15:45:45    

Bon, ben si personne est contre, c'est que çà doit être bon !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 15:49:42    

('scuse, j'avais pas vu ton post :D)
Tu peux pas plutôt implémenter un système de file d'attente ? Passke la soluce que t'as trouvée monopolise 2 serveurs au lieu d'un donc bofbof.
T'as moyen de récupérer le nombre de connectés au serveur Oracle ? Passke si oui, le système de gestion de file d'attente peut se faire carrément bien, je pense.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

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

salut
il y a qques temps j'avais cherché des solution de pool de connexion oracle/php, mais j'avais rien trouvé.
Ton idée a l'air pas mal, et je me permets de la graver dans un coin de ma mémoire ;)

Reply

Marsh Posté le 22-05-2003 à 16:03:30    


Pourquoi tu fais pas une extension qui gère les 100 connections?
Qd un script demande l'accès à la DB il lui réserve et tu le relibères pour un autre script à la fin du script... Comme ca t'as pas un deuxième serveur  :D  
 


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 22-05-2003 à 18:16:35    

A tout de même ... :whistle:  
 
Taiche : Heu, c'est super ton truc là, mais je n'ai pas le début de la moindre petit idée de comment implémenter çà sur un serveur Apache/PHP. Tu pourrais préciser ?
Ma soluce ne monopolise pas 2 serveur. Le deuxième serveur http est installé physiquement sur la même machine qu'Oracle. Comme çà c'est pas du SQL/NET qui passe entre les machines, mais du bête HTTP.
 
zion : Tu parles d'une extention de quel genre ? Un truc en C à greffer sur Apache et/ou PHP ? Un module multi-threads qui gérerait les connexions ?
Ben en fait, si un serveur Apache/PHP peut le faire, je ne vois pas pourquoi je devrai en écrire un :??:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 18:21:04    

Mara's dad a écrit :


zion : Tu parles d'une extention de quel genre ? Un truc en C à greffer sur Apache et/ou PHP ? Un module multi-threads qui gérerait les connexions ?


 
un module en C a greffer à PHP oui, un peu de mémoire partagée et au boulot  [:banzai]


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 22-05-2003 à 18:21:12    

En fait j'ai trouvé un truc qu'à l'air de faire ce genre de choses : http://db.apache.org/torque/
 
Ca m'a tout l'air d'une grosse uzine à gaz à tout faire en Java. Bref le genre de truc que je fuis vu ce que çà doit bouffer en ressources.
 
C'est comme le XML. Au début, c'est Oracle qui le générait avec XSU. Maintenant je le fait en PHP pour le tiers du temps !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 18:39:07    

zion a écrit :


 
un module en C a greffer à PHP oui, un peu de mémoire partagée et au boulot  [:banzai]  


 
Super !
En gros je reprends le module Oci8 et je me tape le topic : 'implement connection pooling in ZTS mode' de la TODO list.
Ben j'avoue que j'aimerai beaucoup en être capable, mais c'est de très loin au delà de mes capacités de programmation en C. Les contraintes du projet ne me permettent pas de dépenser assez de temps pour le faire. Dommage  :sweat:  
 
Mais j'y pense http://forum.hardware.fr/icones/icon3.gif , y'a peut-être des candidats dans la salle ?


Message édité par Mara's dad le 22-05-2003 à 18:39:37

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 18:41:17    

Mara's dad a écrit :


Mais j'y pense http://forum.hardware.fr/icones/icon3.gif , y'a peut-être des candidats dans la salle ?


 
ché pas, tu paies combien  :whistle:  
 
Mais le ZTS mode c'est sous Windows ou Apache 2, enfin par défaut c'est pas le mode ZTS sur les installations de base Apache 1.x  :)


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 22-05-2003 à 18:41:17   

Reply

Marsh Posté le 22-05-2003 à 18:45:36    

C'est pas grave, je suis en Apache 2 !
Oui je sais, il parait que çà ne se fait pas... Chuuuuut
 
Py ZTS mode, pour moi c'est du chinois ! J'ai écris ce que j'ai lu dans oci.c.


Message édité par Mara's dad le 22-05-2003 à 18:46:33

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 18:48:13    

zion a écrit :


ché pas, tu paies combien  :whistle:  


 
Ben, tout ce que peut faire, c'est . . . Rien.
Y'a pas d'embauche dans ma boîte en ce moment :sweat:  


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 18:48:53    

Mara's dad a écrit :

Py ZTS mode, pour moi c'est du chinois ! J'ai écris ce que j'ai lu dans oci.c.


 
C'est simple, c'est le mode threadé ou pas... En mode non ZTS chaque script est forké, en mode ZTS non mais le code de leurs fonctions sont tellement mal foutus que c'est pour ca que ca merde grave avec Apache 2 niveau perf (un bon truc OO aurait vraiment été nickel)... Enfin bon, je m'égare  [:ddr555]


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 22-05-2003 à 18:59:37    

Yes j'ai essayé la version threads, pas longtemps...
Donc pas de mode ZTS ! Donc pas de gestion de pool de connexions. On en revient à 2 serveurs.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-05-2003 à 22:45:40    

Mara's Dad : bin pour le coup de la file d'attente, je voyais ça surtout en Java avec servlets et tout. Ca se ferait en 2 secondes. Après, c'est p'têt possible aussi en PHP, mais je sais pas. L'idée c'est en gros que tu stockes dans un tableau les sessions déjà connectées à ta DB. Quand y en a plus de 100, celles qui arrivent sont foutues dans un ôt tableau pis quand y en a une qui se libére, ba hop, tu dépiles.
Comme je disais, à faire en Java c'est tout facile. En PHP, je connais pas trop les mécanismes (je marche surtout au procédural et uniquement pour du PHP/MySQL/génération de pages ouaibe dynamiques et pis roule Raoul), donc je sais pas si c'est faisable, mais c'est p'têt à cresuer, qui sait.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 22-05-2003 à 23:07:58    

Je sais pas si c'est réalisable dans ce cas, mais est-ce que le plus simple ne serait pas de séparer les apache qui ont besoin de la connexion au SGBD de ceux qui n'en ont pas besoin.
 
Faire 2 sites en quelque sorte. Un qui ne gère que des pages sans connexion SGBD et l'autre qui ne gère que des pages avec connexion SGBD [:proy]

Reply

Marsh Posté le 23-05-2003 à 03:15:55    

Quasiement toutes les pages ont besoin de la bdd, mais une page, c'est du html, des gifs, des css des javascript... tout çà n'a pas besoin d'oracle et pourtant, c'est le même serveur apache.
 
Taiche, ton serveur java ne fonctionne pas du tout sur le même principe qu'un serveur Apache en fork. En thread, je dis pas, mais comme vu avec zion les perfs ne sont pas là, et çà revient à modifier le module oci8  :pt1cable:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-05-2003 à 10:46:35    

Les images par exemple, elles prennent une connexion à un serveur Apache. Si elles pouvaient être déplacés sur un Apache "dédié", ca limiterait la charge des Apache utilisant la connexion à la base :)

Reply

Marsh Posté le 23-05-2003 à 11:36:58    

J'ai trouvé çà : http://sqlrelay.sourceforge.net/ Quelqu'un connait ?
 
mrBebert : C'est pas con, mais en gros çà revient toujours à avoir 2 serveurs Apache, comme dans ma solution.
Question : est-t-il possible d'avoir 2 serveurs Apache sur la même machine qui écouterai des ports différents ? Je sais bien qu'un seul serveur peut le faire, mais çà ne règlerait pas le problème.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-05-2003 à 11:47:14    

Mara's dad a écrit :

Question : est-t-il possible d'avoir 2 serveurs Apache sur la même machine qui écouterai des ports différents ? Je sais bien qu'un seul serveur peut le faire, mais çà ne règlerait pas le problème.


 
oui c'est possible :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 23-05-2003 à 12:08:45    

Merci.
 
Je fais un essai avec SQL RELAY . . . et je reviens
 
PS: En fait notre appli PHP accède à 2 bases oracle, et aussi à 3 base postgres (sur le serveur web). J'avais un peu oublié mes bases postgres dans l'histoire. Bref si on veut monter à 250 clients, il n'est pas pensable d'utiliser 500 connexions Oracle et 750 connexion Postgres !
 
Mais comment y font les ZOTRES :??:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-05-2003 à 12:09:08    

Mara's dad a écrit :

Question : est-t-il possible d'avoir 2 serveurs Apache sur la même machine qui écouterai des ports différents ? Je sais bien qu'un seul serveur peut le faire, mais çà ne règlerait pas le problème.

Oui, c'est tout à fait possible :)  
Ils peuvent aussi avoir chacun leur propre configuration si besoin.


Message édité par mrbebert le 23-05-2003 à 12:10:02
Reply

Marsh Posté le 23-05-2003 à 14:28:09    

YES !
 
Bon, ben Sql-Relay est bien parti pour être la solution de mon problème.
 
Installé sur linux avec support Oracle et Postgres et API PHP : It Rocks !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-05-2003 à 18:54:31    

Bon, c'était trop beau...
 
Tout va bien, sauf qu'SQL Relay ne gère pas les Collections d'Oracle.
 
J'irrais bien mettre mes grosses paluches dans le code, mais C++, OCI8 et moi, çà fait 3 :sweat:
 
Ca tente quelqu'un de faire évoluer SQL Relay ?
 
Je demande à tout hazard, hein ! Je demande pas qu'on fasse mon boulot à ma place. J'essaye de m'y mettre de mon coté, mais je sens que c'est pas gagné.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-05-2003 à 23:34:02    

Mara's dad a écrit :

Bon, c'était trop beau...
 
Tout va bien, sauf qu'SQL Relay ne gère pas les Collections d'Oracle.
 
J'irrais bien mettre mes grosses paluches dans le code, mais C++, OCI8 et moi, çà fait 3 :sweat:
 
Ca tente quelqu'un de faire évoluer SQL Relay ?
 
Je demande à tout hazard, hein ! Je demande pas qu'on fasse mon boulot à ma place. J'essaye de m'y mettre de mon coté, mais je sens que c'est pas gagné.


t'inquiète pas, je pense pas que quelqu'un vienne te le reprocher... on dirait que les polémiques qui trainent à droite à gauche sur prog sèment la panique chez les forumeurs  [:ddr555]  
 
euh sinon, ptites questions innocentes:

  • les collections c'est quoi :??:  
  • et à part ça, ça te permet de faire ton pool de connexion? :whistle:  


dsl, mais moi le c++... bah ça fait un certain temps que j'en ai plus fait [:proy]


Message édité par dropsy le 26-05-2003 à 23:34:40
Reply

Marsh Posté le 27-05-2003 à 10:30:32    

dropsy a écrit :


euh sinon, ptites questions innocentes:

  • les collections c'est quoi :??:  
  • et à part ça, ça te permet de faire ton pool de connexion? :whistle:  



 
Les collections, c'est un terme générique pour des types définis par l'utilisateur du genre :  
type AStype is table OF VARCHAR2(255);
 
En gros c'est des tableaux.
 
SQL Relay permet de gérer des pools de connexions vers toutes sortes de bases. Ces pools sont utilisables par toutes sortes d'application via des APIs.
 
Par exemple quand je l'ai installé sur mon serveur, le configure a automatiquement détecté le client Oracle et Postgres. Il a auusi détecté PHP, Perl, Python, C, C++...
 
Je n'ai donc plus besoin d'avoir un support Postgres et Oracle dans ma configuration PHP. Je le remplace par le module SQL Relay.
 
Le client et SQL Relay discute via un protocol réseaux, ce qui fait qu'ils n'ont pas besoin d'être sur la même machine. Ca permet donc aussi de pouvoir utiliser Oracle par exemple à partir d'un machine pour laquelle Oracle ne fournis pas de client, pourvu qu'un compilateur C++ soit disponible.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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