Зміст[Сховати][Показати]
Instagram Feed — це платформа для обміну та спілкування з людьми та речами, які для вас важливі. Коли ви відкриєте Instagram або оновите свою стрічку, фотографії та відео, які, на нашу думку, вас зацікавлять, відображатимуться вгорі.
Стрічка новин — це набір елементів, що містять текст, зображення або відео, створені іншими об’єктами в системі, які призначені для читання. Він постійно змінюється, а інші організації публікують нові публікації.
У цій публікації ми уважно розглянемо дизайн системи стрічки Instagram. Отже, почнемо.
1 Вимоги
Функціональна необхідність
- Стрічка новин користувача створюється з повідомлень від інших організацій у системі, на які користувач підписався чи зацікавлений.
- Текст, зображення та відео можна знайти в публікаціях.
- Стрічка новин користувача має оновлюватися новими повідомленнями, створеними іншими.
Нефункціональний критерій
- Створення стрічки новин має відбуватися в режимі реального часу. Кінцевий користувач повинен відчувати лише 12 секунд затримки.
- Додавання нової публікації: після того, як нова публікація з’явиться у запиті стрічки новин, має пройти не більше 5 секунд.
2. Оцінка потужності
- Станом на березень 2021 року населення світу становить лише 7.8 мільярда людей. Це вказує, що 21% населення світу є Facebook DAU (щоденний активний користувач) і 32% є Facebook MAU (щомісячно активний користувач) (щомісячно активний користувач). Це чудово.
- Уявімо, що система, яку ми створюємо, має 1 мільярд DAU, щоб полегшити роботу.
- Припустимо, що людина підписується на 500 людей або компаній у Facebook. Групу або сторінку можна вважати сутністю.
Приблизний трафік
Припустимо, що один користувач завантажує стрічку новин у середньому 10 разів на день. Таким чином, це приблизно 116 тисяч QPS і 1e10 запитів щодня.
Оцінки зберігання
Припустимо, що ми зберігаємо в пам’яті в середньому 500 дописів зі стрічки новин кожного користувача для швидкого пошуку, і кожна публікація має розмір 1 КБ. Отже, 500 КБ на користувача, 500 ТБ для всіх DAU та 5000 комп’ютерів із 100 ГБ ОЗУ кожен.
3. API для систем
userId (GUID): користувач, чий канал новин отримується.
У необов'язковому параметрі параметрів доступні такі поля:
- afterPostId (GUID): отримати стрічку новин із публікації, наступної за цією. Якщо не вказано, отримайте останні повідомлення.
- count (кількість): максимальна кількість дописів, яку може повернути кожен запит. Бекенд встановлює максимальне число за замовчуванням, якщо жодного не вказано.
- excludeReplies (boolean): запобігає включенню відповідей у стрічку новин.
- Повернений JSON містить список елементів стрічки новин.
4. Проектування бази даних
Суб'єкти
- користувач
- Ідентифікатор сутності, ім’я, опис і мітка часу є обов’язковими для заповнення.
- Необхідні для заповнення наступні поля: PostId, title, text, authorId і timestamp.
- мітка часу, URL-адреса та mediaId
Відносини
- Користувач може стежити за іншими користувачами або юридичними особами. (м:н)
- Автор-допис: як користувачі, так і організації можуть створювати дописи. Припустимо, що лише користувачі можуть створювати дописи заради простоти. (1:n; authorId можна вбудувати).
- Кожен пост супроводжується певною формою медіа. (1:n)
5. Дизайн високого рівня
архітектура
Робочі процеси
Виробництво кормів
Коли Джей запитує свій потік новин, система зробить наступне:
- Отримайте ідентифікатори всіх людей і речей, за якими слідує Джей.
- Зведені дописи: з урахуванням цих ідентифікаторів отримайте найновіші, популярні та релевантні публікації.
- Ранжуйте дописи відповідно до їхньої релевантності та часу.
- Кеш: збережіть створені канали та надішліть Джею 20 найкращих публікацій.
- Коли Джей закінчить читати перші 20 дописів, надсилається ще один запит, щоб отримати наступні 20 дописів.
Роздача кормів
Припустимо, що Джей стежить за Ааюшом і що Ааюш публікує щось нове. Стрічка новин Джея повинна бути оновлена системою:
- Отримайте ідентифікатори послідовників Ааюша.
- Додайте нові статті: додайте публікацію Aayush до пулу новин, які підписалися на ці ідентифікатори.
- Ранжуйте дописи відповідно до їхньої релевантності та часу.
- Оновіть кеш посту про рейтинг.
- Підписники повинні отримувати сповіщення, коли публікуються нові дописи.
компоненти
З'єднання користувачів підтримуються веб-серверами.
Наведені вище процедури виконуються сервером додатків.
Кеш і база даних:
- Користувач/сутність реляційної бази даних
- Реляційна база даних (пост)
- Атрибут зображення/відео: Aayush storge
- Метадані реляційної бази даних
Персоналізовані послуги:
- Виробництво кормів
- Повідомлення про канали
6. Рабочий проект
Утворення кормів
Розширене читання наївне виконання:
Проблеми з цією неохайною реалізацією включають:
- Користувачі з великою кількістю друзів/послідовників помітять значне уповільнення, оскільки ми повинні просіяти, об’єднати та ранжувати велику кількість публікацій.
- Коли користувач завантажує свою сторінку, ми створюємо шкалу часу. Це може бути повільним і мати велику затримку.
- Кожне оновлення статусу призведе до оновлення каналу для всіх читачів для оновлення в реальному часі. Це може спричинити значні затримки в нашій службі генерації новин.
Ми можемо попередньо створити хронологію та зберегти її в пам’яті, щоб підвищити ефективність.
Офлайн-виробництво (записи з розмахом)
Ми можемо мати виділені сервери, які постійно створюють і зберігають стрічки новин користувачів у пам’яті. Ми можемо просто доставити стрічку новин із попередньо згенерованого збереженого місця, коли це забажає користувач.
Скільки елементів каналу має зберігатися в пам’яті користувача?
Адаптуйте на основі вашої поведінки при використанні.
Чи слід створити стрічку новин для всіх користувачів (і зберегти її в пам’яті)?
- Для людей, які не дуже часто входять в систему.
- Кешування на основі LRU є простим підходом.
- Краще рішення - з'ясувати, як користувачі входять в систему. Коли це буде? Про які будні ти говориш?
Публікація стрічки
Fanout – це процес надсилання публікації всім вашим підписникам.
Зчитування (витягування)
Коли ви запитуєте стрічку новин, система отримує запит на читання. Fanout read надсилає запит на читання всім вашим підписникам із проханням прочитати їхній вміст.
Плюси:
- Процедура написання недорога.
- Зчитуючи дані, легше використовувати різні алгоритми агрегації.
Мінуси:
- Для людини з великою кількістю підписників операція читання є досить дорогою.
- Користувачі не побачать свіжі дані, поки не витягнуть їх.
- Коли ми регулярно отримуємо найновіші публікації, важко знайти потрібну частоту, і більшість запитів на витяг повертають порожню відповідь, витрачаючи ресурси.
Написати (натиснути)
Запит на запис надходить до системи, коли ви надсилаєте нове повідомлення. Запит на запис надсилається всім вашим підписникам, щоб вони оновили свою стрічку новин за допомогою fanout write.
Pro
- Процес читання недорогий.
з
- Для користувача з мільйонами підписників запис процедура занадто дорога.
Ранг каналу
Замість того, щоб просто впорядковувати канали в хронологічному порядку, сьогоднішні алгоритми ранжирування додатково намагаються гарантувати, що пункти з більшою релевантністю мають пріоритет.
- Виберіть фактори, які можуть допомогти вам визначити релевантність елемента каналу, наприклад кількість лайків, коментарів та поширення, час останнього оновлення елемента, якщо стаття містить фотографії чи відео тощо.
- Обчисліть бал за характеристиками.
- Використовуйте оцінку, щоб оцінити пости.
Налаштуйте KPI, як-от утримання користувачів, дохід від реклами тощо, щоб побачити, наскільки ефективна наша система рейтингу.
Висновок
Незважаючи на те, що Instagram або його материнська компанія Facebook є величезною корпорацією, вона краще розуміє проектування системи.
Я доклав усіх зусиль, щоб надати вам короткий огляд стрічки Instagram високого рівня.
Сподіваюся, це було корисно, і ви використаєте його з користю.
залишити коментар