【问题标题】:Subscriptions - How to handle large content and subscriptions amount?订阅 - 如何处理大量内容和订阅量?
【发布时间】:2009-08-25 20:50:33
【问题描述】:

我根据每个用户的订阅类型向我的用户发送通知。

例如:

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

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

  1. 获取自上次运行以来发布的新“内容”(cmets、新闻文章等)
  2. 对于每个结果,获取每个订阅“内容”的用户
  3. 为每个用户发送通知

我担心的是,如果我有 1,000 个新“内容”并且我的用户订阅了其中的 50%,我的脚本将需要很长时间才能完成,否则我的服务器会崩溃。

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

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

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    能够处理(并向其发送邮件)批次的用户在架构方面可能很方便,就好像单个进程/服务器的工作量太大,您可以让多个“工作”都在自己的批次上工作。

    也就是说,我不确定您是否担心脚本需要很长时间才能运行或导致服务器崩溃。我认为这是您在代码中解决的问题。分析您正在执行的代码和数据库查询是必须的。

    如果您确实采用批量处理方式,您最终将不得不尝试跟踪您向哪些用户发送了哪些通知。我强烈建议您不要为每个用户内容对保留一个包含一行的表格。如果您只是存储发送给用户的最后一个事件(文章或评论发布时间)的时间,那么很容易计算出您仍然需要发送什么,并且您最终不会得到一个巨大的表格。

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

    【讨论】:

      【解决方案2】:

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

      类似:

      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
      

      希望能帮助您入门。

      【讨论】:

        猜你喜欢
        • 2012-09-07
        • 1970-01-01
        • 2012-06-29
        • 2020-10-11
        • 2018-09-20
        • 2020-10-17
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多