Як створити масштабовану систему сповіщень? [зачинено]


32

Мені потрібно написати менеджера системи сповіщень.

Ось мої вимоги:

Мені потрібно мати можливість надсилати Повідомлення на різних платформах, які можуть бути абсолютно різними (для прикладу, мені потрібно мати можливість надсилати або SMS, або електронну пошту).

Іноді сповіщення може бути однаковим для всіх одержувачів для певної платформи, але іноді це може бути повідомлення про одержувачів (або декількох) на кожній платформі.

Кожне сповіщення може містити конкретну платформу (наприклад, MMS може містити звук або зображення).

Система повинна бути масштабованою , мені потрібно мати можливість надсилати дуже велику кількість сповіщень без збоїв ні програми, ні сервера.

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

Потім системі потрібно надіслати повідомлення провайдеру платформи.


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

Я маю з таких об'єктів (псевдомовою):

родовий Notificationоб'єкт:

class Notification {
    String                 $message;
    Payload                $payload;
    Collection<Recipient>  $recipients;
}

Проблема з наступними об'єктами полягає в тому, що якщо я отримую 1.000.000 одержувачів? Навіть якщо Recipientоб’єкт дуже маленький, це займе занадто багато пам’яті.

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

Кожне створене сповіщення може бути збережене в постійному сховищі, як БД або Redis.

Було б добре, щоб це згодом зібрати, щоб переконатися, що воно масштабоване?

На другому кроці мені потрібно обробити це повідомлення.

Але як я міг відрізнити сповіщення від потрібного постачальника платформи?

Чи повинен я використовувати такий об'єкт, як MMSNotificationрозширення abstract Notification? чи щось подібне Notification.setType('MMS')?

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

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

Тоді я уявити собі NotificationProcessorоб'єкт , для якого я міг би я додати NotificationHandlerкожен NotificationHandlerбуде відповідати для підключення постачальника платформи і виконати повідомлення.

Я також можу використовувати, EventManagerщоб дозволити поведінку підключення.

Будь-які відгуки чи ідеї?

Дякуємо, що надали свій час.

Примітка: я звик працювати в PHP, і це, можливо, мова, яку я обрав.


Редагувати (відповідно до відповіді морфунреалу)

  • Скільки повідомлень в секунду ви надсилаєте (Визначте поточний / початковий рівні, визначте максимальний рівень, з яким система повинна працювати, перш ніж переробляти)
  • Які технічні обмеження має система (пам'ять, процесор тощо, доступні системі)
  • Як буде масштабуватися обладнання (тобто додавання більше серверів, хмарних обчислень тощо)

  • Які мови / системи будуть генерувати сповіщення?

Це я самостійно, я відповідаю за те, щоб створювати сповіщення програмно, але побудовано з інтерфейсу користувача.

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

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

  • Чи є ділові правила додавання квитанцій CC / BCC / Read

Так. Зауважте, що це дійсно специфічно для платформи, і читання чи кубічна копія доступні не на всіх платформах.

  • Чи знає генератор тип повідомлення, яке він надсилає (тобто, SMS / електронна пошта) чи це базується на одержувачі

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

  • Чи вимагає генератор підтвердження повідомлень, що надсилаються / приймаються / читаються (асинхронізація та синхронне надсилання)

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

  • Чи існують вимоги щодо зберігання історії джерел / одержувачів повідомлень (як довго?)

Так, ми, швидше за все, хочемо зробити статистику та звітувати. * Визначте кінцеві точки сповіщення


  • Які послуги використовуються для надсилання повідомлень? Залежить, деякі класичні веб-сервіси REST, інші - екзотичний протокол, це справді залежить від постачальника.

  • Які відгуки / підтвердження надаються (синхронізація / асинхронізація)

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

  • Чи можливо додати нові кінцеві точки [навіть якщо так, чи потрібно це навіть абстрагувати]

Так, насправді наш додаток зростає, і ми, ймовірно, хочемо додати нового провайдера, але це співвідношення приблизно такого як 1 або 2 на рік.


22
Walter, gnat, gbjbaanb, Robert Harvey, thorsten müller здаються ледачими людьми; Я не бачу жодної причини, через яку це питання було закрито через один із таких аргументів: "неоднозначне, розпливчасте, неповне, надто широке або риторичне". Питання щодо дизайну не може бути простим питанням, оскільки воно передбачає дуже багато речей, хоча, що рівень цього веб-сайту дозволив обговорити таке складне рішення з реальним професіоналом.
Трент

Задавайте питання, але не задавайте питань! :) Так, іноді я теж не розумію менталітету модників.
Mrchief

Резюме та погляди показують, наскільки це питання актуальне .... якби зрозуміли лише модератори !!!
NoobEditor

Використання RabbitMQ - це правильний підхід до цієї проблеми. Мені було задано дуже подібну проблему в одному з моїх інтерв'ю компанії BIG, і я боровся з найкращим видавцем / підпискою. Наприкінці мені сказали правильну відповідь. КроликMQ. Схоже, вони вирішили проблему, використовуючи її. Сподіваюся, що допомагає !!!
АкД

Відповіді:


16

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

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

  • Скільки повідомлень в секунду ви надсилаєте (Визначте поточний / початковий рівні, визначте максимальний рівень, з яким система повинна працювати, перш ніж переробляти)
  • Які технічні обмеження має система (пам'ять, процесор тощо, доступні системі)
  • Як буде масштабуватися обладнання (тобто додавання більше серверів, хмарних обчислень тощо)

Тепер, коли у вас це не виходить, ви можете встановити кілька тестів щоб гарантувати, що дизайн / архітектура систем може відповідати вашим нефункціональним вимогам.

Що стосується ділових / функціональних вимог щодо надсилання сповіщень / повідомлень, можуть допомогти наступні підказки (якщо ви надасте більше інформації, я можу додати до цієї відповіді):

Визначте джерела сповіщень

  • Які мови / системи будуть генерувати сповіщення
  • Чи знає генератор одержувачів повідомлення (?) Чи надаються вони якимись іншими способами (тобто ділові правила для певних типів попередження діють до певних одержувачів)
  • Чи є ділові правила додавання квитанцій CC / BCC / Read
  • Чи знає генератор тип повідомлення, яке він надсилає (тобто, SMS / електронна пошта) чи це базується на одержувачі
  • Чи вимагає генератор підтвердження повідомлень, що надсилаються / приймаються / читаються (асинхронізація та синхронне надсилання)
  • Чи існують вимоги щодо зберігання історії джерел / одержувачів повідомлень (як довго?)

Визначте кінцеві точки сповіщення

  • Які послуги використовуються для надсилання повідомлень
  • Які відгуки / підтвердження надаються (синхронізація / асинхронізація)
  • Чи можливо додати нові кінцеві точки [навіть якщо так, чи потрібно це навіть абстрагувати]

Я вагаюся надати конкретний приклад архітектури, оскільки це буде сильно залежати від факторів, що беруть участь; але часто найпростіші системи повідомлень включають основну чергу, або в пам'яті / програмі, без SQL, диску або реляційній базі даних. Тоді окремий процес (або кілька окремих процесів, якщо їх розподілено) може запитувати чергу для типів їх повідомлень [тобто завдання cron]; і відправити по мірі необхідності.

Це також може бути покращено за допомогою деяких методів на основі push (наприклад, PostgreSQL NOTIFY / LISTEN), якщо є вимога негайно надсилати повідомлення.

Перевага простої черги полягає в тому, що система, що генерує повідомлення, має мало роботи, і система обробки може бути збалансована на основі вимог до апаратного забезпечення / продуктивності.


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

-2

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

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