Les secrets techniques de Reddit : comment les fils de commentaires et le classement "hot"

L'interface familière de Reddit masque deux défis techniques complexes : gérer des fils de commentaires à profondeur arbitraire et classer les publications en temps réel. Ces deux problèmes ont des solutions connues, mais le choix dépend du ratio entre lecture et écriture, ainsi que de la rapidité requise pour les réponses.
Construire des fils de commentaires sans épuiser la base de données
Un fil de commentaires est une arborescence : chaque réponse peut cibler n'importe quel commentaire existant, donc la profondeur est illimitée. Stocker uniquement un parent_id par commentaire est simple, mais charger un fil profond implique une requête en base de données par niveau. Pour une publication avec des milliers de commentaires imbriqués, cela devient rapidement ingérable. Reddit évite ce problème en récupérant tous les commentaires d'une publication en une seule requête et en assemblant l'arborescence en mémoire applicative. Une seule lecture, une construction en mémoire—rapide pour les lecteurs, économique en écritures.
Pour les fils extrêmement profonds, Reddit pourrait utiliser un chemin matérialisé (une chaîne d'ancêtres codée) ou une table de fermeture (enregistrant chaque paire ancêtre-descendant). Les deux accélèrent les lectures de sous-arborescences, mais alourdissent chaque insertion, déplacement ou suppression. Un chemin matérialisé optimise les lectures au prix de la réécriture des chemins lors des déplacements de commentaires, tandis qu'une table de fermeture multiplie les écritures, chaque commentaire générant plusieurs lignes d'ascendance. Le compromis est clair : vitesse de lecture contre coût des écritures.
Classer avec un score à décroissance temporelle
La page d'accueil de Reddit ne se contente pas de compter les votes. Si c'était le cas, la publication la plus votée de tous les temps resterait en tête indéfiniment. Pour concilier qualité et fraîcheur, Reddit utilise un classement "hot" qui combine l'équilibre des votes avec l'ancienneté. L'idée centrale est que le logarithme du score contribue davantage pour les premiers votes et moins pour chaque vote supplémentaire, tandis qu'un terme temporel constant pousse les publications plus anciennes vers le bas. Une publication soumise plus tard bénéficie d'un avantage initial, permettant à des contenus récents de dépasser d'anciens posts sans nécessiter un nombre de votes impossible.
Comme le score dépend de l'heure de soumission et des votes, il peut être précalculé et stocké par publication. Il ne nécessite un recalcul que lors des changements de votes, garantissant une page d'accueil réactive sans recalculs constants.
Pourquoi c'est important
L'approche de Reddit montre comment des modèles simples peuvent évoluer si l'on optimise pour le cas le plus fréquent. Stocker uniquement un parent_id et assembler les arborescences en mémoire maintient les chemins d'écriture rapides et la plupart des lectures économiques. Le classement "hot" avec un score à décroissance temporelle garantit une page d'accueil fraîche sans recalculs lourds. La vraie leçon est de mesurer le ratio lecture/écriture et d'adapter la conception en conséquence : si les lectures dépassent largement les écritures, optimisez le chemin de lecture et acceptez une complexité accrue des écritures si nécessaire. Pour les plateformes où la fraîcheur compte, un score à décroissance temporelle constitue un compromis pragmatique entre précision et performance.
Source : DEV Community. Synthèse éditoriale assistée par IA — TechnoExpress.

