订阅 - 如何处理大量内容和订阅金额?

时间:2009-08-25 20:50:34

标签: php mysql

我正在向用户发送通知,具体取决于每个用户的订阅类型。

例如:

  • User A订阅了所有新闻文章
  • User B订阅了所有评论
  • User C订阅了网站上的所有内容

我有一个每5分钟运行一次的脚本(除非脚本仍在运行),他执行以下操作:

  1. 获取自上次运行以来发布的新“内容”(评论,新闻文章等)
  2. 对于每个结果,获取订阅“content”
  3. 的每个用户
  4. 为每位用户发送通知
  5. 我关心的是,如果我有一个新的“新内容”,并且我的用户订阅了50%的内容,我的脚本将永远完成或将使我的服务器崩溃。

    我想到的是每次运行只选择100个新“内容”并通知用户。我仍然有可以订阅它的用户数量的问题。

    比我想象的那样,我可以将我选择的用户数量限制为100,而不是迭代直到我覆盖所有用户。

    这是正确的做法吗?有更简单的方法吗?大型网站如何处理用户通知?

2 个答案:

答案 0 :(得分:1)

能够处理(并发送邮件)批量用户在架构方面可能很方便,好像工作对于单个进程/服务器来说太多了,你可能有多个“工作”都在自己的批处理上工作。

那就是说我不确定你对脚本的担忧需要很长时间才能运行或崩溃服务器。我认为这是您在代码中完成的一个问题。分析代码和您正在进行的数据库查询是必须的。

如果您确实选择了批次路线,则最终必须尝试跟踪您向哪些用户发送的通知。我强烈建议你不要为每个用户内容对保留一行表。如果您只是存储发送给用户的最后一个事件的时间(文章或评论发布时间),那么很容易找出您仍然需要发送它们的内容,而您最终不会得到一个巨大的表格。 / p>

重新迭代我建议将代码和查询分析为研究任务,并通过该路径找出最有效的方法。

答案 1 :(得分:0)

如果不了解数据库的设置方式,很难知道如何回答这个问题。通过正确的设置,应该可以编写单个查询,为您提供需要通知新内容的所有用户。

类似的东西:

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

希望能让你开始。