Я смотрел на функциональность очереди сообщений EE, но кажется, что она неполная.
До версии 2.1 существовала достаточно функциональная реализация, которая позволяла вам создавать etc/queue.xml
объекты, определяющие издателей, темы, потребителей и очереди, как описано в официальной документации: http://devdocs.magento.com/guides/v2.0/config-guide. /mq/config-mq.html .
Существовали ограничения, такие как невозможность создания привязок, если они не соответствуют теме, определенной в конфигурации, что ограничивало гибкость, поскольку вам приходилось определять все возможные возможности темы заранее. Отсутствие повторяющегося установочного скрипта также означало, что вам пришлось немного взломать, чтобы снова запустить скрипт установщика.
Начиная с 2.1, элементы издатель, тема, потребитель и связывание etc/queue.xml
устарели, а конфигурация разделена между etc/queue.xml
и etc/communication.xml
, как можно увидеть здесь: https://github.com/magento/magento2-samples/blob/master/sample- модуль-образец-очередь сообщений / etc / . Схему устаревшего издателя / темы / потребителя / связывания по-прежнему можно использовать изолированно, но не в сочетании с измененной схемой посредника / очереди.
Тем не менее, ничего из этого не появилось в официальной документации, и не сразу понятно, почему конфигурация была разделена и требует дублирования в некоторых случаях. Что еще более важно, сейчас, похоже, не существует средства для определения привязки, вместо этого в качестве ключа маршрутизации используется имя темы. Это, в свою очередь, также делает невозможным использование специальных символов для привязки очередей. Так что, похоже, он был переработан, но потерял функциональность.
Положительным моментом является то, что magento/module-amqp
модуль теперь использует повторяющийся скрипт установщика, поэтому изменения конфигурации очереди устанавливаются при запуске magento setup:upgrade
. Это изменение еще не применено к magento/module-mysql-mq
модулю.
Итак, я хотел бы знать: а) Я все понял неправильно, и на самом деле есть способ создать привязки, и он более гибкий, чем кажется? б) Почему конфигурация была разделена?
В качестве дополнительного примечания, поскольку я экспериментировал с этим, я использовал один из примеров топологии из учебных пособий RabbitMQ по адресу https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Эта устаревшая конфигурация достигла топологии по большей части:
queue.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
<topic name="quick.orange.rabbit" schema="Example\MessageQueue\Api\MessageInterface" publisher="default" />
<topic name="quick.orange.fox" schema="Example\MessageQueue\Api\MessageInterface" publisher="default" />
<topic name="lazy.pink.rabbit" schema="Example\MessageQueue\Api\MessageInterface" publisher="default" />
<topic name="lazy.orange.elephant" schema="Example\MessageQueue\Api\MessageInterface" publisher="default" />
<topic name="lazy.brown.fox" schema="Example\MessageQueue\Api\MessageInterface" publisher="default" />
<consumer name="consumerOne" queue="queueOne" connection="amqp" class="Example\MessageQueue\Model\Subscriber" method="processMessage" executor="Magento\Framework\MessageQueue\BatchConsumer" />
<consumer name="consumerTwo" queue="queueTwo" connection="amqp" class="Example\MessageQueue\Model\Subscriber" method="processMessage" executor="Magento\Framework\MessageQueue\BatchConsumer" />
<bind queue="queueOne" exchange="magento" topic="*.orange.*" />
<bind queue="queueTwo" exchange="magento" topic="*.*.rabbit" />
<bind queue="queueTwo" exchange="magento" topic="lazy.#" />
</config>
ОБНОВЛЕНИЕ: документация была обновлена. Подстановочные знаки теперь не поддерживаются, поэтому гибкость обмена темами становится нулевой. Поэтому я попытался воссоздать следующий прямой обмен:
communication.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Communication/etc/communication.xsd">
<topic name="orange" request="Example\MessageQueueExample\Api\MessageInterface" />
<topic name="black" request="Example\MessageQueueExample\Api\MessageInterface" />
<topic name="green" request="Example\MessageQueueExample\Api\MessageInterface" />
</config>
queue.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
<broker topic="orange" type="amqp" exchange="magento">
<queue consumer="consumerOne" name="queueOne" handler="Example\MessageQueueExample\Model\Subscriber::processMessage" consumerInstance="Magento\Framework\MessageQueue\Consumer"/>
</broker>
<broker topic="black" type="amqp" exchange="magento">
<queue consumer="consumerTwo" name="queueTwo" handler="Example\MessageQueueExample\Model\Subscriber::processMessage" consumerInstance="Magento\Framework\MessageQueue\Consumer"/>
</broker>
<broker topic="green" type="amqp" exchange="magento">
<queue consumer="consumerTwo" name="queueThree" handler="Example\MessageQueueExample\Model\Subscriber::processMessage" consumerInstance="Magento\Framework\MessageQueue\Consumer"/>
</broker>
</config>
Тем не менее, когда вы запускаете потребителей, только «зеленая» тема направляется на потребителя два, она игнорирует «черную» тему. Таким образом, кажется, что лучшее, что может быть достигнуто, - это прямой обмен только с одной привязкой на очередь и потребителя.