ZEP-11 : Interface de statistiques sur les tutoriels

Des chiffres, des graphes, du kikimeter !

a marqué ce sujet comme résolu.

Expérience perso :

  • Cassandra: ultra complexe à installer puis à administrer, déjà que node tue Spacefox à petit feu, si on lui impose un cassandra par derrière on va l'achever
  • CouchDB : simple d'utilisation mais force le paradigme map/reduce dès que tu veux faire des sélections un peu plus poussées. J'ai bien aimé m'en servir mais j'ai trouvé le binding python un peu grade.

si on lui impose un cassandra par derrière on va l'achever

Oh, si y'a que ça, je peux aussi utiliser mon pouvoir de DTC pour dire "fuck Cassandra, on prends autre chose hein". Cela dit, il va falloir que je réfléchisse sérieusement à la question parce que là je ne sais même pas pourquoi on s'oriente vers du NoSQL et ce que ça implique.

si on lui impose un cassandra par derrière on va l'achever

Oh, si y'a que ça, je peux aussi utiliser mon pouvoir de DTC pour dire "fuck Cassandra, on prends autre chose hein". Cela dit, il va falloir que je réfléchisse sérieusement à la question parce que là je ne sais même pas pourquoi on s'oriente vers du NoSQL et ce que ça implique.

SpaceFox

Il faudrait au moins justifier le besoin NoSQL de manière claire et chiffré (Facile mais prouvez le). Il faut aussi prouver que l'on peut pas répondre avec les outils qu'on a aujourd'hui. Il faudrait aussi faire un tour de table entre dev, pour que vous puissiez savoir quelles sont les compétences en interne (3 ou 4 personnes qui ont déjà entendu le nom minimum quoi).

Cassandra, avant c'était super compliqué à installer, mais maintenant c'est juste un bash apt-get install cassandra . Par-contre, les outils de monitoring de Cassandra, sont plus compliqué à installer. Jamais utilisé le driver cassandra pour Python mais le projet GitHub a pas l'air dégeu. La syntaxe de Cassandra en gros c'est du sql sans jointure (Exemple de requête: "SELECT * FROM users;").

Faite attention à la licence de MongoDB, elle est très spéciale, et n'oubliez pas que c'est une entreprise derrière. Mais sinon j'utilise les deux au quotidien et pas de soucis particuliers.

+0 -0

Cela dit, il va falloir que je réfléchisse sérieusement à la question parce que là je ne sais même pas pourquoi on s'oriente vers du NoSQL et ce que ça implique.

SpaceFox

