За последние 24 часа нас посетил 9061 программист и 458 роботов. Сейчас ищут 107 программистов ...

Одновременное чтение из одной очереди RabbitMQ + php

Тема в разделе "PHP для профи", создана пользователем voron121, 21 сен 2020.

  1. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    25
    Симпатии:
    1
    Доброго времени суток! Вопрос , может быть , не совсем в тему, но более подходящего раздела на форуме не нашел.

    Опишу проблемму.
    Используется RabbitMQ + php-amqplib.
    Есть некий функционал, который создает задачу на выполнение в очереди Q1 . Есть, выражаясь терминами rabbitmq, консьюмер C1, который читает все сообщения из очереди Q1 и для каждого сообщения запускает нужный скрипт.

    Задача: на фронтенде нужно иметь возможность проверить выполненна задача из очереди или еще выполняется или ее вовсе нет для каждого пользователя (клиентский интерфейс, речь не идет об администрировании, просто вывод прелоадера для юзера).

    Предположительное решение: C1 будет получать сообщение из Q1 и, при запуске скрипта, писать в Q2 сообщение с определенным ид и статусом "pending". Если скрипт закончил выполнение С1 запишет в Q2 сообщение со статусом "success". Далее пользователь жмякает на кнопку на фронте, аякс зааускает некий скрипт (фактически C3(консьюмер 3) ), который подключается к Q2 и проверяет что там есть. Если для нужного события есть сообщение с текстом success - удалим его и сообщение с текстом pendig и уведомим юзера. Если есть сообщение только со статусом pendig - уведомим юзера что процесс еще обрабатывается.

    Проблема: фактически мне нужно дать возможность не ограниченному количеству консьюмеров С3 подключаться одновременно к очереди Q2 и взаимодейстовать с ней (читать, уудалять сообщения).

    Сейчас я не могу подключить ся кофереди Q2 более чем одним консьюмером.

    Вопрос: возможно ли реализовать вышеописаную логику средствами rabbit ?
    Вопрос: возможно ли взаимодейстовать одновременно нескольким консьюмерам с одной очередью ?

    Если ход моих мыслей в решении проблемматики не верен - прошу указать что не так и как бы было-бы лучше. Заранее спасибо.
     
  2. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    208
    Адрес:
    Санкт-Петербург
    На одну очередь нет ограничений консьюмеров. Но несколько консьюмеров не могут получить одну и ту же задачу в очереди. Кролик сам распределит задачи между подписчиками
     
  3. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    25
    Симпатии:
    1
    Ок, тогда такой вопрос: могут ли одновременно два или более консьюмера читать очередь ? Я столкнулся с тем что очеть очередь в которой n сообщений. Я хочу одновременно двумя консьюмерами ее просмотреть, каждый консьюмер ищет особое сообщение, чтобы его удалить. Как итог - один консьюмер все читает а второй нет. То есть фактически при запуске первого консьюмера он, как бы , блочит всю очередь на время чтения (извините, сейчас не могу, к сожалению привести код для примера).
     
  4. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    208
    Адрес:
    Санкт-Петербург
    Может. Тот же rabbitmq по умолчанию не блокирует всю очередь, только отдельную задачу. Однако, возможны и другие настройки, например на блокирование всей очереди или ограничение консьюмеров. Я бы начал смотреть с настроек брокера.