J'ai regardé la fonctionnalité des files d'attente de messages EE, mais il semble qu'elle soit incomplète.
Avant 2.1, il y avait une implémentation raisonnablement fonctionnelle qui vous permettait de créer un etc/queue.xml
pour définir les éditeurs, les sujets, les consommateurs et les files d'attente comme décrit dans la documentation officielle: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Il y avait des limitations telles que l'impossibilité de créer des liaisons à moins qu'elles ne correspondent à un sujet défini dans la configuration, ce qui limitait la flexibilité car vous deviez définir toutes les possibilités de sujet possibles à l'avance. L'absence d'un script d'installation récurrent signifiait également que vous deviez faire un peu de piratage pour que le script d'installation s'exécute à nouveau.
Depuis la version 2.1, les éléments éditeur, topic, consumer et bind etc/queue.xml
sont obsolètes et la configuration est divisée entre etc/queue.xml
et etc/communication.xml
, comme on peut le voir ici: https://github.com/magento/magento2-samples/blob/master/sample- module-sample-message-queue / etc / . Le schéma éditeur / rubrique / consommateur / liaison obsolète peut toujours être utilisé de manière isolée, mais pas conjointement avec le schéma de courtier / file d'attente révisé.
Cependant, rien de tout cela n'est apparu dans la documentation officielle et ce n'est pas immédiatement clair pourquoi la configuration a été divisée et nécessite une duplication dans certains cas. Plus important encore, il ne semble pas être possible de définir la liaison maintenant, avec le nom de rubrique utilisé comme clé de routage à la place. Cela rend également impossible l'utilisation de caractères spéciaux pour les files d'attente de liaison. Il semble donc avoir été refactorisé mais perdu de ses fonctionnalités.
Sur une note positive, le magento/module-amqp
module utilise maintenant un script d'installation récurrent afin que les modifications de configuration de la file d'attente soient installées lorsque vous exécutez magento setup:upgrade
. Cette modification n'a pas encore été appliquée au magento/module-mysql-mq
module.
Je voudrais donc savoir: a) Est-ce que j'ai tout faux et qu'il y a effectivement moyen de créer des liaisons et c'est plus flexible qu'il n'y paraît? b) Pourquoi la configuration a-t-elle été divisée?
En guise de remarque, pendant que j'expérimente cela, j'ai utilisé l'un des exemples de topologie des didacticiels RabbitMQ sur https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Cette configuration obsolète a atteint la topologie pour la plupart:
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>
MISE À JOUR: La documentation a été mise à jour. Les caractères génériques ne sont désormais plus pris en charge, de sorte que la flexibilité d'un échange de sujet est rendue nulle. J'ai donc essayé de recréer l'échange direct suivant:
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>
Toutefois, lorsque vous exécutez les consommateurs, seule la rubrique "verte" est acheminée vers consumerTwo, elle ignore la rubrique "noire". Il semble donc que le mieux qui puisse être accompli est un échange direct avec une seule liaison par file d'attente et par consommateur.