README.md 8.78 KB
Newer Older
1
2
3
4
# Projet TinyInsta

Ce projet a été réalisé par Jarod BLAIN, Thomas DENIS, Killian LUCAS et Corentin GUILLEVIC.

Corentin Guillevic's avatar
Corentin Guillevic committed
5
6
L'objectif de ce projet est de réaliser une application web ressemblant dans ses fonctionnalités à Instagram.

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
7
Nous allons commencer par vous fournir différents liens permettant d'accéder au projet, puis nous vous listerons les fonctionnalités implémentées. Ensuite nous vous présenterons le benchmark réalisé, les entités utilisées et nous terminerons par une brève conclusion. En annexes vous pourrez retrouver des aperçus de l'application.
Corentin Guillevic's avatar
Corentin Guillevic committed
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## Les liens

* Lien vers [l'application](https://webandcloud-289816.ew.r.appspot.com/tinyinsta/#!/) 
* Lien vers le [portail de l'API](https://endpointsportal.webandcloud-289816.cloud.goog/) 
* Lien vers le [Gitlab](https://gitlab.univ-nantes.fr/E175362L/tinyinsta)

## Fonctionnalités implémentées

Voici la liste des fonctionnalités implémentées :

* Créer/Modifier/Supprimer un profil
* Suivre/Arrêter de suivre un profil
* Créer/Modifier/Supprimer un post
* Aimer/Arrêter d'aimer un post
* Lister les posts publics
* Lister les posts aimés
* Lister les posts récents des utilisateurs que je suis
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
26
* Lister les posts d'un utilisateur
27
* Chercher des utilisateurs
Corentin Guillevic's avatar
Corentin Guillevic committed
28
* Importer des images
29
30
31

Nous avons testé ces fonctionnalités en utilisant différents systèmes d'exploitation et différents navigateurs web sans déceler d'anomalie.

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
32
33
34
35
36
37
Pour résoudre le problème du fan-out, nous avons implémenté la solution utilisant les index de messages.
Ainsi, nous pouvons ajouter un nombre très élévé de receveurs pour un même post. 
Nous créons une liste par paquet de 40 000 "followers" et nous pouvons créer autant de listes que besoin.
Pour que cette méthode soit pleinement efficace, il faudrait que la création de ces listes soit effectuée en tâche de fond (en utilisant Task Queue).

Pour résoudre le problème de la contention des compteurs pour un post, nous avons implémenté la solution consistant à 
Killian LUCAS's avatar
Killian LUCAS committed
38
créer plusieurs entités "*compteur*" pour un même post. 
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
39
40
41
Pour chaque post, nous créons 25 compteurs. 
Pour récupérer le total de "likes" sur un post, il suffit de récupérer tous les compteurs et de sommer leur valeur.

42
43
44
45
46
## Benchmark

Les différents tests ont été réalisé 30 fois.
Les temps présentés sont les temps de traitement dans les servlets.

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
47
### Ajout d'un post
48

49
Pour ce test, l'ajout de post est composé de l'ajout du contenu du post (description et adresse url de l'image), de l'ajout de ses différents compteurs de "likes" et de l'ajout des receveurs du post.
50

51
Si le posteur a 10 followers, la moyenne de temps d'ajout d'un post est de 236.7 ms.
52

53
54
55
56
57
58
Si le posteur a 100 followers, la moyenne de temps d'ajout d'un post est de 301.27 ms.

Si le posteur a 500 followers, la moyenne de temps d'ajout d'un post est de 566.47 ms.

Comme nous pouvons le constater, le temps pris pour ajouter un post est fortement dépendant du nombre de followers du posteur. A 500 followers, ce temps devient trop long. 

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
59
Nous pourrions envisager de modifier l'implémentation pour faire en sorte qu'au lieu d'ajouter un à un chaque follower, nous ajoutions des paquets de receveurs. Ainsi, il y aurait moins d'opérations à effectuer pour l'ajout d'un post et l'application passerait mieux à l'échelle.
60

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
61
Comme expliqué précédemment dans **Fonctionnalités implémentées**, une autre solution serait de créer les listes de receveurs en tâche de fond.
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
62
63
Ainsi, le temps pris pour répondre à la requête d'ajout d'un post serait constant. On peut supposer que ce temps serait inférieur à 236ms, le temps pris pour ajouter un post quand on est suivi par 10 personnes.
A l'issue de cette requête, le post et ses compteurs seraient ajoutés et une tâche consistant à créer les différentes listes serait créée. En revanche, la création des listes (et donc la réception pour les followers) s'effectuerait en un temps indéterminé.
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
64

65
66
### Récupération de posts

67
68
Le temps mesuré ici est le temps mis pour récupérer le contenu des posts (description et adresse url de son image) destinés à un utilisateur (sa timeline privée).

69
70
71
72
73
74
Pour récupérer 10 posts dont l'utilisateur est receveur, la moyenne de temps est de 67 ms.

Pour récupérer 100 posts dont l'utilisateur est receveur, la moyenne de temps est de 233 ms.

Pour récupérer 500 posts dont l'utilisateur est receveur, la moyenne de temps est de 1422 ms.

75
76
Comme en pratique le nombre de posts récupérés par une requête est bien inférieur à 500, nous pouvons considérer que la récupération des posts passe à l'échelle. Par exemple, nous pouvons citer l'exemple de Twitter qui récupère au maximum 200 tweets en une requête, avec un nombre par défaut de 20 tweets.

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
77
78
79
Dans notre application, nous récupérons 15 posts par requête, avec en plus des informations sur la personne qui l'a posté (nom et image de profil), le nombre de "likes" du post, et un booléen valant vrai si l'utilisateur aime ce post. Ayant plus d'entités à récupérer pour obtenir toutes ces données supplémentaires, le temps de traitement de la récupération de posts est plus long en pratique. 
Pour pallier à ce problème, à chaque connexion de l'utilisateur sur l'application, on commence par récupérer les posts publics les plus récents. Ces posts ayant de grandes chances d'être dans le cache, l'utilisateur n'a pas à attendre longtemps avant de voir les premiers posts apparaître. Il peut ensuite aller chercher les posts qui lui sont destinés ou les posts qu'il a aimés. 

80
81
### Nombre de "likes" par seconde

82
83
84
85
86
87
88
89
90
Nous avons utilisé une des classes présentées en exemple (Counting.sh) pour réaliser ce test.
L'objectif est de voir si la contention sur les compteurs de "likes" d'un post est supportée par l'application.

Avec un seul thread (et donc sans contention), 27 likes en moyenne ont pu être effectués en une seconde.

Avec 5 threads, 71 likes en moyenne ont pu être effectués en une seconde.

Avec 10 threads, 38 likes en moyenne ont pu être effectués en une seconde.

Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
91
92
93
Le problème de cette méthode est que, les threads étant créés dans la même servlet, ils utilisent le même canal de communication vers le datastore. En effet, que chaque thread ait un DatastoreService local ou qu'il n'y en ait qu'un seul commun à tous les threads, les performances sont les mêmes. 
Pour que ce benchmark soit plus représentatif, nous pourrions utiliser un outil comme Apache JMeter.

94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
## Capture d'écran des "kinds" utilisés

Person :

![person](img_readme/kinds/person.png "Person")

Post :

![post](img_readme/kinds/post.png "Post")

Post index :

![postIndex](img_readme/kinds/postIndex.png "Post index")

Follow :

![follow](img_readme/kinds/follow.png "Follow")

Follower number :

![followerNumber](img_readme/kinds/followerNumber.png "Follower number")

Like :

![like](img_readme/kinds/like.png "Like")

Like number :

![likeNumber](img_readme/kinds/likeNumber.png "Like number")

Corentin Guillevic's avatar
Corentin Guillevic committed
124
## Conclusion
125

Corentin Guillevic's avatar
Corentin Guillevic committed
126
127
Nous avons trouvé ce projet très intéressant à réaliser. 
En effet, réaliser une application web de ce type était une première pour nous.
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
128
Cela nous a permis de découvrir le monde du cloud computing avec un cas concret, ainsi que d'appliquer les diverses connaissances acquises dans le module Web, Cloud & Datastores.
129

Corentin Guillevic's avatar
Corentin Guillevic committed
130
131
132
La découverte de Mithril.js a également été intéressante.
Ce framework permet de faciliter l'écriture des requêtes XHR et d'optimiser le temps de rendu des pages. 
Il est très probable que nous réutilisions Mithril.js pour des projets web ne nécessitant pas un nombre trop élevé de composants.
133

Corentin Guillevic's avatar
Corentin Guillevic committed
134
La recherche de documentation a été un élément essentiel de ce projet.
Corentin Guillevic's avatar
Corentin Guillevic committed
135
Certaines tâches ont été difficiles à réaliser, comme par exemple l'import d'une image d'un utilisateur vers le "Google Cloud Storage". Réussir à obtenir des temps convenables pour certaines méthodes de l'API n'a pas été trivial non plus. 
136

Killian LUCAS's avatar
Killian LUCAS committed
137
Pour aller plus loin, nous pourrions envisager de continuer de travailler sur les méthodes de l'API pour réduire davantage le temps de traitement. Cela pourrait s'avérer bénéfique pour l'ajout de post qui ne passe pas à l'échelle à partir d'un certain nombre de "followers". La récupération de posts étant primordiale pour notre application, réduire son temps d'exécution serait une amélioration importante.
Corentin Guillevic's avatar
Corentin Guillevic committed
138
 
Corentin GUILLEVIC's avatar
Corentin GUILLEVIC committed
139
De nombreuses autres améliorations seraient possibles, comme par exemple permettre aux utilisateurs de choisir leur nom de profil définitif (le profileName), ou encore donner la possibilité d'effectuer des modifications sur les images importées (rognage, centrage, rotation).
Corentin Guillevic's avatar
Corentin Guillevic committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153

## Annexes

### Aperçus de l'application

![apercu1](img_readme/apercus/apercu1.png "Aperçu 1")

![apercu2](img_readme/apercus/apercu2.png "Aperçu 2")

![apercu3](img_readme/apercus/apercu3.png "Aperçu 3")

![apercu4](img_readme/apercus/apercu4.png "Aperçu 4")

![apercu5](img_readme/apercus/apercu5.png "Aperçu 5")