私はEEメッセージキュー機能を見てきましたが、それは不完全なようです。
2.1より前のバージョンではetc/queue.xml
、公式ドキュメントに記載されているように、パブリッシャー、トピック、コンシューマー、キューを定義するための合理的な機能の実装がありました。http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html。
構成で定義されたトピックと一致しない限りバインディングを作成できないなどの制限があり、可能なすべてのトピックの可能性を事前に定義する必要があったため、柔軟性が制限されていました。繰り返し実行されるインストールスクリプトがないため、インストーラースクリプトを再度実行するには、少しハッキングする必要がありました。
2.1以降、パブリッシャー、トピック、コンシューマー、バインドの各要素はetc/queue.xml
非推奨になり、設定はとの間etc/queue.xml
で分割されetc/communication.xml
ます。ここに示されています:https : //github.com/magento/magento2-samples/blob/master/sample- module-sample-message-queue / etc /。非推奨のパブリッシャー/トピック/コンシューマー/バインドスキーマは引き続き単独で使用できますが、改訂されたブローカー/キュースキーマと併用することはできません。
ただし、これは公式ドキュメントには記載されておらず、構成が分割されており、場合によっては複製が必要な理由がすぐには明らかにされていません。さらに重要なこととして、現在バインディングを定義する機能がなく、代わりにトピック名がルーティングキーとして使用されているようです。これにより、キューのバインドに特殊文字を使用することもできなくなります。したがって、リファクタリングされたようですが、機能が失われています。
肯定的な点として、magento/module-amqp
モジュールは繰り返しインストーラースクリプトを使用するようになり、を実行すると、キュー構成の変更がインストールされますmagento setup:upgrade
。magento/module-mysql-mq
ただし、この変更はまだモジュールに適用されていません。
だから私は知りたいです:a)私はこれをすべて間違っていて、実際にバインディングを作成する方法があり、見た目よりも柔軟ですか?b)構成が分割されているのはなぜですか?
付記として、これを実験してきたので、私はhttps://www.rabbitmq.com/tutorials/tutorial-four-php.htmlにあるRabbitMQチュートリアルのトポロジーの例の1つを使用しています:
この非推奨の構成は、大部分のトポロジを実現しました。
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>
更新:ドキュメントが更新されました。ワイルドカードはサポートされなくなったため、トピック交換の柔軟性はnullになります。だから私は次の直接交換を再現しようとしました:
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>
ただし、コンシューマーを実行すると、「緑」のトピックのみがconsumerTwoにルーティングされ、「黒」のトピックは無視されます。したがって、達成できる最善の方法は、キューとコンシューマごとに1つのバインディングのみを使用した直接交換であるようです。