[simpleQueue] Простая очередь сообщений для других компонентов


После подготовки статей решил довести до ума удобный компонент, который изначально был задуман как публичный и создан для нужд АСУ. Удобен, чтобы в каждом из компонентов, где требуется очередь, не реализовывать одно и то же.

Простая очередь сообщений для использования в любых сторонних компонентах.
Очередь сообщений удобно использовать в случаях, когда необходимо в одном потоке добавить сообщение о новом действии, а в другом потоке его выполнить.



Простой пример: отправка писем. В основном процессе добавляется сообщение о новом исходящем письме, а отдельным скриптом осуществляется отправка письма.

Использовать возможно как на уровне объектов, так и на уровне процессоров.

Подключение сервиса

Стандартный вызов:
sq = $this->modx->getService(
    'simplequeue',
    'simpleQueue',
    $this->modx->getOption('simplequeue_core_path', null, $this->modx->getOption('core_path') . 'components/simplequeue/') . 'model/simplequeue/',
    array()
);

Сокращенный вызов:
$sq = $modx->getService('simplequeue');

Чтобы он стал возможен, необходимо однократно выполнить код (можно в Console):
$modx->addExtensionPackage('simplequeue', '[[++core_path]]components/simplequeue/model/');

Объекты

Класс sqMessage
ПолеНазначениеЗаполняется автоматически?
idIDДа
serviceпроизвольное название сервиса, добавившего сообщениеНет
actionпроизвольное название требуемого действияНет
subjectдетали для выполнения действия. Например, ID обрабатываемого объектаНет
createdonвремя создания, заполняется автоматическиДа
createdbyID пользователя, создавшего сообщениеДа
processedФлаг завершенности (bool)Нет
statusСтатус, устанавливаемый сервисомНет
propertiesJSON массив с произвольными даннымиНет


Класс sqLog
ПолеНазначениеЗаполняется автоматически?
idIDДа
message_idID измененного сообщенияДа
user_idID пользователя, изменившего сообщениеДа
timestampШтамп времени измененияДа
operationПроизведенное действиеДа
entryJSON массив с измененными полями и их значениямиНет


Процессоры

В комплекте с компонентом идут процессоры для сообщений:
ПроцессорНазначениеПринимаемые параметры
createСозданиеservice, action, subject, properties
updateОбновлениеid, status, properties
closeЗавершениеid
openОткрытиеid
getПолучениеid
getlistПолучение спискаids


Пример вызова процессора:
$response = $modx->runProcessor(
    'message/update',
    array('id' => 1, 'status' => '5'),
    array('processors_path' => MODX_CORE_PATH . 'components/simplequeue/processors/');
);

При использовании процессоров автоматически создаются записи лога sqLog, фиксирующие состояние сообщений после их сохранения.
27 ноября 2017, 17:35    Воеводский Михаил   G+  
5    319 +17

Комментарии (7)

  1. Василий Столейков 28 ноября 2017, 10:12 # +1
    Очень интересно!
    Я активно использовал очереди Tickets для отправки и всех своих сообщений.
    1. Воеводский Михаил 28 ноября 2017, 10:52 # +1
      Хороший вариант.
    2. Николай Савин 28 ноября 2017, 14:58 # 0
      Однозначно в избранное.
      Спасибо Михаил.
      А как работает выполнение действий из очереди? по крону? или что то вроде постоянного запуска через sleep?
      Как вообще правильнее всего подобные вещи делать?
      1. Воеводский Михаил 28 ноября 2017, 15:03 # 0
        Это уже выходит за пределы данного компонента. Он хранит очередь и отдает сообщения из нее желающим. Если будет необходимость, можно добавить выполнение системных команд с передачей им параметров из сообщений, но это отдельная песня. В любом случае, на текущий момент считаю правильным реализовывать свою логику получения и обработки сообщений из очереди в соответствии с задачей.
        1. Николай Савин 28 ноября 2017, 15:11 # +1
          Хм. Давай разбираться, я пока не очень понимаю.
          Задача — сделать рассылку тысяче клиентов о подходящей им заявке с сайта.
          Я могу напрямую перебрать подходящих пользователей и отправить каждому сообщение через консоль. Это вызовет определенную нагрузку на сервер. Это я понимаю.
          В чем польза очередей?
          Я вместо отправки сообщений тысяче клиентов делаю тысячу записей в таблице очередей.
          А что дальше?
          Настроенный мною скрипт будет вызывать скажем по десять записей в минуту и отправлять письма? Нагрузка явно будет меньше. Я правильно понимаю суть компонента и его пользу? Только хранение очередей в заранее подготовленной таблице и упрощенное добавление\запрос из таблицы очередей?
          1. Василий Столейков 28 ноября 2017, 15:41 # +1
            Расскажу мои впечатления от работы с очередями:
            Например у меня на загруженном сайте при добавлении тикета с формы на фронте форма зависала почти на минуту. А в это время у меня в фоне в плагине просиходило куча действий + отправка различных писем разным людям.
            Но как только я включил системную настройку tickets.mail_queue (ну и настроил крон на его выполнение) — время сохранения тикета сократилось вдвое.
            После этого плагин на сохранение тикета переписал так, чтобы вместо отправки писем в момент публикации, данные письма сохранялись в базу в таблицу tickets_mail_queues — время сократилось до секунды!
            1. Воеводский Михаил 28 ноября 2017, 15:56 # +1
              Абсолютно верно ты все понял и сформулировал суть компонента.
        Вы должны авторизоваться, чтобы оставлять комментарии.