Я розглядав функціональні черги повідомлень 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- модуль-зразок-повідомлення-черга / тощо / . Застаріла схема видавця / теми / споживача / зв’язування все ще може використовуватися ізольовано, але не в поєднанні з переглянутою схемою посередника / черги.
Однак нічого з цього не з’явилося в офіційній документації, і в ньому не відразу зрозуміло, чому конфігурація розбита і вимагає дублювання в деяких випадках. Що ще важливіше, здається, що зараз немає можливості визначати прив'язку, натомість назва теми використовується як ключ маршрутизації. Це, у свою чергу, також унеможливлює використання спеціальних символів для прив'язки черг. Таким чином, здається, він був відновлений, але втратив функціональність.
З позитивного зауваження, magento/module-amqp
тепер модуль використовує повторюваний сценарій встановлення, тому зміни конфігурації черги встановлюються під час запуску magento setup:upgrade
. Ця зміна ще не застосовується до magento/module-mysql-mq
модуля.
Тож я хотів би знати: а) Чи я все це неправильно зрозумів і чи є насправді спосіб створення прив’язок, і він є більш гнучким, ніж здається? b) Чому конфігурація була розділена?
В якості побічної записки, коли я експериментував з цим, я використовував один із прикладів топології з навчальних посібників 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>
Однак, коли ви запускаєте споживачів, до споживача перенаправляється лише "зелена" тема, вона ігнорує "чорну" тему. Тож здається, що найкраще, що може бути досягнуто, - це прямий обмін лише однією прив'язкою на чергу та споживача.