Подписки - Как обрабатывать большое количество контента и количество подписок? - PullRequest
0 голосов
/ 26 августа 2009

Я отправляю уведомление своим пользователям в зависимости от того, какая подписка у каждого пользователя.

Например:

  • User A подписался на все новостные статьи
  • User B подписался на все комментарии
  • User C подписался на все новое на сайте

У меня есть скрипт, запускаемый каждые 5 минут (если он еще не запущен), который выполняет следующие действия:

  1. Получайте новые «материалы» (комментарии, новостные статьи и т. Д.), Опубликованные после последнего запуска
  2. Для каждого результата извлекайте всех пользователей, которые подписались на «контент»
  3. Для каждого пользователя отправляет уведомление

Что меня беспокоит, так это то, что если у меня есть 1000 новых «материалов», а мои пользователи подписаны на 50% этого, моему сценарию понадобится целая вечность, чтобы завершить работу, или мой сервер выйдет из строя.

То, что я придумываю, состоит в том, чтобы выбрать только 100 новых «материалов» за прогон и уведомить пользователей. У меня все еще есть проблема с количеством пользователей, которые могут на него подписаться.

Чем я думал, я мог бы ограничить количество пользователей, которых я выбираю, до 100, чем повторять, пока не достигну всех пользователей.

Это правильный подход? Есть ли более простой способ сделать это? Как крупные сайты обрабатывают уведомления своих пользователей?

Ответы [ 2 ]

1 голос
/ 26 августа 2009

Возможность обработки (и отправки писем) пакетов пользователей может быть полезна с точки зрения архитектуры, как если бы работа становилась слишком сложной для одного процесса / сервера, и вы могли бы иметь несколько «работ», работающих на свои собственные партии.

Тем не менее, я не уверен, что вы обеспокоены тем, что сценарий требует много времени для запуска или сбоя сервера. Я думаю, что это проблема для вас, чтобы проработать в коде. Профилирование кода и запросов к базе данных, которые вы делаете, просто необходимо.

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

Чтобы повторить, я бы предложил профилировать код и запросы в качестве исследовательской задачи и разработать наиболее эффективный метод для этого маршрута.

0 голосов
/ 26 августа 2009

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

Что-то вроде:

SELECT u.user_email 
FROM user_table AS u
LEFT JOIN subscription_table AS s
ON s.user_id = u.user_id
LEFT JOIN content_table AS c
ON c.content_type = s.content_type
WHERE c.add_time > LAST_RUN_TIME

Надеюсь, вы начнете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...