2013-10-08 33 views
1

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

的想法:

  • 用户1发送一个消息给用户2,但消息将被放置在未来(即2013年2月11日14时31分)
  • 用户2接收到该消息从用户1在他/她的收件箱中02-11-2013 14:31收到关于这条新消息的通知邮件。

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

  1. 插入来自用户1的消息与日期和时间的“信息”表中的信息应交付用户2,用户2只能在该日期和时间小于当前日期和时间时才能读取它(WHERE addTime <= NOW())。

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

缺点:

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

有没有人有任何想法做到这一点?实际上,我正在从服务器/数据库寻找一些推送功能,它告诉我的脚本有一条新消息发送给用户2,并且需要将电子邮件发送给用户2.

回答

0

您可以使用CURL而不是自己请求你的“CRON JOB SCRIPT”的CRON。 之前完成后会调用它。如果脚本在1分钟左右运行,您可能需要延迟CURL请求。

+0

的文档你的意思是脚本调用它本身已经完成之后?那么你正在创造一种无限循环。这是一个想法,但听起来好像有很多事情会出错。如果脚本运行两次或脚本以服务器重新启动结束,该怎么办...... – davey

+0

我刚刚给你一个想法:) 仍然正常的CRON工作将是我想这里最好的解决方案。 – Piotr

+0

我知道;)。我们之前使用过它,但必须以微小的精度传递消息。你只能通过让cronjob每分钟运行一次,并可能导致重叠。 – davey

0

请考虑使用RabbitMQ执行AMQP模型(http://www.rabbitmq.com/)。考虑到应用程序的上下文,这可能有点“过度”。

但是,如果你已经知道肯定这个消息系统必然需要快速成长,你可能想看看的php-amqplib

+0

谢谢,看起来有趣!我会看看它,但实际上我认为对于目前为止我所看到的可能有点矫枉过正。 – davey