Ho esaminato la funzionalità delle code dei messaggi EE, ma sembra che sia incompleta.
Prima della 2.1 c'era un'implementazione ragionevolmente funzionale che ti permetteva di creare un etc/queue.xml
per definire editori, argomenti, consumatori e code come descritto nella documentazione ufficiale: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Vi erano limitazioni come l'impossibilità di creare associazioni a meno che non corrispondessero a un argomento definito nella configurazione, il che limitava la flessibilità in quanto dovevi definire tutte le possibili possibilità di argomenti in anticipo. La mancanza di uno script di installazione ricorrente significava anche che dovevi fare un po 'di hacking per riavviare lo script del programma di installazione.
A partire dal 2.1 l'editore, l'argomento, il consumatore e gli elementi di bind etc/queue.xml
sono stati deprecati e la configurazione è divisa tra etc/queue.xml
e etc/communication.xml
, come si può vedere qui: https://github.com/magento/magento2-samples/blob/master/sample- module-sample-message-queue / etc / . Lo schema editore / topic / consumer / bind obsoleto può ancora essere utilizzato in modo isolato, ma non in combinazione con lo schema di coda / broker modificato.
Tuttavia, nulla di tutto questo è apparso nella documentazione ufficiale e non è immediatamente chiaro il motivo per cui la configurazione è stata suddivisa e richiede la duplicazione in alcuni casi. Ancora più importante, non sembra esserci una funzione per definire l'associazione ora, con invece il nome dell'argomento usato come chiave di routing. Questo a sua volta rende anche impossibile usare caratteri speciali per legare le code. Quindi sembra essere stato refactored ma ha perso la funzionalità.
Una nota positiva, il magento/module-amqp
modulo ora utilizza uno script di installazione ricorrente in modo che le modifiche alla configurazione della coda vengano installate durante l'esecuzione magento setup:upgrade
. Questa modifica non è stata ancora applicata al magento/module-mysql-mq
modulo.
Quindi mi piacerebbe sapere: a) Ho sbagliato tutto e in realtà esiste un modo per creare associazioni ed è più flessibile di quanto sembri? b) Perché la configurazione è stata suddivisa?
Come nota a margine, mentre ho sperimentato questo, ho usato uno degli esempi di topologia dei tutorial RabbitMQ su https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Questa configurazione obsoleta ha ottenuto la topologia per la maggior 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>
AGGIORNAMENTO: la documentazione è stata ora aggiornata. I caratteri jolly non sono ora supportati, quindi la flessibilità di uno scambio di argomenti è resa nulla. Quindi ho provato a ricreare il seguente scambio diretto:
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>
Tuttavia, quando si eseguono i consumatori, solo l'argomento "verde" viene indirizzato a consumerTwo, ignora l'argomento "nero". Quindi sembra che il meglio che si possa ottenere sia uno scambio diretto con un solo binding per coda e consumatore.