Diseñemos un servicio de redes sociales similar a Twitter. Los usuarios del servicio podrán publicar tweets, seguir a otras personas y favoritos tweets.
- Los usuarios deberían poder publicar nuevos tweets.
- Un usuario debería poder seguir a otros usuarios.
- Los usuarios deberían poder marcar los tweets como favoritos.
- El servicio debe poder crear y mostrar la línea de tiempo de un usuario que consta de los tweets principales de todas las personas que sigue el usuario.
- Los tweets pueden contener fotos y videos.
- Nuestro servicio debe estar altamente disponible.
- La latencia aceptable del sistema es de 200 ms para la generación de línea de tiempo.
- La coherencia puede verse afectada (en aras de la disponibilidad); si un usuario no ve un tweet durante un tiempo, debería estar bien.
- Buscar tweets.
- Responder a un tweet.
- Temas de tendencia: temas / búsquedas de actualidad.
- Etiquetado de otros usuarios.
- Notificación de tweet.
- ¿A quién seguir? Sugerencias
- Momentos.
Supongamos que tenemos mil millones de usuarios totales con 200 millones de usuarios activos diarios (DAU). Supongamos también que tenemos 100 millones de tweets nuevos todos los días y que, en promedio, cada usuario sigue a 200 personas.
Si, en promedio, cada usuario marca cinco tweets por día como favoritos, tendremos:
200 millones de usuarios * 5 favoritos => 1 billón de favoritos
Supongamos que, en promedio, un usuario visita su cronología dos veces al día y visita las páginas de otras cinco personas. En cada página, si un usuario ve 20 tweets, nuestro sistema generará un total de 28.000 millones de vistas de tweets / día:
200M DAU * ((2 + 5) * 20 tweets) => 28B / día
Supongamos que cada tweet tiene 140 caracteres y necesitamos dos bytes para almacenar un carácter sin compresión. Supongamos que necesitamos 30 bytes para almacenar metadatos con cada tweet (como ID, marca de tiempo, ID de usuario, etc.). Almacenamiento total que necesitaríamos:
100 M * (280 + 30) bytes => 30 GB / día
¿Cuáles serían nuestras necesidades de almacenamiento durante cinco años? ¿Cuánto almacenamiento necesitaríamos para los datos de los usuarios, a continuación, favoritos? Dejaremos esto para el ejercicio.
No todos los tweets tendrán medios, supongamos que, en promedio, cada quinto tweet tiene una foto y cada décimo tiene un video. Supongamos también que, en promedio, una foto tiene 200 KB y un video 2 MB. Esto nos llevará a tener 24 TB de nuevos medios todos los días.
(100 millones / 5 fotos * 200 KB) + (100 millones / 10 videos * 2 MB) ~ = 24 TB / día
Estimaciones de ancho de banda Dado que el ingreso total es de 24 TB por día, esto se traduciría en 290 MB / seg.
Recuerde que tenemos 28 mil millones de visitas de tweets por día. Debemos mostrar la foto de cada tweet (si tiene una foto), pero supongamos que los usuarios ven cada tercer video que ven en su línea de tiempo. Entonces, la salida total será:
+ (28B / 5 * 200KB) / 86400s de fotos => 13GB / S
+ (28B / 10/3 * 2 MB) / 86400 s de videos => 22 GB / s
Total ~ = 35 GB / s```