Eu estive analisando a funcionalidade de filas de mensagens EE, mas parece que ela está incompleta.
Antes da versão 2.1, havia uma implementação razoavelmente funcional que permitia criar um etc/queue.xml
para definir editores, tópicos, consumidores e filas, conforme descrito na documentação oficial: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Havia limitações como não foi possível criar ligações, a menos que correspondessem a um tópico definido na configuração, o que limitava a flexibilidade, pois era necessário definir todas as possibilidades de tópicos possíveis antecipadamente. A falta de um script de instalação recorrente também significava que você precisava fazer um pouco de hacking para que o script do instalador fosse executado novamente.
A partir da versão 2.1, os elementos publicador, tópico, consumidor e ligação etc/queue.xml
foram descontinuados e a configuração é dividida entre etc/queue.xml
e etc/communication.xml
, como pode ser visto aqui: https://github.com/magento/magento2-samples/blob/master/sample- módulo-amostra-mensagem-fila / etc / . O esquema / editor / tópico / consumidor / ligação descontinuado ainda pode ser usado isoladamente, mas não em conjunto com o esquema do broker / fila revisado.
No entanto, nada disso apareceu na documentação oficial e não está claro imediatamente por que a configuração foi dividida e requer duplicação em alguns casos. Mais importante, parece não haver um recurso para definir a ligação agora, com o nome do tópico sendo usado como a chave de roteamento. Isso, por sua vez, também torna impossível o uso de caracteres especiais para filas de ligação. Portanto, parece ter sido refatorado, mas perdeu a funcionalidade.
Em uma observação positiva, o magento/module-amqp
módulo agora usa um script de instalação recorrente para que as alterações na configuração da fila sejam instaladas quando você executar magento setup:upgrade
. Essa alteração ainda não foi aplicada ao magento/module-mysql-mq
módulo.
Então, eu gostaria de saber: a) Entendi tudo errado e há realmente uma maneira de criar ligações e é mais flexível do que parece? b) Por que a configuração foi dividida?
Como observação lateral, ao experimentar isso, usei um dos exemplos de topologia dos tutoriais do RabbitMQ em https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Essa configuração descontinuada alcançou a topologia para a maior 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>
ATUALIZAÇÃO: A documentação foi atualizada. Os curingas agora não são suportados, portanto, a flexibilidade de uma troca de tópicos é tornada nula. Então, tentei recriar a seguinte troca direta:
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>
No entanto, quando você executa os consumidores, apenas o tópico "verde" é roteado para o consumidor. Dois, ele ignora o tópico "preto". Portanto, parece que o melhor que pode ser alcançado é uma troca direta com apenas uma ligação por fila e consumidor.