实现消息传递队列的最佳方法


Best way implementing messaging queue

我想在我们的Web项目中实现某种消息队列系统。我只是想知道最好的方法是什么。它是用PHP(Yii框架(编写的,MySQL作为数据库系统。

这个想法:

  • 用户 1 向用户 2 发送消息,但该消息将放在将来 (即 02-11-2013 14:31(
  • 用户
  • 2 在 02-11-2013 14:31 收到来自用户 1 的邮件,并收到有关此新邮件的通知电子邮件。

我想到了两种方法:

  1. 来自用户 1 的消息插入"消息"表中,其中包含消息应传递给用户 2 的日期和时间。仅当此日期和时间小于当前日期和时间 (WHERE addTime <= NOW() ( 时,用户 2 才能读取它。

  2. 来自用户 1 的消息插入到"messageQueue"表中。这是一个包含将来需要放置的所有消息的表。cronjob(每分钟左右运行一次(会将日期和时间小于当前时间的所有消息放入"消息"表中,并将其从"messageQueue"表中删除。电子邮件可以直接发送给用户 2。

缺点:

  1. 方法 1:无法向用户 2 发送通知电子邮件
  2. 方法2:您必须设置一个每分钟运行的cronjob(将来可以以一分钟的精度放置消息(。通知电子邮件可以直接发送,但这将是一个包含大量消息的繁重系统。如果 cronjob 花费的时间超过一分钟,它将相互重叠,这最终可能导致服务器关闭。

有人知道这样做吗?我实际上正在寻找来自服务器/数据库的一些推送函数,它告诉我的脚本将新消息传递给用户 2,并且需要向用户 2 发送电子邮件。

您可以使用 CURL 而不是 CRON,后者会自行请求您的"CRON 作业脚本"。它将在上一个完成后调用。如果脚本将在 1 分钟左右的时间内运行,则可能需要延迟 CURL 请求。

请考虑使用 RabbitMQ 实现 AMQP 模型 (http://www.rabbitmq.com/(。考虑到您已经暴露的应用程序上下文,这可能有点"矫枉过正"。

但是,如果您已经确定此消息传递系统必然需要快速增长,则可能需要查看php-amqplib的文档