@serega_chem

Возможна ли на RabbitMQ обработка нескольких очередей одним consumer'ом?

Прошел официальный туториал php/rabbitmq. Для закрепления материала хочу написать чат с использование websockets. В качестве сервера намереваюсь использовать Workerman.
Логика пока такая:
1. Сообщения попадают в общий exchange (с типом direct). Где routing key - id пользователя
2. При коннекте юзера создаётся очередь и присоединяется к обменнику по тому же id пользователя

Как должны обрабатываться все эти очереди? В туториале на каждую очередь запускался собственный демон php.
Как поступить в моём случае? Можете предложить альтернативный подход)
P.S.: Основной инструмент Yii2
  • Вопрос задан
  • 382 просмотра
Решения вопроса 1
@serega_chem Автор вопроса
В результате поиска решения появился следующий класс
use PhpAmqpLib\Connection\AMQPStreamConnection;

class MessageConsumer
{
    private $channel;
    private $exchange = "message";
    
    public function __construct()
    {
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $this->channel = $connection->channel();
    }

    public function listen()
    {
        $this->channel->exchange_declare($this->exchange, 'direct', false, true, false);
        while (true) {
            $this->channel->wait();
        }
    }

    public function addQueue($queue)
    {
        $this->channel->queue_declare($queue, false, false, false, false);
        $this->channel->queue_bind($queue, $this->exchange, $queue);
        $this->channel->basic_consume($queue, '', false, true, false, false, [$this, 'processMessage']);
    }

    public function processMessage($msg)
    {
        echo "[x] {$msg->delivery_info['routing_key']} : $msg->body \n";
    }
}

Клиентский код примерно таков
use MessageConsumer;

$consumer = new MessageConsumer();
$consumer->addQueue('admin');
$consumer->addQueue('user');
$consumer->listen();


Тут же возникает вопросы:
1. Как и где хранить экземпляр класса MessageConsumer? Скорее экземпляр AMQPChannel текущего соединения
2. Как восстановить работу чата при падении демона? обрыве соединения?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы