帮助我了解消息排队的工作原理

时间:2010-02-12 17:18:30

标签: php message-queue

现在使用PHP已经有一段时间了,我想知道整个“消息队列”到底是什么。我们以facebook为例。我可以更新我的状态但是我必须向所有朋友显示状态更新(假设我有3000个关注者)。如果有评论则需要更多工作,并且必须通过电子邮件通知所有留下评论的朋友。通过我看到的示例,似乎所有消息队列都采用“消息”(我的状态更新)并将其放入一些临时空间(文件系统或数据库表)。然后我有一个cron工作,把它拉出来并更新我的表。

话虽如此,我该如何操纵这些数据呢?我想我对这将如何真正帮助我感到困惑。如何将以下函数转换为消息队列,然后安排函数以后运行?

1 - 更新我的状态 2 - 现在在我的页面和我的所有朋友中发布它。 3 - 如果留下评论,现在将最新评论通过电子邮件发送给“订阅”该评论的人。

我的问题是,我该如何操纵这些数据?我是否只是插入“注释”然后有一个“工作”,将该注释拉出并将其插入到处理它的函数中?

这是我打算研究的一个例子。

http://www.freeopenbook.com/php-hacks/phphks-CHP-5-SECT-18.html

提前致谢。

2 个答案:

答案 0 :(得分:3)

  

我的问题是,我该如何操纵这些数据?我只是插入   “评论”然后有一个“工作”   拉出那个评论并插上   它成为一个处理它的函数?

完全。

在Facebook页面上发布状态更新可能不涉及消息排队 - 我实际上并不知道他们的具体设计,但我猜测更新的数据只是在用户加载页面时通过查询按需提供。 (除非Facebook有一个单独的流程来反规范化状态更新数据。) 1

相比之下,发送状态更新电子邮件通知是消息队列的理想选择。

典型的实现涉及将新消息(通常是最小的,可能只是您的用户ID)写入特定的消息队列 - 可能是“EmailStatusUpdateNotifications”队列。

然后,另一个进程将消息出列并确切知道如何处理它们。专门用于发送状态更新电子邮件消息的过程将使用用户ID(消息内容)来加载您当前的状态以及朋友的电子邮件地址列表,构建电子邮件消息并发送它们。

1 事实证明,您可以在高可扩展性Why are Facebook, Digg, and Twitter so hard to scale?中找到有关Facebook架构的大量有用信息。

答案 1 :(得分:2)

  

我是否只是插入“注释”然后有一个“工作”将该注释拉出来并将其插入到处理它的函数中?

消息队列的一个要点是解耦服务和进行异步处理。

您正在运行消息队列服务,当有人更改其状态时,您会将消息发送到特定队列。您可以从用户确实更改其状态时运行的php代码中执行此操作。

然后,您可以在某处运行服务/后台作业,从该队列中提取消息。它肯定是PHP进程外部基于HTTP调用发送消息的东西。该作业从队列中提取消息,进行消息处理 - 比如确定将邮件发送给谁然后发送邮件。

现在,您可以灵活地处理此类邮件更新。

  • 邮件更新服务很容易在除Web服务器之外的其他计算机上运行。
  • 如果您需要更多电量,则更容易扩展。
  • 您可以更轻松地实施延迟发送 - 例如您可能会在发送邮件时等待一两分钟,如果用户再次更新其状态,则只发送一封邮件,而不是2封
  • 如果您在改变其状态的用户的http请求中完成了所有这些操作,则必须等到所有处理完成。