2013-10-08 65 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