Ich habe mir die Funktionalität der EE-Nachrichtenwarteschlangen angesehen, aber sie scheint unvollständig zu sein.
Vor 2.1 gab es eine einigermaßen funktionale Implementierung, mit der Sie etc/queue.xml
Publisher, Themen, Konsumenten und Warteschlangen definieren konnten, wie in der offiziellen Dokumentation beschrieben: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Es gab Einschränkungen, z. B. dass keine Bindungen erstellt werden konnten, es sei denn, sie stimmten mit einem in der Konfiguration definierten Thema überein, was die Flexibilität einschränkte, da Sie alle möglichen Themenmöglichkeiten im Voraus definieren mussten. Das Fehlen eines wiederkehrenden Installationsskripts bedeutete auch, dass Sie ein wenig hacken mussten, um das Installationsskript erneut auszuführen.
Ab 2.1 sind die Publisher-, Topic-, Consumer- und Bind-Elemente in etc/queue.xml
veraltet und die Konfiguration wird zwischen etc/queue.xml
und aufgeteilt etc/communication.xml
, wie hier zu sehen ist: https://github.com/magento/magento2-samples/blob/master/sample- Modul-Beispiel-Nachrichtenwarteschlange / etc / . Das veraltete Schema publisher / topic / consumer / bind kann weiterhin isoliert verwendet werden, jedoch nicht in Verbindung mit dem überarbeiteten Broker- / Warteschlangenschema.
Nichts davon ist jedoch in der offiziellen Dokumentation enthalten, und es ist nicht sofort klar, warum die Konfiguration aufgeteilt wurde und in einigen Fällen dupliziert werden muss. Noch wichtiger ist, dass es derzeit keine Möglichkeit gibt, die Bindung zu definieren. Stattdessen wird der Themenname als Routing-Schlüssel verwendet. Dies wiederum macht es auch unmöglich, Sonderzeichen zum Binden von Warteschlangen zu verwenden. Es scheint also überarbeitet worden zu sein, hat aber die Funktionalität verloren.
Positiv zu vermerken ist, dass das magento/module-amqp
Modul jetzt ein wiederkehrendes Installationsskript verwendet, sodass die Änderungen an der Warteschlangenkonfiguration beim Ausführen installiert werden magento setup:upgrade
. Diese Änderung wurde jedoch noch nicht auf das magento/module-mysql-mq
Modul angewendet .
Also würde ich gerne wissen: a) Habe ich das alles falsch verstanden und es gibt tatsächlich Möglichkeiten, Bindungen zu erstellen und es ist flexibler als es scheint? b) Warum wurde die Konfiguration aufgeteilt?
Als Randnotiz habe ich beim Experimentieren eines der Topologiebeispiele aus den RabbitMQ-Tutorials unter https://www.rabbitmq.com/tutorials/tutorial-four-php.html verwendet :
Diese veraltete Konfiguration erreichte größtenteils die Topologie:
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>
UPDATE: Die Dokumentation wurde jetzt aktualisiert. Platzhalter werden jetzt nicht unterstützt, sodass die Flexibilität eines Themenaustauschs auf Null gesetzt wird. Also habe ich versucht, den folgenden direkten Austausch wiederherzustellen:
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>
Wenn Sie jedoch die Konsumenten ausführen, wird nur das "grüne" Thema an consumerTwo weitergeleitet. Das "schwarze" Thema wird ignoriert. Es scheint also, dass das Beste, was erreicht werden kann, ein direkter Austausch mit nur einer Bindung pro Warteschlange und Verbraucher ist.