Discourse suit le temps de lecture pour chaque publication que les utilisateurs voient à l’écran. Ce système a évolué au fil des ans et je constate souvent que je dois revenir au code pour comprendre comment cela fonctionne et pourquoi il existe.
Ce billet aborde les détails techniques douloureux de l’implémentation actuelle.
Comment le client Discourse suit le temps
Le suivi du temps des publications est implémenté dans screen-track.js.es6. Ce module est responsable du suivi de la durée pendant laquelle une publication est affichée à l’écran et de la durée pendant laquelle le sujet est affiché à l’écran.
Lorsqu’une page de sujet « défile », elle informe le suiveur d’écran des publications qu’elle contient dans la vue ET de celles qui ont été lues. Nous considérons les publications partiellement visibles comme « dans la vue ».
Le suiveur d’écran déclenche ensuite un « tic » chaque seconde pour décider quelles données doivent être envoyées au serveur.
Le suiveur d’écran maintiendra plusieurs listes.
a. Une liste de (publication/temps passé à lire la publication) qui n’a pas encore été envoyée au serveur
b. Une liste des publications que nous savons avoir été lues
c. Une liste des publications que nous savons être actuellement à l’écran
Au début d’un tic (chaque seconde), si nous avons des publications dans (a), nous envisagerons de les envoyer au serveur :
-
Si le paramètre
flush_timing_secsdu site (par défaut 60 secondes) s’est écoulé depuis la dernière fois que nous avons envoyé des données au serveur. -
Si l’une des publications est « non lue » par l’utilisateur, nous enverrons la liste entière immédiatement.
À la fin d’un tic, si Discourse est au premier plan :
Si nous avons des « publications à l’écran », nous enregistrerons « 1 tic » de temps pour chaque publication.
Si à tout moment nous quittons le sujet (nous naviguons vers un autre endroit dans Discourse)
Nous enverrons immédiatement au serveur tout ce qui est « en vol » dans (a).
Limites
-
Chaque fois que vous consultez un sujet, nous enregistrerons un temps de lecture maximum de 6 minutes par publication (cela se réinitialise si vous naviguez hors du sujet et y revenez).
-
Si 3 minutes s’écoulent sans que vous ayez défilé, nous désactivons ce sous-système jusqu’à ce qu’un défilement se produise à nouveau.
-
Nous enregistrerons le temps de lecture pour jusqu’à 5 sujets pour les utilisateurs anonymes (qui est converti lorsque l’utilisateur s’inscrit dans la table
posts_timing).
Observation clé
-
Même si la table
post_timingsenregistre jusqu’à la milliseconde, nous avons entre « 0 et 1000 ms » de temps « non enregistré » par publication, selon le moment où le tic se déclenche. -
Chaque « session » de consultation d’un sujet peut enregistrer jusqu’à 6 minutes de temps de lecture par publication. Il n’y a pas de limite supérieure au temps de lecture par publication ; une publication peut être lue pendant des jours par un utilisateur si celui-ci revient au sujet.
Que faisons-nous de ces données ?
L’élément d’information le plus critique que nous utilisons est « l’utilisateur X a-t-il lu la publication Y », ce qui détermine les comptes de non-lu dans le sujet et de nombreuses autres données critiques.
Sauf pour l’utilisation binaire, nous utilisons le temps enregistré dans post_timings pour calculer avg_time pour une publication.
Le temps moyen pour une publication est calculé comme l’exponentielle de la moyenne du logarithme naturel du temps (c’est-à-dire la moyenne géométrique).
Par exemple :
Publication 1 : sam, 10 secondes
Publication 2 : jane, 1 heure
avg_time = exp((log(3600000) + log(10000)) / 2)
=~ exp((15,09 + 9,2) / 2)
=~ 189094
=~ 189 secondes
Ce avg_time est ensuite utilisé dans le calculateur de score comme un composant pour le « score de publication ».
Score = 5 * nombre de réponses + 15 * score des likes + 5 * nombre de liens entrants + 2 * nombre de signets + 0,05 * avg_time + 0,2 * lectures de la publication.
Ainsi, dans le cas ci-dessus, 189 secondes en moyenne de lecture d’une publication se traduisent par 37 points. Donc… environ 2 likes et un peu plus. Ou 72 lectures.
Le « score de publication » est ensuite utilisé pour les « meilleurs » afin de déterminer quelles sont les meilleures publications dans un sujet.


