Entretien de conception système : Concevoir Twitter
« Concevoir Twitter » est le problème canonique de génération de fil. Il paraît simple — publier un tweet, lire un fil — mais la partie intéressante est de générer le fil d'accueil de chaque utilisateur à l'échelle, où la bonne réponse est une stratégie de fan-out hybride. Le recruteur veut vous voir découvrir que les deux approches naïves échouent, et raisonner jusqu'au mélange.
Avancez délibérément : clarifiez les exigences, estimez le ratio lecture/écriture, concevez le stockage des tweets, puis le fil — en comparant fan-out-on-write et fan-out-on-read, et en arrivant à l'hybride qui gère le problème des célébrités. Le guide ci-dessous suit ce chemin.
1. Clarifier les exigences
Limitez-vous au problème central du fil. Les utilisateurs publient des tweets, suivent d'autres personnes, et lisent un fil d'accueil qui fusionne les tweets de tous ceux qu'ils suivent, du plus récent au plus ancien.
- Fonctionnel : publier un tweet, suivre/ne plus suivre, fil d'accueil (personnes suivies), fil utilisateur (un auteur) ; recherche basique hors périmètre sauf demande explicite.
- Non fonctionnel : très intensif en lecture, lectures de fil à faible latence, haute disponibilité ; une cohérence éventuelle pour le fil est acceptable.
- À clarifier : médias, réponses/fils de discussion et classement — reconnaissez-les, et délimitez un fil chronologique pour cet entretien.
2. Estimer l'échelle et le ratio lecture/écriture
Le ratio dirige toute la conception. Les lectures dépassent largement les écritures — les utilisateurs font défiler leur fil bien plus souvent qu'ils ne publient. Avec des centaines de millions d'utilisateurs, le système doit rendre les lectures de fil peu coûteuses, même si cela rend les écritures plus coûteuses. Cette seule observation oriente vers le précalcul des fils.
3. Stockage des tweets
Les tweets eux-mêmes sont des données simples, à forte proportion d'ajouts. Stockez-les dans un magasin partitionné horizontalement, avec une clé par ID de tweet (avec un ID triable chronologiquement comme un Snowflake ID, afin que l'ordre soit intégré). Un magasin séparé pour le graphe social conserve les relations abonnés/abonnements.
- Tweets : magasin distribué, partitionné par ID de tweet ; les ID triables chronologiquement donnent un ordre chronologique peu coûteux.
- Graphe social : qui-suit-qui, optimisé pour « obtenir tous les abonnés de X » et « obtenir tous les suivis de X ».
- Un cache (Redis) conserve les données chaudes — tweets récents et fils précalculés.
4. Génération du fil : fan-out à l'écriture vs à la lecture
C'est le cœur du problème. Fan-out-on-write (push) insère chaque nouveau tweet dans la liste de fil précalculée de chaque abonné au moment de la publication — les lectures du fil deviennent une consultation de cache peu coûteuse, mais une publication de quelqu'un avec des millions d'abonnés déclenche des millions d'écritures. Fan-out-on-read (pull) construit le fil au moment de la lecture en fusionnant les tweets récents de tous ceux que vous suivez — écritures peu coûteuses, mais lectures lentes et coûteuses pour les utilisateurs suivant de nombreux comptes.
- Fan-out-on-write : lectures rapides, écritures coûteuses ; idéal pour les utilisateurs normaux.
- Fan-out-on-read : écritures peu coûteuses, lectures coûteuses ; nécessaire pour les comptes avec un nombre énorme d'abonnés.
5. Le problème des célébrités et l'hybride
Aucune approche pure ne gagne, donc combinez-les. Utilisez le fan-out-on-write pour la grande majorité des utilisateurs, mais pour les comptes « célébrités » avec un très grand nombre d'abonnés, NE faites PAS de fan-out de leurs tweets à l'écriture. À la place, au moment de la lecture, fusionnez le fil précalculé d'un abonné avec une récupération en direct des quelques célébrités qu'il suit. Cela limite l'amplification des écritures tout en gardant les lectures rapides — la réponse que les recruteurs attendent.
6. Compromis à verbaliser
Terminez sur les tensions : amplification des écritures contre latence de lecture (toute la décision de fan-out), le coût de stockage des fils précalculés contre leur recalcul, et la cohérence — quelques secondes de délai avant qu'un tweet apparaisse dans les fils des abonnés sont acceptables, donc la cohérence éventuelle vous permet de scaler. Énoncer explicitement le seuil de l'hybride (comment vous classez une « célébrité ») montre un jugement senior.
Entraînez-vous à la conception système de Twitter avec une aide en temps réel
L'assistant d'entretien de conception système de Natively peut vous garder structuré pendant un entretien en direct — en suggérant la prochaine dimension à couvrir et en faisant apparaître les compromis en temps réel, tout sur votre propre appareil.
