Я на початку створення системи повідомлень у стилі Facebook для нашої сторінки (тип соціальних ігор), і зараз я досліджую, що було б найкращим способом розробити таку систему. Мене не цікавить, як надсилати сповіщення користувачеві або щось подібне (поки що навіть). Я досліджую, як побудувати систему на сервері (як зберігати сповіщення, де їх зберігати, як їх отримати тощо).
Отже ... деякі вимоги, які ми маємо:
- у пік ми маємо близько 1 тис. одночасних користувачів, які ввійшли (та ще багато гостей, але вони тут не мають значення, оскільки вони не матимуть сповіщень), що призведе до багатьох подій
- будуть різні типи сповіщень (користувач A додав вас як друга, користувач B прокоментував ваш профіль, користуваче C сподобалось ваше зображення, користувач D побив вас у грі X, ...)
- більшість подій генерують 1 сповіщення для 1 користувача (користувачеві X сподобалось ваше зображення), але трапляються випадки, коли одна подія генерує багато сповіщень (наприклад, день народження користувача Y)
- повідомлення повинні бути згруповані разом; якщо, наприклад, чотирьом різним користувачам подобається якесь зображення, власник цього зображення повинен отримати одне повідомлення про те, що чотирма користувачам зображення сподобалось, а не чотири окремих повідомлення (як це робить FB)
Добре, тому я думав, що я повинен створити якусь чергу, де я б зберігав події, коли вони відбудуться. Тоді я мав би фонову роботу ( карусель ?), Який би дивився на цю чергу і генерував сповіщення на основі цих подій. Потім ця робота зберігатиме сповіщення в базі даних для кожного користувача (тому, якщо подія стосується 10 користувачів, буде 10 окремих сповіщень). Тоді, коли користувач відкриє сторінку зі списком сповіщень, я прочитав би всі ці сповіщення для нього (ми думаємо обмежити це до 100 останніх повідомлень) і згрупувати їх разом, а потім нарешті відобразити їх.
Що мене турбує цей підхід:
- складний як чорт :)
- тут найкраща сховище для бази даних (ми використовуємо MySQL) або я повинен використовувати щось інше (redis теж здається непоганим)
- що я повинен зберігати як сповіщення? ідентифікатор користувача, ідентифікатор користувача, який ініціював подію, тип події (щоб я міг їх згрупувати і відобразити відповідний текст), але тоді я начебто не знаю, як зберігати фактичні дані сповіщення (наприклад, URL-адреса та назва зображення, яке сподобалось). Чи потрібно просто "запікати" цю інформацію, коли я генерую повідомлення, або я повинен зберігати ідентифікатор запису (зображення, профілю, ...), який впливає, і витягувати інформацію з БД під час відображення сповіщення.
- продуктивність повинна бути в порядку, навіть якщо мені доведеться обробляти 100 сповіщень під час відображення сторінки сповіщень
- можлива проблема продуктивності для кожного запиту, оскільки мені доведеться відображати кількість непрочитаних повідомлень користувачеві (що може бути проблемою, оскільки я б групував сповіщення разом). Цього можна уникнути, хоча якби я створив перегляд сповіщень (там, де вони згруповані) у фоновому режимі, а не під час руху
Отже, що ви думаєте про моє запропоноване рішення та мої проблеми? Будь ласка, прокоментуйте, якщо ви думаєте, що я повинен зазначити щось інше, що було б актуальним тут.
О, ми використовуємо PHP для своєї сторінки, але це не повинно бути великим фактором тут.