2013-10-08 6 views
1

Я хочу осуществить какой-то системы очередей сообщений в нашем WebProject. Мне просто интересно, что это лучший способ сделать это. Он написан на PHP (Yii Framework) с MySQL в качестве системы баз данных.Лучший способ реализации очереди сообщений

Идея:

  • Пользователь 1 отправляет сообщение пользователю 2, но сообщение будет помещен в будущем (т.е. 02-11-2013 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 занимает больше минуты, он будет перекрываться друг с другом, что может привести к завершению работы сервера в конечном итоге.

Кто-нибудь есть идея сделать это? Я действительно ищу какую-то функцию push из сервера/базы данных, которая сообщает моему сценарию, что новое сообщение доставляется пользователю 2 и что электронное письмо необходимо отправить пользователю 2.

ответ

0

Вы можете использовать CURL вместо CRON, который сам запросит ваш «CRON JOB SCRIPT». Он будет вызываться после того, как предыдущий закончен. Вы можете захотеть отменить запрос CURL, если скрипт будет работать менее 1 минуты.

+0

Вы имеете в виду сценарий называет себя после того, как она была закончена? Тогда вы создаете какой-то бесконечный цикл. Это идея, но похоже, что многое может пойти не так. Что делать, если скрипт запускается дважды или сценарий оканчивается перезагрузкой сервера .. – davey

+0

Я просто дал вам идею :) Тем не менее регулярная CRON работы будет лучшим решением здесь, я думаю. – Piotr

+0

Я знаю;).Мы использовали его раньше, но необходимо, чтобы сообщения были доставлялись с минимальной точностью. Вы можете сделать это, разрешив cronjob работать каждую минуту, с возможным перекрытием в результате. – davey

0

Пожалуйста, рассмотрите возможность использования RabbitMQ реализующий AMQP модели (http://www.rabbitmq.com/). Это может быть немного «перебор» с учетом контекста приложения, которое вы раскрыли.

Однако, если вы уже знаете наверняка эта система обмена сообщениями обязательно нужно будет быстро расти, вы можете захотеть взглянуть на документацию php-amqplib

+0

Спасибо, выглядит интересно! Я посмотрю на это, но, на самом деле, я думаю, что это может немного пережить то, что я вижу до сих пор. – davey

Смежные вопросы