Построение системы уведомлений [закрыто]

Я начинаю создавать систему уведомлений в стиле Facebook для нашей страницы (тип социальных игр), и сейчас я изучаю, как лучше всего спроектировать такую ​​систему. пользователю или что-то в этом роде (пока даже).Я исследую, как построить систему на сервере (как хранить уведомления, где их хранить, как их получать и т. д.)

Итак. .. некоторые требования, которые у нас есть:

  • в часы пик у нас есть около 1000 одновременно зарегистрированных пользователей (и гораздо больше гостей, но здесь они не имеют значения, поскольку у них не будет уведомлений), которые будут генерировать много событий
  • будут разные типы уведомлений (пользователь A добавил вас в друзья, пользователь B прокомментировал ваш профиль, пользователю C понравилось ваше изображение, пользователь D победил вас в игре X, ...)
  • большинство событий будет генерировать 1 уведомление для 1 пользователя (пользователю X понравилось ваше изображение), но будут случаи, когда одно событие будет генерировать много уведомлений (например, день рождения пользователя Y)
  • уведомления должны быть сгруппированы вместе ; если, например, четырем разным пользователям нравится какое-то изображение, владелец этого изображения должен получить одно уведомление о том, что изображение понравилось четырем пользователям, а не четыре отдельных уведомления (точно так же, как это делает FB)

Хорошо, я думал, что я должен создать какую-то очередь, в которой я буду хранить события, когда они происходят. Затем у меня будет фоновое задание (gearman?), которое просматривает эту очередь и генерирует уведомления на основе этих событий. Затем это задание будет хранить уведомления в базе данных для каждого пользователя (поэтому, если событие затрагивает 10 пользователей, будет 10 отдельных уведомлений). Затем, когда пользователь открывал страницу со списком уведомлений, я читал все эти уведомления для него (мы думали ограничить это 100 последними уведомлениями), группировал их вместе и затем, наконец, отображал их.

Вещи, которые меня беспокоят при таком подходе:

  • чертовски сложный :)
  • является ли база данных лучшим хранилищем здесь (мы используем MySQL) или мне следует использовать что-то еще (redis тоже кажется подходящим )
  • что я должен хранить в качестве уведомления? идентификатор пользователя, идентификатор пользователя, который инициировал событие, тип события (чтобы я мог сгруппировать их и отобразить соответствующий текст), но тогда я не знаю, как сохранить фактические данные уведомления (например, URL-адрес и название изображения, которое понравился).Должен ли я просто «испечь» эту информацию при создании уведомления, или я должен сохранить идентификатор затронутой записи (изображение, профиль, ...) и вытащить информацию из БД при отображении уведомления.
  • производительность здесь должна быть в порядке, даже если мне придется обрабатывать 100 уведомлений на лету при отображении страницы уведомлений
  • возможная проблема с производительностью при каждом запросе, потому что мне придется отображать количество непрочитанных уведомлений пользователю (что само по себе может быть проблемой, так как я буду группировать уведомления вместе). Этого можно было бы избежать, если бы я создавал представление уведомлений (там, где они сгруппированы) в фоновом режиме, а не на лету.

Итак, что вы думаете о предложенном мной решении и о моих проблемах? Пожалуйста, прокомментируйте, если вы думаете, что я должен упомянуть что-нибудь еще, что было бы уместно здесь.

О, мы используем PHP для нашей страницы, но я думаю, что это не должно иметь большого значения.

170
задан Yvette Colomb 6 December 2018 в 08:19
поделиться