Система оповіщення соціальних мереж


10

Фон

Я працюю над додатком для клієнта, який включає деякі функції соціальних мереж. Я спочатку розробляв мобільний фронт-енд, але обставини також залишили мене відповідальним за розробку заднього кінця.

Як загальна інформація, наша система дозволяє користувачам слідкувати за іншими користувачами та отримувати сповіщення про тих, за якими вони стежать, як ви очікували від соціальної мережі. Застереження полягає в тому, що лише невеликий підмножина (щонайбільше декількох сотень) користувачів буде відслідковуватися, сподіваючись, що більша частина користувальницької бази буде стежити принаймні за одним із цих осіб.

З боку користувальницького інтерфейсу у нас з’явиться кнопка сповіщення з номером на ній, і натискання кнопки перенесе вас на екран сповіщень.

Проблема

Я досліджував стратегії впровадження сповіщень та більшість ресурсів, які знайшов сенс створити одну або кілька таблиць сповіщень у базі даних. (Приклад, який мені подобається, - це прийнята відповідь тут: /programming/9735578/building-a-notification-system ).

Те, що мене відкидає, - це те, що більшість стратегій сповіщень, керованих базами даних, вимагають вставляти рядок для кожного сповіщення для кожного підписника. Отже, якщо тисяча людей стежить за Саллі, ми вставляємо тисячу рядків у відповідну таблицю. Це масштабується? Що станеться, якщо ми дійдемо до того, що десятки чи сотні тисяч користувачів слідкують за Саллі, і вона робить кілька десятків публікацій на день?

Моя первісна ідея полягала в тому, щоб обробляти все запитами: номер на кнопці сповіщення буде отримано, запитуючи кількість рядків у вмісті, опублікованому нещодавно, ніж останній раз, коли ви відвідували екран сповіщень, тоді як окремі сповіщення створюватимуться з більш детальних запитів. коли ви відвідали екран сповіщення. Цей підхід не вимагає запису чи додаткового зберігання, але він негнучкий і, ймовірно, забиває сервер досить важко.

НАСТРОЙКА

Резервний сервіс (як встановлено попереднім розробником) використовує CodeIgniter та базу даних MySQL . Зараз він працює на шаленому GoDaddy-акаунті хостингу, але я припускаю (сподіваюсь?) Це буде оновлено до того, як ми розпочнемо виробництво, і пакет хостингу буде масштабуватись із ростом користувачів.

Наразі єдиним нашим мобільним додатком є ​​мобільний додаток, але ми також плануємо згодом створити веб-сайт. Наразі я не переймаюся тим, як отримувати оновлення від натиску в реальному часі від сервера про сповіщення.

ДОБАВЛЕННЯ

Я не спеціалізуюсь на мікстурах, і я перебуваю над головою в цьому відділі. Клієнт це знає, і я зробив усе можливе, щоб спробувати пояснити масштаб проекту такого характеру, але вони дали зрозуміти, що в цей момент вони не будуть довіряти нікому іншим, щоб працювати над проектом. Напевно у нас ще ще місяць роботи, перш ніж ми зможемо додавати тестери, і я можу отримати будь-які показники ефективності. Я дійсно не можу оцінити, скільки користувачів у нас може бути або на якому апаратному забезпеченні ми можемо працювати протягом наступних 5 років, але я думаю, що клієнт сподівається на сотні тисяч користувачів або більше.

Я сподіваюся, що це досить специфічна проблема, яку слід розмістити тут; Я можу вдосконалити це, якщо буде потреба. Будь ласка, запитайте, чи є у вас запитання чи я пропустив важливі деталі.

тл; д-р

  • Чи має система управління сповіщеннями, керованими базами даних, негативні наслідки для довгострокової масштабованості, коли всі користувачі лише за деякими кількома сотнями людей?
  • Чи є спосіб зробити сповіщення бази даних сповіщень, не потребуючи окремого рядка повідомлень для кожного сповіщення для кожного підписника?
  • Чи може система сповіщень, орієнтованих на запити, була масштабованою, чи мали б якісь переваги, крім того, щоб не записувати будь-які дані в БД?
  • Невже я занадто рано задумуюся над цим? Чи варто просто побудувати щось, що працює зараз, і ми можемо потурбуватися про його оптимізацію, якщо це стане проблемою, враховуючи, що у клієнта обмежений бюджет, і ми ще не знаємо, чи буде кінцевий продукт популярним?

Чи можете ви закінчити сповіщення? Наприклад, видаліть що-небудь понад 2 тижні. Це повинно більш-менш врівноважувати розмір таблиці, що використовується під час дозрівання сайту.
GrandmasterB

Це не буде проблемою, я більше переймався наслідками для продуктивності запису в базу даних записуючи 50 000 записів у таблицю сповіщень кожного разу, коли популярний користувач робить публікацію.
user45623

