Exercice temps réel

Résolu
cs_cogno Messages postés 26 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009 - 8 déc. 2009 à 20:12
cs_cogno Messages postés 26 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009 - 9 déc. 2009 à 17:24
Bonjour la famille,

j'ai un petit exercice simple d'énoncé a vous soumettre, je n'ai pas trouvé de solution. Il s'agit d'un exercice temps réel.

Prenons un serveur(dans le sens général) qui reçoit en entrée 2000 messages par seconde. Le serveur les traites dans l'ordre d'arrivée,en gardant l'ordonnencement, puis les renvoie en temps réel.

Chaque message reçu par le serveur est traité de la manière suivante:
-> tout les messages entrants demandent un accès en lecture à une base de données (qu'n appellera BD)
-> 20 messages entrants par seconde(parmis les 2000) demandent en plus un acces en écriture à la BD

La BD possède les caractéristiques suivantes:
-> un maximum de 80 acces (écriture et/ou lecture) par seconde max
-> elle a une taille de 500M

La question est: comment faire pour garder le temps réel?

(à mon avis c'est une question de multi thread)

Merci pour votre aide la famille

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 déc. 2009 à 01:10
Ce n'est pas la solution, mais une idée comme ça.

Le problème que tu as c'est que tu ne peux faire que 80 accès pour 2000 messages entrant.
C'est donc impossible en l'état.

L'astuce consiste à dupliquer les BD, sur différentes machines si possible, et de répartir la charge à l'aide loadbalancer (répartisseur de charge).

Une fois la charge répartit, si tu as suffisamment de BD, c'est bon !
Petit problème qui complique tout: les accès en écriture. Si tu n'écris pas dans toutes les bases au même moment, c'est foutu !
Mais si tu écris dans toutes les bases, c'est foutu aussi puisque tu bloques tout.

L'astuce consiste à prendre une BD supplémentaire et à faire tourner régulièrement un processus de réplication. Si tu n'écris que dans une seule BD, il suffit alors d'utiliser la BD supplémentaire pour instaurer un cycle de roulement pour la réplication. Tu recopies une BD, la BD qui est recopiée étant gelée, il est nécessaire d'avoir une base de plus que prévu pour ne pas engendrer de perte de performance.

Si tu synchronise bien tout ceci, alors tu peux conserver ton temps réel.

Quelques petits défaut, tout de même:
- Prends beaucoup de place (nb de BD (au moins 25) * 500Mo)
- Peut coûter cher si on veut faire les choses biens et acheter suffisamment de machine.
- Les données se synchronise par cycle, et donc il peut y avoir des différences de résultats temporaire entre les BD. Ce qui peut très bien être inacceptable, tout dépend du contexte.
- Il faut correctement synchroniser tout ceci, ce qui est une vraie plaie à créer et à maintenir.
3
cs_cogno Messages postés 26 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009
9 déc. 2009 à 16:25
Merci Pingu,

je n'étais pas allé si loin avec le gars qui m'a posé le problème.

Cependant il m'a dit que ca pouvait se faire en gardant cette BD uniquement (j'ai donc compris sans la dupliquer) est ce possible?
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 déc. 2009 à 16:29
Ben, en faisant une file d'attente, ouais, mais ce n'est plus du temps réel, il y aura un temps de latence de plus en plus grand au fur et à mesure que la liste grandit.
Si tu reçoit 2000 accès et que la base ne peut en gérer que 80, je suis désolé, mais ce n'est pas possible, ou encore une fois, je serais très intéressé par une solution à ce problème !
3
cs_cogno Messages postés 26 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009
9 déc. 2009 à 16:40
Moi aussi j'ai proposé d'empiler les messages d'entrée et bien, plus de temps réel.

Comme la question avant l'exercice etait en gros: "connaissez vous le multi tache?"
A mon avis il faut partir la dessus. DOnc cest ce que j'ai dit tout de suite "a ca cest du multi tache" mdr

Mais sans toucher a la BD ca me paraissait impossible, donc j'ai clairement posé la question, il m'a dit que oui cest possible tel quel...

Petit indice il m'a dit : "si vous aviez trouvé comment faire, je vous aurais demandé que se passe-t-il quand on augmente le nombre de message entrant."

Sous entendu je pense: il y a une solution pour cette exercice, mais avec ces valeurs la précisément. Au dela la solution montre ses limites...
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
9 déc. 2009 à 17:11
Sûrement une c?????ie, mais...
Ne peux-tu pas récupérer des infos pour plusieurs messages en même temps?
Par exemple, plusieurs messages demandant accès aux mêmes données, ou à des données similaires que tu pourrais récupérer d'un coup...
Cela nécessiterait un tri des messages entrant suivant certains critères, selon ce qu'il y a dans ta BD.
3
cs_cogno Messages postés 26 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009
9 déc. 2009 à 17:24
je ne sais pas peut etre faut il trier els messages,

en tout cas il faut garder l'ordre des messages et le temps réel.

Sinon pour info, cest pas un bout de code que le mec attendait, cest plus un algorithme ou une methode de faire...
0
Rejoignez-nous