Si ça peut t'aider, le contexte est celui-ci. On s’apprête à stocker pour chacune de nos urls de type contenu (tutoriel, article, chapitre, partie) 5 métriques sur environs 10 dimensions, tous les jours. Nous avons environ 90 tutoriels (à la louche je dirais 200 chapitres et 50 parties), et environ 70 articles publiés. Il y'a de forte chance que chaque contenu possède au moins 2 urls (rien qu'a cause du page=1).

Tout ceci pour dire que dans un modèle relationnel, on écrira un nombre d'enregistrements équivalent dans le meilleur des cas (modélisation 3) à : $ (90 + 200 + 50 + 70) \times 10 \times 2 = 8200 $ et dans le pire des cas (modélisation 1) $ (90 + 200 + 50 + 70) \times 10 \times 5 \times 2 = 41000 $.

En gros, en une semaine d'enregistrement on se retrouve dans la fourchette de [28 700 à 143 500] enregistrements dans la même table. Elle deviendrait donc la table la plus grosse de notre BD actuelle. Je vous laisse imaginer les conséquences dans 6 mois, 1 an, etc.

D'autres part, un modèle relationnelle nous forcerait à supporter des choses dont on a pas besoin (transaction, concurrence, etc.) et qui, une fois qu'on en est débarrassé offre de meilleures performances de lecture.

Voilà en gros pourquoi pour ce besoin il est plus sain de s'orienter vers une base NoSQL. Pour faire le parallèle, avec un moteur de recherche, c'est comme si on utilisait un SGBD pour faire un moteur de recherche. C'est bien possible, les performances ne seront certainement pas au rendez vous.

Ca ne répond qu'à une partie de la question en fait. La question complète c'est :

Qu'implique la ZEP-11 en termes de code et d'infrastructure ?

Déjà on remarque qu'on a 3 types de statistiques sur la page 1. En effet, pour chaque couple (Ressource, Date) (une ressource étant identifiée par une URL canonique) on peut avoir :

  • 1 grandeur : Propositions
    • 1 (total de visites),
    • 2 (temps moyen passé sur la ressource),
    • 6 (temps moyen de chargement),
    • 9 (pourcentage de nouveaux utilisateurs)
  • 2 grandeurs : Propositions
    • 3 (URL d'accès, nombre de visite via cette URL)
    • 4 (lien, nombre de clics)
  • 3 grandeurs : Propositions
    • 5 (Type de plateforme [navigateur / OS /etc], valeur, nombre de visiteurs)
    • 7 (Type de zone [ville / pays / continent], valeur, nombre de visiteurs)
    • 8 (Type d'audience [âge, sexe], valeur, nombre de visiteurs)
    • 10 (Moteur de recherche, mot clef, nombre d'arrivée sur la ressource)

Même si les cas à 3 grandeurs peuvent tous être dénormalisés sur 2 grandeurs assez facilement, le modèle doit pouvoir gérer les 2 premiers cas sans trop de problèmes. Aujourd'hui, je ne suis pas convaincu que les propositions présentées gèrent ça correctement.

Si j'en crois tes calculs préliminaires et les miens qui arrivent au même ordre de grandeur, on parle là de stocker des dizaines de millions de valeurs par an et ce rien que la première année, puisque tous les cas à 2 ou 3 grandeurs vont stocker de plus en plus de données par jour au fil de la progression de ZdS.

Tout ceci a un coût qu'il faut impérativement chiffrer avant la mise en production et si possible avant le début du développement. Là-dedans, il faut prendre en compte :

  • L'occupation disque
  • L'occupation mémoire
  • L'occupation CPU pendant l'enregistrement des données
  • Le temps d'enregistrement des données
  • L'occupation CPU pendant la restitution des données (c'est l'une des faiblesses de NoSQL qui ne profite pas des mathématiques avancées de SQL)

Et ce non seulement avec les données à date d'aujourd'hui comme tu l'as fait, mais aussi avec une projection crédible sur le long terme.

J'insiste pour 2 raisons :

  1. On va bientôt devoir changer de serveur. Si dans 2 mois on doit re-changer parce que la ZEP-11 ne tient pas, ça va être dommage.
  2. On a déjà le problème de la "fonctionnalité qui marche en développement mais qui va casser à moyen terme", avec l'indexation Solr complète toutes les demi-heures.

Tout ceci a un coût qu'il faut impérativement chiffrer avant la mise en production et si possible avant le début du développement.

SpaceFox

Voici une estimation du cout de la ZEP-11 en partant des hypothèses suivantes (je me dis que c'est l'objectif à atteindre dans un an):

  • Nombres de Big tutos: 80 (Soyons optimistes)
    • Nombre de chapitre moyen par partie : 3
    • Nombre de partie moyen par tutoriel : 2
  • Nombre de minitut"os": 300 (Soyons fou aussi)
  • Nombre de moyen tuto : 20 (Merci la ZEP-12)
    • Nombre de chapitre moyen par tutoriel : 4
  • Nombres d'articles : 200

  • Nombre moyen d'urls d'un même contenu (nouvelles urls de la zep 12, urls des pages, etc.) : 4

En partant de là, on se retrouve avec $ ((80 \times (3 + 2 + 1) ) + 300 + ( 20 \times (4 + 1) ) + 200) \times 4 = 4320 $

Ce qui signifie donc environ 4320 urls différentes pour lesquelles il faudra sauvegarder les statistiques tous les jours.

Maintenant, si on considère que l'on travaille en NoSQL avec une représentation sous forme de document. Voici un modèle de document d'exemple correspondant à ce qu'on pourrait stocker.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
{
    "id": 1,
    "id_on_zds": 692,
    "type": "Comment réussir votre entretien d'embauche ?",
    "start_date": "2015-04-01T00:00:00",
    "end_date": "2015-04-01T23:59:59",
    "urls":[
      {
          "url_path": "/tutoriels/692/comment-reussir-votre-entretien-dembauche/",
          "metrics": [
              {
                  "name": "visits",
                  "social": [
                      {
                          "title": "Twitter",
                          "value": 15
                      },
                      {
                          "title": "Facebook",
                          "value": 3
                      },
                      {
                          "title": "GooglePlus",
                          "value": 7
                      }
                  ],
                  "referal": [
                      {
                          "title": "direct",
                          "path": "www.zestedesavoir.com",
                          "value": 18
                      },
                      {
                          "title": "Google search",
                          "path": "www.google.fr",
                          "value": 78
                      },
                      {
                          "title": "Openclassrooms",
                          "path": "openclassrooms.com",
                          "value": 3
                      },
                      {
                          "title": "Journal d'un avocat",
                          "path": "http://www.maitre-eolas.fr/",
                          "value": 7
                      }
                  ],
                  "platform": {
                      "os": [
                          {
                              "title": "Windows",
                              "value": 25
                          },
                          {
                              "title": "Gnu Linux",
                              "value": 3
                          },
                          {
                              "title": "OS X",
                              "value": 45
                          },
                          {
                              "title": "Android",
                              "value": 5
                          },
                          {
                              "title": "iOs",
                              "value": 12
                          }
                      ],
                      "screens": [
                          {
                              "title": "800x600",
                              "value": 52
                          },
                          {
                              "title": "1024x768",
                              "value": 125
                          },
                          {
                              "title": "1280x1024",
                              "value": 8
                          },
                          {
                              "title": "1600x1200",
                              "value": 4
                          }
                      ],
                      "devices": [
                          {
                              "title": "Mobile",
                              "value": 11
                          },
                          {
                              "title": "Tablet",
                              "value": 125
                          },
                          {
                              "title": "Personal Computer",
                              "value": 158
                          }
                      ]
                  },
                  "audience": {
                      "age": [
                          {
                              "title": "< 15",
                              "value": 8
                          },
                          {
                              "title": "15 - 18",
                              "value": 7
                          },
                          {
                              "title": "30 - 57",
                              "value": 38
                          }
                      ],
                      "gender": [
                          {
                              "title": "Male",
                              "value": 1
                          },
                          {
                              "title": "Female",
                              "value": 7
                          },
                          {
                              "title": "Unknow",
                              "value": 8
                          }
                      ]
                  },
                  "geo": {
                      "country": [
                          {
                              "title": "France",
                              "value": 58
                          },
                          {
                              "title": "Germany",
                              "value": 7
                          },
                          {
                              "title": "England",
                              "value": 3
                          }
                      ],
                      "city": [
                          {
                              "title": "Munster",
                              "value": 19
                          },
                          {
                              "title": "Paris",
                              "value": 7
                          },
                          {
                              "title": "Conakry",
                              "value": 78
                          }
                      ]
                  }
              },
              {
                  "name": "unique_visits",
                  "social": [
                      {
                          "title": "Twitter",
                          "value": 15
                      },
                      {
                          "title": "Facebook",
                          "value": 3
                      },
                      {
                          "title": "GooglePlus",
                          "value": 7
                      }
                  ],
                  "referal": [
                      {
                          "title": "direct",
                          "path": "www.zestedesavoir.com",
                          "value": 18
                      },
                      {
                          "title": "Google search",
                          "path": "www.google.fr",
                          "value": 78
                      },
                      {
                          "title": "Openclassrooms",
                          "path": "openclassrooms.com",
                          "value": 3
                      },
                      {
                          "title": "Journal d'un avocat",
                          "path": "http://www.maitre-eolas.fr/",
                          "value": 7
                      }
                  ],
                  "platform": {
                      "os": [
                          {
                              "title": "Windows",
                              "value": 25
                          },
                          {
                              "title": "Gnu Linux",
                              "value": 3
                          },
                          {
                              "title": "OS X",
                              "value": 45
                          },
                          {
                              "title": "Android",
                              "value": 5
                          },
                          {
                              "title": "iOs",
                              "value": 12
                          }
                      ],
                      "screens": [
                          {
                              "title": "800x600",
                              "value": 52
                          },
                          {
                              "title": "1024x768",
                              "value": 125
                          },
                          {
                              "title": "1280x1024",
                              "value": 8
                          },
                          {
                              "title": "1600x1200",
                              "value": 4
                          }
                      ],
                      "devices": [
                          {
                              "title": "Mobile",
                              "value": 11
                          },
                          {
                              "title": "Tablet",
                              "value": 125
                          },
                          {
                              "title": "Personal Computer",
                              "value": 158
                          }
                      ]
                  },
                  "audience": {
                      "age": [
                          {
                              "title": "< 15",
                              "value": 8
                          },
                          {
                              "title": "15 - 18",
                              "value": 7
                          },
                          {
                              "title": "30 - 57",
                              "value": 38
                          }
                      ],
                      "gender": [
                          {
                              "title": "Male",
                              "value": 1
                          },
                          {
                              "title": "Female",
                              "value": 7
                          },
                          {
                              "title": "Unknow",
                              "value": 8
                          }
                      ]
                  },
                  "geo": {
                      "country": [
                          {
                              "title": "France",
                              "value": 58
                          },
                          {
                              "title": "Germany",
                              "value": 7
                          },
                          {
                              "title": "England",
                              "value": 3
                          }
                      ],
                      "city": [
                          {
                              "title": "Munster",
                              "value": 19
                          },
                          {
                              "title": "Paris",
                              "value": 7
                          },
                          {
                              "title": "Conakry",
                              "value": 78
                          }
                      ]
                  }
              },
              {
                  "name": "avg_read_time",
                  "social": [
                      {
                          "title": "Twitter",
                          "value": 15
                      },
                      {
                          "title": "Facebook",
                          "value": 3
                      },
                      {
                          "title": "GooglePlus",
                          "value": 7
                      }
                  ],
                  "referal": [
                      {
                          "title": "direct",
                          "path": "www.zestedesavoir.com",
                          "value": 18
                      },
                      {
                          "title": "Google search",
                          "path": "www.google.fr",
                          "value": 78
                      },
                      {
                          "title": "Openclassrooms",
                          "path": "openclassrooms.com",
                          "value": 3
                      },
                      {
                          "title": "Journal d'un avocat",
                          "path": "http://www.maitre-eolas.fr/",
                          "value": 7
                      }
                  ],
                  "platform": {
                      "os": [
                          {
                              "title": "Windows",
                              "value": 25
                          },
                          {
                              "title": "Gnu Linux",
                              "value": 3
                          },
                          {
                              "title": "OS X",
                              "value": 45
                          },
                          {
                              "title": "Android",
                              "value": 5
                          },
                          {
                              "title": "iOs",
                              "value": 12
                          }
                      ],
                      "screens": [
                          {
                              "title": "800x600",
                              "value": 52
                          },
                          {
                              "title": "1024x768",
                              "value": 125
                          },
                          {
                              "title": "1280x1024",
                              "value": 8
                          },
                          {
                              "title": "1600x1200",
                              "value": 4
                          }
                      ],
                      "devices": [
                          {
                              "title": "Mobile",
                              "value": 11
                          },
                          {
                              "title": "Tablet",
                              "value": 125
                          },
                          {
                              "title": "Personal Computer",
                              "value": 158
                          }
                      ]
                  },
                  "audience": {
                      "age": [
                          {
                              "title": "< 15",
                              "value": 8
                          },
                          {
                              "title": "15 - 18",
                              "value": 7
                          },
                          {
                              "title": "30 - 57",
                              "value": 38
                          }
                      ],
                      "gender": [
                          {
                              "title": "Male",
                              "value": 1
                          },
                          {
                              "title": "Female",
                              "value": 7
                          },
                          {
                              "title": "Unknow",
                              "value": 8
                          }
                      ]
                  },
                  "geo": {
                      "country": [
                          {
                              "title": "France",
                              "value": 58
                          },
                          {
                              "title": "Germany",
                              "value": 7
                          },
                          {
                              "title": "England",
                              "value": 3
                          }
                      ],
                      "city": [
                          {
                              "title": "Munster",
                              "value": 19
                          },
                          {
                              "title": "Paris",
                              "value": 7
                          },
                          {
                              "title": "Conakry",
                              "value": 78
                          }
                      ]
                  }
              },
              {
                  "name": "load_speed",
                  "social": [
                      {
                          "title": "Twitter",
                          "value": 15
                      },
                      {
                          "title": "Facebook",
                          "value": 3
                      },
                      {
                          "title": "GooglePlus",
                          "value": 7
                      }
                  ],
                  "referal": [
                      {
                          "title": "direct",
                          "path": "www.zestedesavoir.com",
                          "value": 18
                      },
                      {
                          "title": "Google search",
                          "path": "www.google.fr",
                          "value": 78
                      },
                      {
                          "title": "Openclassrooms",
                          "path": "openclassrooms.com",
                          "value": 3
                      },
                      {
                          "title": "Journal d'un avocat",
                          "path": "http://www.maitre-eolas.fr/",
                          "value": 7
                      }
                  ],
                  "platform": {
                      "os": [
                          {
                              "title": "Windows",
                              "value": 25
                          },
                          {
                              "title": "Gnu Linux",
                              "value": 3
                          },
                          {
                              "title": "OS X",
                              "value": 45
                          },
                          {
                              "title": "Android",
                              "value": 5
                          },
                          {
                              "title": "iOs",
                              "value": 12
                          }
                      ],
                      "screens": [
                          {
                              "title": "800x600",
                              "value": 52
                          },
                          {
                              "title": "1024x768",
                              "value": 125
                          },
                          {
                              "title": "1280x1024",
                              "value": 8
                          },
                          {
                              "title": "1600x1200",
                              "value": 4
                          }
                      ],
                      "devices": [
                          {
                              "title": "Mobile",
                              "value": 11
                          },
                          {
                              "title": "Tablet",
                              "value": 125
                          },
                          {
                              "title": "Personal Computer",
                              "value": 158
                          }
                      ]
                  },
                  "audience": {
                      "age": [
                          {
                              "title": "< 15",
                              "value": 8
                          },
                          {
                              "title": "15 - 18",
                              "value": 7
                          },
                          {
                              "title": "30 - 57",
                              "value": 38
                          }
                      ],
                      "gender": [
                          {
                              "title": "Male",
                              "value": 1
                          },
                          {
                              "title": "Female",
                              "value": 7
                          },
                          {
                              "title": "Unknow",
                              "value": 8
                          }
                      ]
                  },
                  "geo": {
                      "country": [
                          {
                              "title": "France",
                              "value": 58
                          },
                          {
                              "title": "Germany",
                              "value": 7
                          },
                          {
                              "title": "England",
                              "value": 3
                          }
                      ],
                      "city": [
                          {
                              "title": "Munster",
                              "value": 19
                          },
                          {
                              "title": "Paris",
                              "value": 7
                          },
                          {
                              "title": "Conakry",
                              "value": 78
                          }
                      ]
                  }
              },
              {
                  "name": "new_users",
                  "social": [
                      {
                          "title": "Twitter",
                          "value": 15
                      },
                      {
                          "title": "Facebook",
                          "value": 3
                      },
                      {
                          "title": "GooglePlus",
                          "value": 7
                      }
                  ],
                  "referal": [
                      {
                          "title": "direct",
                          "path": "www.zestedesavoir.com",
                          "value": 18
                      },
                      {
                          "title": "Google search",
                          "path": "www.google.fr",
                          "value": 78
                      },
                      {
                          "title": "Openclassrooms",
                          "path": "openclassrooms.com",
                          "value": 3
                      },
                      {
                          "title": "Journal d'un avocat",
                          "path": "http://www.maitre-eolas.fr/",
                          "value": 7
                      }
                  ],
                  "platform": {
                      "os": [
                          {
                              "title": "Windows",
                              "value": 25
                          },
                          {
                              "title": "Gnu Linux",
                              "value": 3
                          },
                          {
                              "title": "OS X",
                              "value": 45
                          },
                          {
                              "title": "Android",
                              "value": 5
                          },
                          {
                              "title": "iOs",
                              "value": 12
                          }
                      ],
                      "screens": [
                          {
                              "title": "800x600",
                              "value": 52
                          },
                          {
                              "title": "1024x768",
                              "value": 125
                          },
                          {
                              "title": "1280x1024",
                              "value": 8
                          },
                          {
                              "title": "1600x1200",
                              "value": 4
                          }
                      ],
                      "devices": [
                          {
                              "title": "Mobile",
                              "value": 11
                          },
                          {
                              "title": "Tablet",
                              "value": 125
                          },
                          {
                              "title": "Personal Computer",
                              "value": 158
                          }
                      ]
                  },
                  "audience": {
                      "age": [
                          {
                              "title": "< 15",
                              "value": 8
                          },
                          {
                              "title": "15 - 18",
                              "value": 7
                          },
                          {
                              "title": "30 - 57",
                              "value": 38
                          }
                      ],
                      "gender": [
                          {
                              "title": "Male",
                              "value": 1
                          },
                          {
                              "title": "Female",
                              "value": 7
                          },
                          {
                              "title": "Unknow",
                              "value": 8
                          }
                      ]
                  },
                  "geo": {
                      "country": [
                          {
                              "title": "France",
                              "value": 58
                          },
                          {
                              "title": "Germany",
                              "value": 7
                          },
                          {
                              "title": "England",
                              "value": 3
                          }
                      ],
                      "city": [
                          {
                              "title": "Munster",
                              "value": 19
                          },
                          {
                              "title": "Paris",
                              "value": 7
                          },
                          {
                              "title": "Conakry",
                              "value": 78
                          }
                      ]
                  }
              }
          ]
      }
  ]
}

L'occupation disque

En injectant la collections précédente (le json) dans une base MongoDB, il en ressort que l'espace disque utilisé pour stocker une url d'un contenu est de 264 Ko.

Si on reprend donc notre chiffre d'estimation plus haut, on en arrive à une consommation en espace disque estimé à : $ 264 \times 4320 = 1140480 $

C'est à dire environ 1.08 Go de données à stocker par jour. Et donc pour stocker ça sur un an, on aurait besoin de 400 Go d'espace disque.

NB : Il est important de préciser que si on décide de ne pas considérer dans nos stats ni chapitres ni parties, on réduit la consommation de moitié, c'est à dire à 500 Mo par jour.

L'occupation Mémoire

Les systèmes NoSQL ont la particularité de consommer beaucoup de RAM quand il y'en a de disponible. Plus il y'a de RAM, plus le système pourra remonter les données rapidement. Cependant je n'ai pas d'information plus précise quant à la consommation de RAM dans notre cas.

L'occupation CPU pendant l'enregistrement des données

Comme pour n'importe quel batch de chargement le proco risque de prendre tout de qui est possible (en laissant un peu pour le reste des processus quand meme). Mais on peut très bien programmer ce chargement à des heures de faibles frequentation, ça ne devrait poser aucun souci.

Le temps d'enregistrement des données

Le json que j'ai présenté ci-dessus correspond à une collection de documents. Et dans notre cas présent nous en sommes à 155 documents. Le défi à relever est donc de pouvoir insérer $ 155 \times 4320 = 669600 $ documents. Si on se réfère en certains benchmarck de mongodb 3 (avec MMAPv1), avec un serveur, on a environ 10000 documents insérés par seconde.

ce qui signifie que charger tout ceci en base nous prendrait entre 1 à 3 minutes. Tout dépendra des I/O (HDD ? SSD ? ) de notre disque aussi.

L'occupation CPU pendant la restitution des données

Etant donné que chaque requete doit passer par l'API, c'est cette dernière qui va faire le tampon d'une part avec son système de pagination et d'autre part avec son système de cache à base d'eTag et cie. Les requetes seront finalement assez simple car les données qu'on stocke sont pour la plupart des données déjà caculées, donc je ne me fais aucun souci (bien au contraire) pour le CPU.

Conclusion

Si on veut réellement des statistiques telles que demandées dans la ZEP-11 pour notre contenu, il faudra prévoir au moins 400Go par an d'espace disque dédié aux stats. Si on a pas les sous pour ce faire il va falloir choisir entre les deux solutions suivantes :

  • revoir notre besoin à la baisse (moins de métriques ?, uniquement sur les tutos ?)
  • souscrire à Google Analytics premium (qui vaut 125K€/an à titre indicatif)

PS: Quoiqu'il en soit, je pense qu'il faudrait un serveur entièrement dédié au stockage de ces informations.

Voilà, j'espère ne pas a voir été trop long ^^ , mais je pense que ça répond a la question.

Merci beaucoup pour ces précisions. On y voit en particulier que l'objectif en termes d'occupation d'espace disque est totalement irréaliste, y compris dans l'hypothèse ci-dessous :

NB : Il est important de préciser que si on décide de ne pas considérer dans nos stats ni chapitres ni parties, on réduit la consommation de moitié, c'est à dire à 500 Mo par jour.

Pour comparaison, la première étude des plate-formes d'hébergement qui correspondent à notre budget se trouve ici ; on parle plutôt d'une centaine de Go pour toute l'application (Système + code + dépendances + bases de données + tutos - images et dépôts + logs).

Je crains qu'on ait donc pas d'autre choix que de trancher largement dans les statistiques proposées aux auteurs et aux membres.

PS :

PS: Quoiqu'il en soit, je pense qu'il faudrait un serveur entièrement dédié au stockage de ces informations.

Avec le budget actuel, c'est impossible, sauf peut-être ce genre d'offre qui reste très particulier (le processeur est une sous-merde par contre, pour ceux qui y ont accès c'est lui ça qui sert le Munin de ZdS… ça vous donne une idée du temps de génération des graphes).

Il est vrai qu'on pourrait imaginer un compactage par semaine/mois a intervalle régulier. On garderait la meme structure sauf que la période serait plus longue avec le stockage d'une liste au lieu de valeurs individuel, dans un premier temps. Ensuite sur une plus longue période, a ton réellement besoin de la précision a la journée ?

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
{
    "id": 1,
    "id_on_zds": 692,
    "type": "Comment réussir votre entretien d'embauche ?",
    "start_date": "2015-04-01T00:00:00",
    "end_date": "2015-04-01T23:59:59",
    "urls":[
        {
            "url_path": "/tutoriels/692/comment-reussir-votre-entretien-dembauche/",
            "metrics": [
                {
                    "name": "visits",
                    "social": [
                        {
                            "title": "Twitter",
                            "value": 15
                        },
                        {
                            "title": "Facebook",
                            "value": 3
                        },
                        {
                            "title": "GooglePlus",
                            "value": 7
                        }
                    ],
                    "referal": [
                        {
                            "title": "direct",
                            "path": "www.zestedesavoir.com",
                            "value": 18
                        },
                        {
                            "title": "Google search",
                            "path": "www.google.fr",
                            "value": 78
                        },
                        {
                            "title": "Openclassrooms",
                            "path": "openclassrooms.com",
                            "value": 3
                        },
                        {
                            "title": "Journal d'un avocat",
                            "path": "http://www.maitre-eolas.fr/",
                            "value": 7
                        }
                    ],
                    "platform": {
                        "os": [
                            {
                                "title": "Windows",
                                "value": 25
                            },
                            {
                                "title": "Gnu Linux",
                                "value": 3
                            },
                            {
                                "title": "OS X",
                                "value": 45
                            },
                            {
                                "title": "Android",
                                "value": 5
                            },
                            {
                                "title": "iOs",
                                "value": 12
                            }
                        ],
                        "screens": [
                            {
                                "title": "800x600",
                                "value": 52
                            },
                            {
                                "title": "1024x768",
                                "value": 125
                            },
                            {
                                "title": "1280x1024",
                                "value": 8
                            },
                            {
                                "title": "1600x1200",
                                "value": 4
                            }
                        ],
                        "devices": [
                            {
                                "title": "Mobile",
                                "value": 11
                            },
                            {
                                "title": "Tablet",
                                "value": 125
                            },
                            {
                                "title": "Personal Computer",
                                "value": 158
                            }
                        ]
                    },
                    "audience": {
                        "age": [
                            {
                                "title": "< 15",
                                "value": 8
                            },
                            {
                                "title": "15 - 18",
                                "value": 7
                            },
                            {
                                "title": "30 - 57",
                                "value": 38
                            }
                        ],
                        "gender": [
                            {
                                "title": "Male",
                                "value": 1
                            },
                            {
                                "title": "Female",
                                "value": 7
                            },
                            {
                                "title": "Unknow",
                                "value": 8
                            }
                        ]
                    },
                    "geo": {
                        "country": [
                            {
                                "title": "France",
                                "value": 58
                            },
                            {
                                "title": "Germany",
                                "value": 7
                            },
                            {
                                "title": "England",
                                "value": 3
                            }
                        ],
                        "city": [
                            {
                                "title": "Munster",
                                "value": 19
                            },
                            {
                                "title": "Paris",
                                "value": 7
                            },
                            {
                                "title": "Conakry",
                                "value": 78
                            }
                        ]
                    }
                },
                {
                    "name": "unique_visits",
                    "social": [
                        {
                            "title": "Twitter",
                            "value": 15
                        },
                        {
                            "title": "Facebook",
                            "value": 3
                        },
                        {
                            "title": "GooglePlus",
                            "value": 7
                        }
                    ],
                    "referal": [
                        {
                            "title": "direct",
                            "path": "www.zestedesavoir.com",
                            "value": 18
                        },
                        {
                            "title": "Google search",
                            "path": "www.google.fr",
                            "value": 78
                        },
                        {
                            "title": "Openclassrooms",
                            "path": "openclassrooms.com",
                            "value": 3
                        },
                        {
                            "title": "Journal d'un avocat",
                            "path": "http://www.maitre-eolas.fr/",
                            "value": 7
                        }
                    ],
                    "platform": {
                        "os": [
                            {
                                "title": "Windows",
                                "value": 25
                            },
                            {
                                "title": "Gnu Linux",
                                "value": 3
                            },
                            {
                                "title": "OS X",
                                "value": 45
                            },
                            {
                                "title": "Android",
                                "value": 5
                            },
                            {
                                "title": "iOs",
                                "value": 12
                            }
                        ],
                        "screens": [
                            {
                                "title": "800x600",
                                "value": 52
                            },
                            {
                                "title": "1024x768",
                                "value": 125
                            },
                            {
                                "title": "1280x1024",
                                "value": 8
                            },
                            {
                                "title": "1600x1200",
                                "value": 4
                            }
                        ],
                        "devices": [
                            {
                                "title": "Mobile",
                                "value": 11
                            },
                            {
                                "title": "Tablet",
                                "value": 125
                            },
                            {
                                "title": "Personal Computer",
                                "value": 158
                            }
                        ]
                    },
                    "audience": {
                        "age": [
                            {
                                "title": "< 15",
                                "value": 8
                            },
                            {
                                "title": "15 - 18",
                                "value": 7
                            },
                            {
                                "title": "30 - 57",
                                "value": 38
                            }
                        ],
                        "gender": [
                            {
                                "title": "Male",
                                "value": 1
                            },
                            {
                                "title": "Female",
                                "value": 7
                            },
                            {
                                "title": "Unknow",
                                "value": 8
                            }
                        ]
                    },
                    "geo": {
                        "country": [
                            {
                                "title": "France",
                                "value": 58
                            },
                            {
                                "title": "Germany",
                                "value": 7
                            },
                            {
                                "title": "England",
                                "value": 3
                            }
                        ],
                        "city": [
                            {
                                "title": "Munster",
                                "value": 19
                            },
                            {
                                "title": "Paris",
                                "value": 7
                            },
                            {
                                "title": "Conakry",
                                "value": 78
                            }
                        ]
                    }
                },
                {
                    "name": "avg_read_time",
                    "social": [
                        {
                            "title": "Twitter",
                            "value": 15
                        },
                        {
                            "title": "Facebook",
                            "value": 3
                        },
                        {
                            "title": "GooglePlus",
                            "value": 7
                        }
                    ],
                    "referal": [
                        {
                            "title": "direct",
                            "path": "www.zestedesavoir.com",
                            "value": 18
                        },
                        {
                            "title": "Google search",
                            "path": "www.google.fr",
                            "value": 78
                        },
                        {
                            "title": "Openclassrooms",
                            "path": "openclassrooms.com",
                            "value": 3
                        },
                        {
                            "title": "Journal d'un avocat",
                            "path": "http://www.maitre-eolas.fr/",
                            "value": 7
                        }
                    ],
                    "platform": {
                        "os": [
                            {
                                "title": "Windows",
                                "value": 25
                            },
                            {
                                "title": "Gnu Linux",
                                "value": 3
                            },
                            {
                                "title": "OS X",
                                "value": 45
                            },
                            {
                                "title": "Android",
                                "value": 5
                            },
                            {
                                "title": "iOs",
                                "value": 12
                            }
                        ],
                        "screens": [
                            {
                                "title": "800x600",
                                "value": 52
                            },
                            {
                                "title": "1024x768",
                                "value": 125
                            },
                            {
                                "title": "1280x1024",
                                "value": 8
                            },
                            {
                                "title": "1600x1200",
                                "value": 4
                            }
                        ],
                        "devices": [
                            {
                                "title": "Mobile",
                                "value": 11
                            },
                            {
                                "title": "Tablet",
                                "value": 125
                            },
                            {
                                "title": "Personal Computer",
                                "value": 158
                            }
                        ]
                    },
                    "audience": {
                        "age": [
                            {
                                "title": "< 15",
                                "value": 8
                            },
                            {
                                "title": "15 - 18",
                                "value": 7
                            },
                            {
                                "title": "30 - 57",
                                "value": 38
                            }
                        ],
                        "gender": [
                            {
                                "title": "Male",
                                "value": 1
                            },
                            {
                                "title": "Female",
                                "value": 7
                            },
                            {
                                "title": "Unknow",
                                "value": 8
                            }
                        ]
                    },
                    "geo": {
                        "country": [
                            {
                                "title": "France",
                                "value": 58
                            },
                            {
                                "title": "Germany",
                                "value": 7
                            },
                            {
                                "title": "England",
                                "value": 3
                            }
                        ],
                        "city": [
                            {
                                "title": "Munster",
                                "value": 19
                            },
                            {
                                "title": "Paris",
                                "value": 7
                            },
                            {
                                "title": "Conakry",
                                "value": 78
                            }
                        ]
                    }
                },
                {
                    "name": "load_speed",
                    "social": [
                        {
                            "title": "Twitter",
                            "value": 15
                        },
                        {
                            "title": "Facebook",
                            "value": 3
                        },
                        {
                            "title": "GooglePlus",
                            "value": 7
                        }
                    ],
                    "referal": [
                        {
                            "title": "direct",
                            "path": "www.zestedesavoir.com",
                            "value": 18
                        },
                        {
                            "title": "Google search",
                            "path": "www.google.fr",
                            "value": 78
                        },
                        {
                            "title": "Openclassrooms",
                            "path": "openclassrooms.com",
                            "value": 3
                        },
                        {
                            "title": "Journal d'un avocat",
                            "path": "http://www.maitre-eolas.fr/",
                            "value": 7
                        }
                    ],
                    "platform": {
                        "os": [
                            {
                                "title": "Windows",
                                "value": 25
                            },
                            {
                                "title": "Gnu Linux",
                                "value": 3
                            },
                            {
                                "title": "OS X",
                                "value": 45
                            },
                            {
                                "title": "Android",
                                "value": 5
                            },
                            {
                                "title": "iOs",
                                "value": 12
                            }
                        ],
                        "screens": [
                            {
                                "title": "800x600",
                                "value": 52
                            },
                            {
                                "title": "1024x768",
                                "value": 125
                            },
                            {
                                "title": "1280x1024",
                                "value": 8
                            },
                            {
                                "title": "1600x1200",
                                "value": 4
                            }
                        ],
                        "devices": [
                            {
                                "title": "Mobile",
                                "value": 11
                            },
                            {
                                "title": "Tablet",
                                "value": 125
                            },
                            {
                                "title": "Personal Computer",
                                "value": 158
                            }
                        ]
                    },
                    "audience": {
                        "age": [
                            {
                                "title": "< 15",
                                "value": 8
                            },
                            {
                                "title": "15 - 18",
                                "value": 7
                            },
                            {
                                "title": "30 - 57",
                                "value": 38
                            }
                        ],
                        "gender": [
                            {
                                "title": "Male",
                                "value": 1
                            },
                            {
                                "title": "Female",
                                "value": 7
                            },
                            {
                                "title": "Unknow",
                                "value": 8
                            }
                        ]
                    },
                    "geo": {
                        "country": [
                            {
                                "title": "France",
                                "value": 58
                            },
                            {
                                "title": "Germany",
                                "value": 7
                            },
                            {
                                "title": "England",
                                "value": 3
                            }
                        ],
                        "city": [
                            {
                                "title": "Munster",
                                "value": 19
                            },
                            {
                                "title": "Paris",
                                "value": 7
                            },
                            {
                                "title": "Conakry",
                                "value": 78
                            }
                        ]
                    }
                },
                {
                    "name": "new_users",
                    "social": [
                        {
                            "title": "Twitter",
                            "value": 15
                        },
                        {
                            "title": "Facebook",
                            "value": 3
                        },
                        {
                            "title": "GooglePlus",
                            "value": 7
                        }
                    ],
                    "referal": [
                        {
                            "title": "direct",
                            "path": "www.zestedesavoir.com",
                            "value": 18
                        },
                        {
                            "title": "Google search",
                            "path": "www.google.fr",
                            "value": 78
                        },
                        {
                            "title": "Openclassrooms",
                            "path": "openclassrooms.com",
                            "value": 3
                        },
                        {
                            "title": "Journal d'un avocat",
                            "path": "http://www.maitre-eolas.fr/",
                            "value": 7
                        }
                    ],
                    "platform": {
                        "os": [
                            {
                                "title": "Windows",
                                "value": 25
                            },
                            {
                                "title": "Gnu Linux",
                                "value": 3
                            },
                            {
                                "title": "OS X",
                                "value": 45
                            },
                            {
                                "title": "Android",
                                "value": 5
                            },
                            {
                                "title": "iOs",
                                "value": 12
                            }
                        ],
                        "screens": [
                            {
                                "title": "800x600",
                                "value": 52
                            },
                            {
                                "title": "1024x768",
                                "value": 125
                            },
                            {
                                "title": "1280x1024",
                                "value": 8
                            },
                            {
                                "title": "1600x1200",
                                "value": 4
                            }
                        ],
                        "devices": [
                            {
                                "title": "Mobile",
                                "value": 11
                            },
                            {
                                "title": "Tablet",
                                "value": 125
                            },
                            {
                                "title": "Personal Computer",
                                "value": 158
                            }
                        ]
                    },
                    "audience": {
                        "age": [
                            {
                                "title": "< 15",
                                "value": 8
                            },
                            {
                                "title": "15 - 18",
                                "value": 7
                            },
                            {
                                "title": "30 - 57",
                                "value": 38
                            }
                        ],
                        "gender": [
                            {
                                "title": "Male",
                                "value": 1
                            },
                            {
                                "title": "Female",
                                "value": 7
                            },
                            {
                                "title": "Unknow",
                                "value": 8
                            }
                        ]
                    },
                    "geo": {
                        "country": [
                            {
                                "title": "France",
                                "value": 58
                            },
                            {
                                "title": "Germany",
                                "value": 7
                            },
                            {
                                "title": "England",
                                "value": 3
                            }
                        ],
                        "city": [
                            {
                                "title": "Munster",
                                "value": 19
                            },
                            {
                                "title": "Paris",
                                "value": 7
                            },
                            {
                                "title": "Conakry",
                                "value": 78
                            }
                        ]
                    }
                }
            ]
        }
    ]
}

Y'a un truc qui me chagrine avec ça, c'est qu'il serait manifestement possible de gagner pas mal de place en évitant de stocker des infos inutiles. Quelques exemples.

  • Pourquoi stocker le nom entier des pays alors qu'on peut utiliser leur code ISO 3166-1 à deux lettres ?
  • De même, sachant qu'il y a un nombre limité de plate-formes, de tailles d'écran, et d'OS, pourquoi mettre leur nom en entier et pas sous forme d'un code ?
  • L'information géographique « ville » est-elle pertinente et nécessaire ?
  • Le referer prend énormément de place, et ne nombre de referers susceptibles d'atterrir sur ZdS n'est pas infini : avec une BDD relationnelle, on pourrait stocker une seule fois le nom complet du referer et ne stocker dans la table de stats que son identifiant.
  • Pourquoi stocker à la fois la métrique « visites » et « visites uniques » ? La première ne me paraît absolument pas pertinente…
  • De manière générale, le texte d'exemple que tu as donné pèse 27701 octets1. Avec une compression XZ, il n'en pèse plus que 904, soit 3 % de la taille d'origine. C'est le signe qu'il y a énormément de répétitions et qu'il doit être possible de le stocker sous une forme plus compacte.

  1. Tu es sûr que tu n'as pas oublié une virgule quand tu dis que MongoDB a besoin de 264 ko pour stocker ce JSON ? Parce que le rapport de 1 à 10 me met la puce à l'oreille… 

+0 -0

En fait il serait pas ettonant qu'un collection ai une taille de la forme a+N*b où N est le nombre d'entrée. Avec une estimation utilisant une seule valeur, tu sur evalue beaucoup. Il faudrait faire un essai plus réaliste avec des données tirées au hasard sur une longue période, ce serait plus précis.

+0 -0

Je suis assez surpris par nos estimations de taille disque requise. La plupart des outils de stats du marché que j'ai eu l'occasion de toucher génèrent tout au plus une dizaine de Go de données par an, sur des serveurs pourtant très visités. Et une palanquée de métriques est dispo. C'est le NoSQL qui contraint à des tailles aussi grandes ?

+0 -0

J'ai fait quelques essais, ça vaut ce que ça vaut.

À supposer que nous stockions non pas les données calculées sur une journée mais bien l'ensemble des visites reçues avec les infos adéquates, on pourrait calculer toutes les infos qui intéressent la communauté à partir des données suivantes (sauf le point 9, j'ignore comment une telle info peut être obtenue).

  • Identifiant de la visite : stockée dans un BIGINT (8 octets) pour nous permettre de voir venir jusqu'à environ 19 milliards de milliards de visites.
  • Date et heure d'arrivée sur la page, et date et heure de départ de la page : deux TIMESTAMP de 4 octets chacun.
  • Temps de chargement de la page : on peut le stocker en secondes dans un TINYINT. En effet, 255 secondes, ça fait 4 minutes 15, ce qui est largement plus que quoi que ce soit d'acceptable.
  • URL dont est arrivé, URL affichée et URL vers laquelle repart : trois identifiants en MEDIUMINT ou INT (3 ou 4 octets), qui renvoient vers une table de toutes les URL différentes.
  • Origine géographique : peut être stockée comme une chaîne de 2 caractères (3 octets) ou un code en SMALLINT (2 octets).
  • Mot-clé qui a permis d'aboutir sur la page : encore un MEDIUMINT (3 octets) qui renvoie vers une table des mots-clés. Cette colonne peut être supprimée si l'URL d'arrivée permet de déterminer cette information.
  • Infos sur le visiteur : on parle ici de son navigateur, son OS, sa taille d'écran, son type de machine, sa fourchette d'âge et son sexe. Comme il y a un nombre limité de valeurs différentes que peut prendre chaque info, en faisant les choses intelligemment, on peut tout faire tenir dans un MEDIUMINT de 3 octets.

Soit au total, entre 31 et 38 octets par visite. Même en prenant le pire scénario, pour stocker les 2 128 590 pages vues entre le lancement et le 4 avril, cette table demande environ 77 Mebioctets.

À cela, il faut rajouter une table des URL et une table des mots-clés. Il est plus difficile d'évaluer la taille que cela prendrait, mais si on part sur une moyenne de 15 caractères par mot-clé et de 100 caractères par URL (ça fait gros : même une URL comme celle-là ne fait que 190 caractères), et qu'on part sur un stockage des ID d'URL en MEDIUMINT (ce qui nous permet d'avoir environ 17 millions d'URL différentes, et 17 millions de mots-clés différents), alors notre table remplie ras la gueule pèserait environ 2 Gibioctets.

Il est possible de réduire drastiquement cette taille (au prix d'un peu d'information et de temps de calcul) au moyen de trois artifices.

  • Pour les URL entrantes, on peut ne stocker que le nom de domaine, et non l'URL complète (comme dans le JSON d'exemple de firm1) : non seulement, ça réduit le nombre d'entrées différentes, mais en plus, ça en réduit la longueur moyenne.
  • Pour les URL sortantes, on peut ne stocker que celles qui correspondent à un lien présent dans le corps du tuto et passer sous silence tous les départs qui n'auraient pas grand chose à voir avec le tuto (j'ai un nouveau message suivi sur le forum, je vais voir la liste des tutos, j'ai terminé un article et je vais lire mes mails, etc.). Je ne suis pas certain que ça fasse beaucoup baisser le nombre d'URL, mais c'est une option.
  • On peut envisager de « compacter les données » au-delà d'un certain temps (6 mois, un an, que sais-je), comme suggéré par Rockaround.

J'ai le sentiment que ma proposition est loin d'être la plus optimisée en temps de calcul pour stocker les données et les restituer à l'utilisateur. Cela étant, elle montre que toutes les données brutes depuis l'ouverture du site peuvent tenir dans 2 Gigas, et que par conséquent, une solution qui demanderait un Giga par jour est nécessairement mal pensée.

+0 -0

@Rockaround : si on compacte les données, autant stocker par semaine directement et même là on en serait a 1Go par semaine,je ne pense pas que ça tienne la route.

@Dominus : le problème c'est que l'API de Google ne nous donne pas le fameux code ISO des pays, ni le code des tailles d'écrans. En fait ce que tu voudrais c'est un stockage des données soi forme relationnelle, c'est possible mais il y'a aussi des inconvénients (que j'avais détaillé dans l'exposition des solutions).

@Coyote : Le problème de volumétrie de stockage vient surtout du fait qu'on utilise des données de Google Analytics qui sont déjà pré-calculées et nous empêchent de fabriquer d'autres métriques. Par exemple on est obligé de stocker les donnees a la fois des visiteurs et des visiteurs uniques alors qu'on peut naturellement imaginer que si on a led informations sources, ça se resume a un calcul.

C'est aussi pour ça que j'avais présente la solution de l'exploitation des logs du serveur. On gagnerait énormément en espace de stockage avec ça car on se contente de stocker la donnée de référence.

Il faut donc trouver une issue a ce problème. Si on a pas les moyens pour stocker 400Go par an, est ce que ça vaut le coup que je fasse une analyse comparative de la solution a base d'analyse de logs ?

EDIT : Dominus a posté entre temps, mais j'envoi quand même car je dois filer

C'est aussi pour ça que j'avais présente la solution de l'exploitation des logs du serveur. On gagnerait énormément en espace de stockage avec ça car on se contente de stocker la donnée de référence.

Ça ne change rien au fait qu'il faille stocker les données extraites des logs quelque part, puisqu'on ne peut pas se permettre ni de stocker les logs à l'infini1 ni de les relire en intégralité dès qu'on a besoin d'une valeur.


  1. Actuellement, ~40 Mo de données brutes / 4 Mo de données gzippées par jour sur nos access log. Sans compter sur l'augmentation du trafic, ça fait près de 15 Go de données à analyser pour avoir les statistiques sur 1 an, et 1.5 Go de données compressées par an à stocker (ça, ça va encore). 

@Dominus : ton dernier raisonnement suppose que GA t'autorise a prendre les informations de chaque visite. Ce qui n'est pas le cas. Du coup –> premium.

SpaceFox : Oui bien sur il faut les stocker dans un SGBD les logs parsées. Et pour 40 Mo de logs brutes je pense qu'on devrait arriver pas loin de 100Mo par jour de stockage dans un SGBD avec l'augmentation de trafic, ce qui est fichtrement mieux que les 1Go par jour quand même

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte