Задать вопрос

Как правильно работать с каналами RabbitMQ?

Добрый день!

Похоже, я не понимаю что-то фундаментально, просьба направить на правильный путь.

Есть ПО1 и ПО2, которые взаимодействуют через RabbitMQ.. ПО1 делает create_channel, кладет сообщение в очередь, закрывает канал.

Потом по крону запускается ПО2, которое делает create_channel, читает сообщение, закрывает канал.

Эта схема перестает работать, когда со стороны ПО1 идет большой поток сообщений. Экспериментальным путем выяснено, что когда я делаю из ПОх create_channel, а при этом в другом ПОх тоже на этот момент уже есть установленное соединение, то более ранний канал перестает работать (переустанавливается с удалением накопленных сообщений) и сообщения в нем теряются.

Как результат, из например, 400 сообщений, которые поступают в течение 3 секунд, теряется около 5-6 сообщений случайным образом.

Как правильно организовать работу двух скриптов, запускаемых случайным образом? Есть ли возможность в RabbitMQ не создавать канал заново, а использовать существующий если он есть, и создавать его только когда он есть или закрывается?

Заранее спасибо
  • Вопрос задан
  • 4874 просмотра
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Intentio
Channel - это объект, с помощью которого происходит взаимодействие с сервером RabbitMQ.
В документации сказано, что необходимо использовать один Channel в одном потоке. Если вы используете один Channel в нескольких потоках, то это может привести к ошибкам.

В вашем случае, есть вероятность, что в момент создания Channel очередь пересоздается и теряются все сообщения, т.е:
$channel->queue_declare('hello', false, false, false, false);
Ответ написан
Комментировать
tegrato
@tegrato
А зачем и каким образом вы создаете канал?
По идее, это вообще не нужно делать. Кролик поддерживает автоматическое управление каналами - сам создает и сам закрывает. Соответственно при одновременной работе 2-х программ он будет использовать разные каналы для одной очереди, и ничего не пропадет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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