跟随php的机制:使用什么策略?

时间:2010-09-21 13:49:18

标签: php amazon-sqs

我正在尝试建立类似Twitter的跟随机制。用户采取行动。我们列出了所有用户的关注者,然后用一些信息填充他们的所有流。由于这可能需要一些时间(如果你有10,000个关注者插入信息的10,000个关注者,也许是10,000个SQL调用),我想确保这是在后台完成的,而采取行动的用户可以去与他的生活。

所以,我正在考虑的策略是:

  • 用户采取行动。
  • php脚本打开另一个PHP脚本,它将执行所有工作,可能需要一两秒。
  • 与此同时,采取行动的用户可以继续他们的生活,他们的剧本继续下去并且速度很快。

思考?我也玩过使用队列,比如SQS,但这种方法听起来可能也有用吗?此外,它(对我而言)的优点是更容易在本地测试,更容易在非ec2主机上运行。

如果这是一个很好的方法,我将如何在php脚本中打开php脚本?它可以像(如果php脚本存在于URL中)那样简单地在该脚本所在的URL上进行操作吗?

2 个答案:

答案 0 :(得分:3)

这种描述的方式听起来像是要为跟随该用户的每个人复制/复制第一个用户的帖子?这将成为数据存储的噩梦。

你应该从另一个角度来看待它。考虑以下模型:

用户A发布了他早餐吃的东西。这会在用户ID的表格中存储一次。

用户B查看他的“流”。这是一个动态创建的帖子列表。此时,用户B关注50人。用户B的脚本将获得他最近关注的50个帖子,并在他的“流”中为他显示

使用此模型,每个轻薄的早餐更新,每个用户永远不会有多个帖子。此外,关注者的数量不会扩大发布twit所需的处理时间。我是指推特。

<强>澄清

你只需要进行一些规范化。因此,您将拥有一个users表,一个users_following表和一个posts表。该查询看起来类似于:

SELECT posts.* FROM users_following
         LEFT JOIN posts ON posts.user_id = users_following.followed
         WHERE users_following.follower = $idOfUserB
         ORDER BY posts.created LIMIT 50;

答案 1 :(得分:0)

如果您希望自己的网站可以扩展。

  • 首先,您需要使用消息队列,例如 redis / beanstalkd / gearmand。
  • 其次,您需要使用例如redis / memcached在内存中进行操作。确保您有足够的内存来将活动数据集保留在内存
  

(如果你有10,000名追随者   10,000个流来插入信息   在,即。也许10,000个SQL调用)

10,000次SQL调用失败了鲸鱼。我不会使用MySQL(或至少使用它与memcached)这样的应用程序,但使用redis。将活动数据集保留在内存中。保持数据模型尽可能简单。

  

如果这是一个好方法,那怎么样   我会从内部打开一个PHP脚本吗?   一个PHP脚本?

不要那样做。通过lpush向redis的blocking list添加消息,并通过blpop(守护进程)读取它们。我首先会填充在线用户列表,然后填充离线用户列表。离线用户不介意延迟,因为他们不在线。您可以在该人员的所有用户列表中引用密钥,并通过mget获取所有密钥。

  

可能就像(如果是php)一样简单   脚本生活在一个网址上   那个剧本生活的网址?

再次不要调用URL但使用消息队列。调用url会给你带来不必要的开销。

  

真棒。回到SQL :)这将是   即使你追随500,也要快   人? -

SQL会在高负载下为失败的鲸鱼提供大量时间。至少你需要memcached!但我会改用 redis