现在使用PHP已经有一段时间了,我想知道整个“消息队列”到底是什么。我们以facebook为例。我可以更新我的状态但是我必须向所有朋友显示状态更新(假设我有3000个关注者)。如果有评论则需要更多工作,并且必须通过电子邮件通知所有留下评论的朋友。通过我看到的示例,似乎所有消息队列都采用“消息”(我的状态更新)并将其放入一些临时空间(文件系统或数据库表)。然后我有一个cron工作,把它拉出来并更新我的表。
话虽如此,我该如何操纵这些数据呢?我想我对这将如何真正帮助我感到困惑。如何将以下函数转换为消息队列,然后安排函数以后运行?
1 - 更新我的状态 2 - 现在在我的页面和我的所有朋友中发布它。 3 - 如果留下评论,现在将最新评论通过电子邮件发送给“订阅”该评论的人。
我的问题是,我该如何操纵这些数据?我是否只是插入“注释”然后有一个“工作”,将该注释拉出并将其插入到处理它的函数中?
这是我打算研究的一个例子。
http://www.freeopenbook.com/php-hacks/phphks-CHP-5-SECT-18.html
提前致谢。
答案 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调用发送消息的东西。该作业从队列中提取消息,进行消息处理 - 比如确定将邮件发送给谁然后发送邮件。
现在,您可以灵活地处理此类邮件更新。