Я нахожусь в начале создания системы уведомлений в стиле Facebook для нашей страницы (тип социальной игры), и теперь я изучаю, какой был бы лучший способ для разработки такой системы. Меня не интересует, как нажимать на пользователя уведомления или что-то в этом роде (на данный момент даже). Я изучаю, как создать систему на сервере (как хранить уведомления, где их хранить, как их извлекать и т.д.).
Итак... некоторые требования, которые у нас есть:
- В пиковые времена у нас около 1k одновременно зарегистрированных пользователей (и еще много гостей, но они не имеют значения здесь, поскольку у них не будет уведомлений), которые будут генерировать много событий
- будут разные типы уведомлений (пользователь A добавил вас как друга, пользователь B прокомментировал ваш профиль, пользователю C понравилось ваше изображение, пользователь D избил вас по игре X,...)
- большинство событий будут генерировать 1 уведомление для 1 пользователя (пользователю X понравилось ваше изображение), но будут случаи, когда одно событие будет генерировать множество уведомлений (например, пользователь Y день рождения).
- уведомления должны быть сгруппированы вместе; если, например, четыре разных пользователя, например, какое-либо изображение, владелец этого изображения должен получить одно уведомление о том, что четырем пользователям понравилось изображение, а не четыре отдельных уведомления (как это делает FB).
ОК, так что я думал, что я должен создать какую-то очередь, где я буду хранить события, когда они произойдут. Тогда у меня была бы фоновая работа (gearman?), Которая будет смотреть на эту очередь и генерировать уведомления на основе этих событий. Затем это задание будет хранить уведомления в базе данных для каждого пользователя (поэтому, если событие затрагивает 10 пользователей, будет 10 отдельных уведомлений). Затем, когда пользователь откроет страницу со списком уведомлений, я прочитал бы все эти уведомления для него (мы считаем, что ограничиваем это до 100 последних уведомлений) и группируем их вместе, а затем, наконец, отображаем их.
Вещи, которые меня беспокоят с помощью этого подхода:
- как ад:)
- - это база данных, которая лучше всего хранит здесь (мы используем MySQL), или мне нужно использовать что-то еще (redis тоже кажется хорошим)
- Что я должен хранить как уведомление? идентификатор пользователя, идентификатор пользователя, который инициировал событие, тип события (чтобы я мог их группировать и отображать соответствующий текст), но затем я не знаю, как хранить фактические данные уведомления (например, URL & title изображение, которое понравилось). Должен ли я просто "выпекать" эту информацию при создании уведомления, или я должен хранить идентификатор записи (изображение, профиль,...), а также извлекать информацию из БД при отображении уведомления.
- здесь должно быть ОК, даже если мне нужно обрабатывать 100 уведомлений "на лету" при отображении страницы уведомлений
- возможная проблема с производительностью при каждом запросе, потому что мне нужно будет отображать количество непрочитанных уведомлений для пользователя (что может быть проблемой в своем собственном, так как я собирал группы вместе). Этого можно избежать, хотя если бы я создал вид уведомлений (где они сгруппированы) в фоновом режиме, а не на лету
Итак, что вы думаете о моем предлагаемом решении и моих проблемах? Прошу прокомментировать, если вы думаете, что я должен упомянуть что-нибудь еще, что было бы здесь актуально.
О, мы используем PHP для нашей страницы, но это не должно быть большим фактором здесь, я думаю.