Patrzyłem na funkcjonalność kolejek wiadomości EE, ale wygląda na to, że jest niekompletna.
Przed wersją 2.1 istniała racjonalnie funkcjonalna implementacja, która pozwoliła na utworzenie etc/queue.xml
wydawcy, tematów, konsumentów i kolejek zgodnie z opisem w oficjalnej dokumentacji: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Istniały ograniczenia, takie jak niemożność tworzenia powiązań, chyba że pasowały one do tematu zdefiniowanego w konfiguracji, co ograniczało elastyczność, ponieważ trzeba było z góry zdefiniować wszystkie możliwe możliwości tematu. Brak powtarzającego się skryptu instalacyjnego oznaczał również konieczność włamania się, aby skrypt instalatora mógł zostać ponownie uruchomiony.
Od wersji 2.1 elementy wydawcy, tematu, konsumenta i powiązania etc/queue.xml
są przestarzałe, a konfiguracja jest podzielona między etc/queue.xml
i etc/communication.xml
, jak widać tutaj: https://github.com/magento/magento2-samples/blob/master/sample- moduł-próbka-kolejka komunikatów / etc / . Przestarzały schemat wydawcy / tematu / konsumenta / powiązania może nadal być używany w oderwaniu, ale nie w połączeniu ze zmienionym schematem brokera / kolejki.
Jednak nic z tego nie pojawiło się w oficjalnej dokumentacji i nie jest od razu jasne, dlaczego konfiguracja została podzielona, aw niektórych przypadkach wymaga duplikacji. Co ważniejsze, wydaje się, że obecnie nie ma możliwości zdefiniowania wiązania, ponieważ zamiast tego nazwa tematu jest używana jako klucz routingu. To z kolei uniemożliwia także używanie znaków specjalnych do wiązania kolejki. Wygląda na to, że został zrefaktoryzowany, ale utracił funkcjonalność.
Pozytywnie, magento/module-amqp
moduł używa teraz cyklicznego skryptu instalatora, więc zmiany konfiguracji kolejki są instalowane podczas uruchamiania magento setup:upgrade
. Ta zmiana nie została magento/module-mysql-mq
jednak jeszcze zastosowana w module.
Chciałbym więc wiedzieć: a) Czy wszystko popełniłem źle i czy istnieje sposób tworzenia powiązań i jest on bardziej elastyczny niż się wydaje? b) Dlaczego konfiguracja została podzielona?
Na marginesie, eksperymentując z tym, korzystałem z jednego z przykładów topologii z samouczków RabbitMQ na https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Ta przestarzała konfiguracja w większości osiągnęła topologię:
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>
AKTUALIZACJA: Dokumentacja została teraz zaktualizowana. Symbole wieloznaczne nie są teraz obsługiwane, więc elastyczność wymiany tematów jest zerowa. Próbowałem więc odtworzyć następującą bezpośrednią wymianę:
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>
Jednak po uruchomieniu konsumentów do konsumenta kierowany jest tylko temat „zielony”, ignoruje on temat „czarny”. Wydaje się więc, że najlepszym, co można osiągnąć, jest bezpośrednia wymiana z tylko jednym powiązaniem na kolejkę i konsumenta.