Calcul des scores
Méthode de calcul des scores
Généralités
Les teams peuvent visualiser l’évolution de leur score, minute par minute, depuis les graphiques proposés par la dashboard du jeu.
A noter que la dashboard se met à jour automatiquement toutes les 10 secondes (il n’est pas nécessaire d’actualiser la page manuellement).
A chaque Team est associée un tableau contenant des données de scoring. Voici un exemple de map représentant un score :
const score_sample = {
timestamp: "2020-03-10T14:01:56.666Z",
up: 500,
down: 30,
profit: 783,
resources: {
ec2: 15,
loadBalancer: 5,
},
};
A t = 2020-03-10T14:01:56.666Z, la team détenant ce score a traité avec succès, depuis le début du jeu, 500 requêtes et en a perdu 30.
A cet instant, elle a utilisé 15$ d’EC2 et 5$ de LoadBalancer.
Dans notre exemple, si ce score est calculé 5 minutes après le début du jeu et qu’initialement la team est entrée dans le jeu avec un load balancer redirigeant les requêtes vers un autoscaling group de 3 instances, nous avons :
- 5$ de load balancer
- 5$ × 3 = 15$ d’EC2
Le “profit” représente le résultat d’exploitation cumulé :
résultat d’exploitation = chiffre d’affaire - coûts d’exploitation
Ainsi dans notre exemple, avec les paramètres suivants (la détermination de ces paramètres est décrite plus bas) :
- le gain par requête correctement traitée est de 1.6606 $
- le coût d’une EC2 par minute est de 13.2 $
- le coût d’un load balancer par minute est de 26.46 $
On a :
profit = 500 × 1.6606 - 15 - 5 = 783 $
Détermination des coûts des ressources
Le bénéfice sur une minute, pour 1 load balancer et 3 ec2 (situation type au cours du jeu) est modélisé par l’équation suivante :
n × g -3 × Cec2 - Clb = B
Avec :
| Symbole | Valeur |
|---|---|
| n | Nombre de requêtes traitées en moyenne par minute |
| g | Gain obtenu pour le traitement d’une requête |
| Cec2 | Coût d’une Ec2 pour une minute d’utilisation |
| Clb | Coût d’une LoadBalancer pour une minute d’utilisation |
| B | Bénéfice sur une minute |
Par conséquent le gain obtenu pour le traitement d’une requête est le suivant :
g = (B + 3 × Cec2 + Clb) / n
Le coût des ressources s’inspire des coûts réels pratiqués par AWS, rehaussés de manière à pouvoir s’adapter au contexte du jeu.
Les coûts des ressources pouvant être trouvés dans la section Billing de la console AWS sont :
Coûts réels
EC2 :
- $ 0,0132 per On Demand Linux t2.micro Instance Hour
Load Balancer :
- $ 0,02646 per Application LoadBalancer - hour
RDS :
- $ 0,019 per RDS instance - hour
Lambda :
- $ 0,0000002083 pour 128 Mo par 100 ms
- 0,0000002083 × 10 × 3600 = 0,0074988 $ / heure
ECS (FARGATE) :
- 0.0486 $ par vCPU / heure
- 0.0053 $ par Go / heure
Dans le jeu, les coûts sont calculés de la manière suivante :
Coût par minute dans le jeu = Coût réel par heure × 1 000
D’où les coûts suivants, pratiqués dans le jeu :
Coûts dans le jeu
EC2 :
- $ 13,2 per On Demand Linux t2.micro Instance Minute
Load Balancer :
- $ 26,46 per Application LoadBalancer - minute
RDS
- $ 19 per RDS Instance
Lambda :
- $ 7.4988 par minute
ECS (FARGATE) :
- $ 29,6 par conteneur en config recommandée (0.5 vCPU, 1Go RAM)
Ces coûts nous permettent de déterminer le gain associé au traitement d’une requête :
- si l’on considère qu’en moyenne 100 requêtes seront traitées avec succès chaque minute
- si l’on souhaite que le bénéfice d’une team soit de 100$ en moyenne par minute
Gain associé au traitement d’une requête
g = ( 100 + 3 × 13,2 + 26,46100 ) / 100 = 1.6606 $
Dans les cas où la team n’est pas opérationnelle :
-
aucune requête n’est traitée et l’architecture est en place (1 LB + 3 Ec2) :
- la team perd 66,06 $ par minute
-
aucune requête n’est traitée et aucune ressource n’est utilisée :
- la team ne perd pas d’argent
Définition des ressources
Chaque ressource dont le cout doit être calculé doit être décrite par une classe implémentant l'interface Resource. Elle doit décrire comment calculer son coût pour une équipe à partir de la méthode Resource.computeCost.
Une fois implémentée et pour être prise en compte elle doit être mises dans le tableau RESOURCES du fichier src/scores/index.ts.