Как стать автором
Обновить

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

Хорошая практика при смене инструмента — почитать в документации как работает данный инструмент и какие best practices рекомендуют его разработчики. В случае с кроликом сразу бы бросилось в глаза, что по мимо queue в нём есть и exchange. Это бы сэкономило время и сразу дало бы направление для поиска решения в Yii.
Немного странная реализация плагина.

Если кролик нужен на уровне «отправки почты или смсок», то ничего об обменниках (exchange) знать и не нужно. Так как rabbit, для очередей без обменников, создает обменники автоматически (если не ошибаюсь, то с type=direct и с точно таким же именем), поэтому код
$queue = $this->context->createQueue($this->queueName);
$this->context->declareQueue($queue);

Создаст очередь, в которую можно сразу же писать без обменника.

Исходя из кода либы, в конфиге, вместе с `queueName` можно указывать `exchangeName` (не утверждаю, но судя по коду это должно быть именно так), хотя об этом в доке ни слова не сказано

Схема с обменниками очень удобна, при распределенной архитектуре. Например когда есть 2 очереди — одна отправляет почту, а другая пишет об этом в лог. Тогда подписываем их на один обменник и отправляем только 1 сообщение, которое попадет в 2 очереди. Пример, конечно, притянут за уши, но думаю вполне понятен
Спасибо, кейс с логом и отправкой имеет право на жизнь.
В свое время тоже использовал кролика в Yii2, но без плагинов, а с библиотекой из документации. Вообще rabbitmq такой комбайн, который может все, что хочешь: queue, event-subscriber, rpc и п.р. И используемый метод будет зависеть от умелого жонглирования конфигами. И для правильного использования комбайна нужно иметь знания, как для комбайна. А типичный для нас подход plugin first в итоге обычно заставляет нас вникать в детали, потому что не работает оно так, как нужно
Если класть сообщение в default exchange, оно не попадет во все очереди. Очень странная реализация плагина (или драйвера?)
Кстати, в документации подробно описано для чего сделан exchange, и как я понял, одна из причин это возможность связанть с exchange несколько очередей. Вот только я не придумал, что за кейс такой когда это может понадобиться, ребята пишите в комметариях.

Например, для автоматического сохранения истории всего отправленного в очередь. Или для федерации, которую многие используют вместо кластера, когда одна из очередей вычитывается на другом сервере кролика. Возможно, для того и другого одновременно

Для первого плагина вы конечно молодец, что завели эту машину. Но про exchanges рассказывается уже в третьей статье 'get started' на их официальном сайте. Документация у кролика конечно не самая дружелюбная, но за полдня осилить можно все гайды :)

Вот только я не придумал, что за кейс такой когда это может понадобиться

Да, для самых простых плюшек (отправил и забыл) достаточно и просто очередей. А вот exchanges, да еще вместе с routing_key дают свободу для построения очень сложных структур. www.rabbitmq.com/tutorials/tutorial-four-php.html

Можно использовать связки сразу нескольких exchanges. Могу привести хороший пример, который сам недавно реализовывал — это «отложенные сообщения» aka dead-letter exchange. Например когда вам нужен или просто сервис «отложенной отправки» или когда чей-то API прямо сейчас недоступен, и вы пытаетесь через N минут ожидания повторить запрос. Вот тут связка нескольких обменников и роут-ключей будет очень кстати.

Ссыль на лучшее исполнение этого подхода (на ноде) — github.com/ria-com/rabbit-mq-learning
Даже схема есть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации