【问题标题】:Best way implementing messaging queue实现消息队列的最佳方式
【发布时间】:2013-10-08 12:30:01
【问题描述】:

我想在我们的 web 项目中实现某种消息队列系统。我只是想知道这样做的最佳方法是什么。它是用 PHP (Yii Framework) 编写的,以 MySQL 作为数据库系统。

想法:

  • 用户 1 向用户 2 发送消息,但该消息将放置在未来(即 02-11-2013 14:31)
  • 用户 2 在 2013 年 2 月 11 日 14:31 在他/她的收件箱中收到用户 1 的邮件,并收到一封关于此新邮件的通知电子邮件。

我想了两种方法来做到这一点:

  1. 将来自用户 1 的消息插入到“消息”表中,其中包含应将消息传递给用户 2 的日期和时间。用户 2 只能在此日期和时间小于当前日期和时间时阅读它,并且时间(WHERE addTime <= NOW())。

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

缺点:

  1. 方法一:无法向用户2发送通知邮件
  2. 方法 2:您必须设置一个每分钟运行一次的 cronjob(可以在未来放置一条消息,精度为一分钟)。通知邮件可以直接发送,但系统会很重,邮件很多。如果 cronjob 花费的时间超过一分钟,它将相互重叠,最终可能导致服务器关闭。

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

【问题讨论】:

    标签: php mysql sql yii push-notification


    【解决方案1】:

    您可以使用 CURL 代替 CRON,它会自行请求您的“CRON JOB SCRIPT”。 将在上一个完成后调用。如果脚本运行不到 1 分钟左右,您可能想延迟 CURL 请求。

    【讨论】:

    • 你的意思是脚本完成后调用自己?你正在创建某种无限循环。这是一个想法,但听起来很多事情都会出错。如果脚本运行两次或脚本因服务器重新启动而结束怎么办..
    • 我只是给了你一个想法 :) 我猜仍然常规的 CRON 工作将是最好的解决方案。
    • 我知道 ;)。我们以前使用过它,但有必要以微小的精度传递消息。您只能通过让 cronjob 每分钟运行一次来​​做到这一点,结果可能会重叠。
    • 我可以想到两种解决方案:如果消息已发送,则在 DB 标记中添加字段,并在每次交付之前检查。另一个 - 将正在运行的 cron 作业添加到某个文件中,并在脚本结束时将其从文件中删除。您将对已经完成和未完成的内容有更多的控制权。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,看起来很有趣!我会看看它,但事实上我认为这可能有点过分了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2012-06-24
    • 2012-03-04
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多