В оф. доке rabbitmq написано, что есть несколько типов обменников(exchange), один из них fanout - распределяет сообщения во все очереди, игнорирует routing_key.
Модель задачи: есть n сообщений, есть три получателя(consumer), каждое сообщение должно попасть к каждому получателю.
Используется либа
https://github.com/php-amqplib/php-amqplib
Что делаю:
Отправитель(producer): декларирую обменник типа fanout, делаю basic_publish всех сообщений
Получатель(consumer): декларирую обменник типа fanout декларирую очередь с рандомным названием(из доки list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);), делаю basic_consume всех сообщений
Проблема:
Если получатели уже запущены, то все происходит верно, все получатели получили по каждому сообщению, но если получатели не запущены, а сообщения отправлены, то при запуске получателей ничего не происходит, сообщения просто потерялись.
Если декларировать очередь в отправителе, то сообщения не теряются, но потом не привязываясь в получателе к этой очереди я не смогу взять сообщения и весь смысл fanout теряется. Игрался с разными флагами(durable, delivery_mode) и ничего не помогло.
Вопрос: как сохранять сообщения, не привязываясь к очереди в отправителе, чтобы при запуске получателей они стали получать эти сообщения? Если способ только декларировать очередь в отправителе, то тогда какой смысл fanout обменника?