Saya telah melihat fungsionalitas antrian pesan EE, tetapi sepertinya itu tidak lengkap.
Sebelum 2.1 ada implementasi fungsional yang memungkinkan Anda untuk membuat etc/queue.xml
mendefinisikan penerbit, topik, konsumen dan antrian seperti yang dijelaskan dalam dokumentasi resmi: http://devdocs.magento.com/guides/v2.0/config-guide /mq/config-mq.html .
Ada batasan seperti tidak dapat membuat binding kecuali mereka cocok dengan topik yang ditentukan dalam konfigurasi, yang membatasi fleksibilitas karena Anda harus menentukan semua kemungkinan topik yang mungkin ada di muka. Kurangnya skrip instal yang berulang juga berarti Anda harus melakukan sedikit peretasan agar skrip installer dapat berjalan kembali.
Pada 2.1 penerbit, topik, konsumen dan elemen mengikat etc/queue.xml
telah ditinggalkan dan konfigurasi dibagi antara etc/queue.xml
dan etc/communication.xml
, seperti yang dapat dilihat di sini: https://github.com/magento/magento2-samples/blob/master/sample- module-sample-message-queue / etc / . Skema penerbit / topik / konsumen / mengikat yang sudah usang masih dapat digunakan secara terpisah, tetapi tidak bersamaan dengan skema broker / antrian yang direvisi.
Namun, tidak satu pun dari ini muncul dalam dokumentasi resmi dan tidak segera jelas mengapa konfigurasi telah terpecah dan memerlukan duplikasi dalam beberapa kasus. Lebih penting lagi, tampaknya tidak ada fasilitas untuk mendefinisikan ikatan sekarang, dengan nama topik yang digunakan sebagai kunci perutean. Ini pada gilirannya juga membuat tidak mungkin untuk menggunakan karakter khusus untuk mengikat antrian. Jadi tampaknya telah refactored tetapi kehilangan fungsionalitas.
Pada catatan positif, magento/module-amqp
modul sekarang menggunakan skrip penginstal berulang sehingga perubahan konfigurasi antrian diinstal saat Anda menjalankan magento setup:upgrade
. Namun perubahan ini belum diterapkan pada magento/module-mysql-mq
modul.
Jadi saya ingin tahu: a) Apakah saya salah semua ini dan sebenarnya ada cara untuk membuat binding dan lebih fleksibel daripada yang terlihat? b) Mengapa konfigurasi terpecah?
Sebagai catatan, karena saya telah bereksperimen dengan ini, saya telah menggunakan salah satu contoh topologi dari tutorial RabbitMQ di https://www.rabbitmq.com/tutorials/tutorial-four-php.html :
Konfigurasi yang ditinggalkan ini mencapai topologi untuk sebagian besar:
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: Dokumentasi sekarang telah diperbarui. Wildcard sekarang tidak didukung, sehingga fleksibilitas pertukaran topik dianggap nol. Jadi saya mencoba membuat ulang pertukaran langsung berikut:
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>
Namun, ketika Anda menjalankan konsumen, hanya topik "hijau" yang dialihkan ke consumerTwo, ia mengabaikan topik "hitam". Jadi sepertinya yang terbaik yang dapat dicapai adalah pertukaran langsung dengan hanya satu ikatan per antrian dan konsumen.