Мені потрібно написати менеджера системи сповіщень.
Ось мої вимоги:
Мені потрібно мати можливість надсилати Повідомлення на різних платформах, які можуть бути абсолютно різними (для прикладу, мені потрібно мати можливість надсилати або 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 на рік.