28. ПРОФИЛИ НА САЙТЕ ЗНАКОМСТВ
Спроектируем систему хранения пользователей на сайте знакомств
28
29. Сайт знакомств, профили / #1
1. Пользователь заполняет анкету;
2. Получает логин пароль для доступа к
своему личному кабинету;
3. Пользователи могут смотреть профили
друг друга;
29
30. Сайт знакомств, профили / #2
1. Пользователей 200 миллионов;
2. Каждая анкета занимает 10 килобайт, то
есть всего 2 000 гигабайт;
3. Хитов в день 5 миллиардов;
30
32. Сайт знакомств, профили / #4
1. Данные часто читаются, но редко
меняются;
2. Все анкеты примерно одного размера;
3. У анкеты есть уникальный идентификатор;
4. Нет ярко выраженных лидеров;
32
39. Сайт знакомств, профили /
результат
• Разбиваем весь массив пользователей на
виртуальные шарды;
• Маппим виртуальные шарды на реальные
шарды;
• Внутри каждого шарда реплицируем
информацию для отказоустойчивости
39
42. Новости / #2
• Каждая новость примерно 10 килобайт;
• Мы вечно храним архив с даты основания
СМИ – 2000 год;
• В день публикуется около 10 тысяч различных
региональных и федеральных новостей;
• Итого в год 3 миллиона 500 тысяч новостей, в
год 35 гигабайт, за 20 лет – 700 гигабайт;
• Это крупнейшее СМИ, посещаемость – 10
миллионов человек в сутки;
42
44. Новости / #4
• Количество чтений на несколько порядков
превышает количество записей;
• 99% запросов касаются последнего дня;
• 99,99% запросов касаются последней
недели.
44
51. Новости / результат
• Кеширование для горячих новостей;
• Партиционирование новостей по дате –
последние новости в быстрой таблице;
• Избыточное хранение новостей – новость
пишется сразу и в горячую таблицу и в
архивную, горячая раз в какое-то время
чистится;
51
53. Просмотр френдленты / #1
• У пользователя может быть сколько угодно
друзей;
• Френдленту храним бесконечно долго;
53
54. Просмотр френдленты / #2
• В среднем у пользователя 100 друзей;
• Каждый пользователь в среднем пишет 3
поста в день;
• Каждый пост занимаем около 1 килобайта;
• Пользователей – 10 миллионов в сутки, но
каждый пользователь делает 100 хитов. Итого
– миллиард запросов к френдленте в сутки;
• В сутки генерируется 30 миллионов постов, 10
миллиардов записей в год;
54
55. Просмотр френдленты / #3
• Допустимо, что пользователь увидит запись
своего друга не моментально, а с
небольшой задержкой;
• Допустимо, что порядок записей не будет
строго совпадать с хронологическим;
55
56. Просмотр френдленты / #4
• 99% запросов приходятся на голову
френдленты;
• У нас есть пользователи, которые в друзьях
у миллионов пользователей;
56
58. Просмотр френдленты / #5
Избыточность?
Каждому пользователю свой список записей
в его френдленте? Это же очень много – один
триллион записей за год!
58
59. Просмотр френдленты / #5
Храним для каждого
пользователя ленту
идентификаторов постов!
59
61. Просмотр френдленты / #5
Пользователь и его
посты лежат рядом
Сделайте составной идентификатор поста,
пусть в него входит идентификатор
пользователя
61
62. Просмотр френдленты / #5
Достали список
идентификаторов
постов
Как собрать ленту?
62
64. Просмотр френдленты / #5
Если вы круты, то можете попробовать
Параллельные
вычисления
64
65. Просмотр френдленты / результаты
• Пользователи шардируются, рядом с
пользователями лежат его посты и его френдлента;
• В френдленте пользователя уже записаны
идентификаторы постов его друзей в порядке,
близком к хронологическому;
• В идентификатор поста зашит ID пользователя, по
которому мы быстро определяем шард и забираем
с него текст поста;
• За текстом поста у нас будет ходить JS-машина,
работающая на клиенте.
65
66. Запись френдленты / #5
А как посты попадают
в френдленту?
У нас ведь есть пользователи, которые в
друзьях у миллионов?
66