Я працював над проектом із подібною (але меншою) системою сповіщень. У мене був фоновий процес, який розглядав чергу нових публікацій та обробляв сповіщення (що в цьому випадку насправді вставляло електронну пошту у другу чергу для надсилання). Це був не реальний час, але він, як правило, справлявся з усім за пару хвилин.
GrandmasterB

Відповіді:


10

Отже, якщо тисяча людей стежить за Саллі, ми вставляємо тисячу рядків у відповідну таблицю. Це масштабується?

Так, за умови правильної індексації таблиць баз даних.

Що станеться, якщо ми дійдемо до того, що десятки чи сотні тисяч користувачів слідкують за Саллі, і вона робить кілька десятків публікацій на день?

Ви будете генерувати кілька десятків чи сотень тисяч записів повідомлень на день для Sally, якщо ви хочете постійно відслідковувати кожне повідомлення. Відсоток користувачів, як Sally з таким трафіком, завжди дуже малий.

Моя первісна ідея полягала в тому, щоб обробляти все запитами: номер на кнопці сповіщення буде отримано, запитуючи кількість рядків у вмісті, опублікованому нещодавно, ніж останній раз, коли ви відвідували екран сповіщень, тоді як окремі сповіщення створюватимуться з більш детальних запитів. коли ви відвідали екран сповіщення.

Це здається зайвим складним. Якщо вам потрібна детальна статистика сповіщень, просто зберігайте сповіщення.

Чи має система управління сповіщеннями, керованими базами даних, негативні наслідки для довгострокової масштабованості, коли всі користувачі лише за деякими кількома сотнями людей?

Ось чому це працює ... невелика кількість людей завжди генерує переважну більшість трафіку.

Чи є спосіб зробити сповіщення бази даних сповіщень, не потребуючи окремого рядка повідомлень для кожного сповіщення для кожного підписника?

Так ... Не зберігайте сповіщення; просто надішліть сповіщення електронною поштою у стилі "забуття та забуття". Або зберігайте сповіщення протягом певного періоду часу, а потім відмініть їх. Або відмовтеся від кожного повідомлення після його прочитання.

Чи може система сповіщень, орієнтованих на запити, була масштабованою, чи мали б якісь переваги, крім того, щоб не записувати будь-які дані в БД?

Я не впевнений, що ти маєш на увазі під цим. Якщо ви хочете запитувати сповіщення, вам потрібно зберегти їх у базі даних. Інакше запитати нічого.

Невже я занадто рано задумуюся над цим?

Порадьтеся з тим, хто може допомогти вам розробити належним чином нормовану, індексовану базу даних з правильними таблицями. Я не бачу причин, за якими така база даних не могла б ефективно обробляти описані вами сценарії.

Приклад із реального життя

Наскільки мені відомо, Stack Exchange зберігає все постійно , включаючи всі сповіщення. Вони використовують технологію баз даних, аналогічну MySql, та деякі технології кешування. Незважаючи на те, що їх обладнання та місця для зберігання є великими, кількість трафіку, який вони отримують, є хорошою проблемою.


Нічого собі, ти все вирішив! Спасибі, Роберте! База даних нормалізується, але я ще не переглянув індексацію. На жаль, я не можу "поговорити з тим, хто може мені допомогти", оскільки умови суворі, що я не можу обговорити конкретні деталі проекту ні з ким, а клієнт дійшов до того, що вони нікому не довірять. але я на проекті ... Ну, я повинен мати можливість провести деякі дослідження щодо індексації. Дякую!
user45623

1
Загальні правила проведення індексації: кожен зовнішній ключ повинен бути індексований можливими дублікатами. Кожен первинний ключ уже має бути проіндексовано. Поля, за якими потрібно буде шукати або застосувати пункт WHERE, слід індексувати; таких повинно бути мало.
Роберт Харві

1
Це неправильно. Це НЕ масштабується. Для кожного "Sally" ви генеруєте N рядків, де N - це ваша кількість користувачів. Це стане проблемою швидко, якщо у вас є будь-яка розумна кількість користувачів. 100 "Sallys", які розміщують 10 разів 10 000 користувачів, - це 10 мільйонів рядків на день - це не здається занадто гарним, так? Що ви насправді хочете зробити, це перевернути це і створити один рядок за публікацією "Sally", і всі користувачі, які слідкують за Sally, захоплюють їх замість власної особистої копії. Звичайно, це спричинить проблеми, якщо вам потрібна логіка (наприклад, агрегація) ...
Ben

1
... пояснення "уникати ряду на пост" тут, очевидно, є солом'яною людиною, оскільки більшість систем вимагатимуть, щоб ці посади трималися. Крім того, ви не уникаєте запитів "тому, що вони складні", ви уникаєте їх, оскільки вони спричинять нестабільні накладні витрати під час масштабування системи.
Бен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.