He estado mirando la funcionalidad de las colas de mensajes EE, pero parece que está incompleta.
Antes de 2.1 había una implementación razonablemente funcional que le permitía crear una etc/queue.xml
para definir editores, temas, consumidores y colas como se describe en la documentación oficial: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Había limitaciones, como no haber podido crear enlaces a menos que coincidieran con un tema definido en la configuración, lo que limitaba la flexibilidad, ya que tenía que definir todas las posibilidades posibles del tema por adelantado. La falta de un script de instalación recurrente también significaba que tenía que hacer un poco de pirateo para que el script de instalación se ejecutara nuevamente.
A partir de 2.1, el editor, el tema, el consumidor y los elementos de enlace etc/queue.xml
han quedado en desuso y la configuración se divide entre etc/queue.xml
y etc/communication.xml
, como se puede ver aquí: https://github.com/magento/magento2-samples/blob/master/sample- módulo-muestra-mensaje-cola / etc / . El esquema de editor / tema / consumidor / enlace desaprobado todavía se puede utilizar de forma aislada, pero no junto con el esquema revisado de intermediario / cola.
Sin embargo, nada de esto ha aparecido en la documentación oficial y no está claro de inmediato por qué la configuración se ha dividido y requiere duplicación en algunos casos. Más importante aún, no parece haber una facilidad para definir el enlace ahora, con el nombre del tema utilizado como clave de enrutamiento. Esto a su vez también hace que sea imposible usar caracteres especiales para enlazar colas. Por lo tanto, parece haber sido refactorizado pero perdió funcionalidad.
En una nota positiva, el magento/module-amqp
módulo ahora usa un script de instalación recurrente para que los cambios de configuración de la cola se instalen cuando se ejecuta magento setup:upgrade
. Sin magento/module-mysql-mq
embargo, este cambio aún no se ha aplicado al módulo.
Entonces, me gustaría saber: a) ¿He entendido todo esto mal y en realidad hay una forma de crear enlaces y es más flexible de lo que parece? b) ¿Por qué se ha dividido la configuración?
Como nota al margen, como he estado experimentando con esto, he estado usando uno de los ejemplos de topología de los tutoriales de RabbitMQ en https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Esta configuración obsoleta logró la topología en su mayor parte:
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>
ACTUALIZACIÓN: La documentación ahora se ha actualizado. Los comodines ahora no son compatibles, por lo que la flexibilidad de un intercambio de temas se vuelve nula. Así que intenté recrear el siguiente intercambio directo:
comunicación.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>
Sin embargo, cuando ejecuta los consumidores, solo el tema "verde" se enruta a consumerTwo, ignora el tema "negro". Por lo tanto, parece que lo mejor que se puede lograr es un intercambio directo con un solo enlace por cola y consumidor.