Posté 26 novembre 2009 - 17:32
+1 avec Kioob, on n'est plus au temps du Minitel, les connexions "simultanées" en http c'est un élément à géométrie variable (rappel: un navigateur est connecté au serveur le temps de charger la page et ses éléments, éventuellement quelques secondes après au cas où, puis il se déconnecte, il ne reste pas connecté tout le temps que la page est affichée).
En général, on compte plutôt en nombre de requêtes par seconde, mais couplé avec le temps d'exécution d'une requête (CPU + latence accès bdd ou ressources externes) et les mécanismes de Keep-Alive, ça a une influence sur le nombre de connexions TCP (et de processus ou threads) simultanés.
Une "session php" ça ne consomme rien.
Pour moi il y a trois parties:
- les connexions avant 20h
- le "dévoilement du questionnaire"
- les connexions après pour soumettre les réponses
Le dévoilement du questionnaire peut être fait de plusieurs façons:
- quand le gars se connecte avant 20h on lui envoie le questionnaire quand même, mais il est "caché", et ne sera dévoilé qu'à l'heure dite sans nouvelle connexion au serveur. Evidemment il faut prendre un minimum de mesures pour que le gars ne puisse pas juste regarder le source une heure avant pour le récupérer, et il faut assurer un minimum de synchro (i.e. ne pas tenir compte bêtement de l'heure du PC) mais quoi qu'il arrive, si on veut éviter une connexion à 20h, il faut fournir tous les éléments à l'avance, et c'est donc forcément déchiffrable
- on force un reload à l'heure dite. Ca veut dire 15 000 requêtes en quelques secondes.
- on utiliser un système de "push" (en fait du long polling). Ca veut dire 15 000 connexions simultanées (là c'est effectivement le cas, on garde volontairement la connexion établie), et 15 000 réponses envoyées d'un coup à tout le monde
- on combine la première option et l'une des deux autres pour envoyer toutes les données à l'avance, sauf une clef de déchiffrement, et on envoie juste la clef à l'heure dite.
Pour le push/long polling, voir des solutions comme APE, ou faire un développement maison (avec libevent il doit être possible de développer ça en quelques centaines de lignes de C, peut-être même moins de 100).
Note que quoi qu'il arrive "exactement au même instant" reste approximatif, il y aura forcément un écart de quelques millisecondes à plusieurs secondes.
Pour les parties avant/après, c'est une question de prévoir à quel rythme ces connexions vont se faire. Au pire c'est 15000/seconde, au mieux ça s'étale sur des minutes donc on peut descendre à quelques dizaines de requêtes/seconde. Ne pas oublier malgré tout de compter les reloads que plein de gens vont forcément faire (ce qui entraîne des requêtes pour tous les autres fichiers inclus), et dans le cas de la soumission, les problèmes genre soumission incomplète etc qui vont forcément entraîner plusieurs soumissions.
Choses à faire ou à vérifier:
- essayer de rendre un maximum de contenu totalement statique
- alléger autant que possible toutes les pages "sur le chemin"
- séparer le contenu statique du contenu dynamique (mettre le contenu statique sur un serveur dédié super light, genre Apache sans aucun module ou presque, ou lighttpd)
- supprimer les keep-alives sur le contenu dynamique
- la config d'Apache en termes de nombre de clients, processus, threads, etc.
- attention à faire en sorte que la machine ne swappe pas: les processus php sont très gourmands en RAM, donc si tu laisses Apache en forker trop, ta machine va te faire une mort subite
- la config mysql en termes de nombres de clients etc.
- la config système en termes de nombre de processus, fichiers ouverts, connexions, etc.
- la config de firewalls (externes ou internes) qui limiteraient le nombre de nouvelles connexions par seconde (pensant que c'est une attaque DDOS par exemple)
Si tout ça ne tient pas sur une seule machine (ce qui est possible), tu peux avoir intérêt à utiliser des solutions de serveurs virtuels "à la demande" (voir chez Gandi ou chez Amazon par exemple), que tu peux louer pour juste quelques heures et qui utilisent des "images" du serveur pré-construites.
Et évidemment, tester tout ça bien à l'avance, surtout la montée en charge. On a toujours des surprises sur des paramètres auxquels on n'aurait jamais pensé...
Jacques.