So integrieren Sie RabbitMQ in Magento 2.2. * EE

7

Die Einrichtung von Magento-Warteschlangen in M2 EE 2.2. * Unterscheidet sich von der in Version vor 2.2. *. Das queue.xmlist veraltet und es gibt 3 neue Konfigurationsdateien queue_consumer.xml, queue_publisher.xmlund queue_topology.xml.

Ich habe an einem Projekt zur Integration von AWS S3 Buckets in Magento gearbeitet. Diese Aufgabe verwendet verschiedene coole Technologien, eine davon ist RabbitMQ.

Im Folgenden finden Sie eine Antwort, die beim Einrichten von Nachrichtenwarteschlangen in Magento 2.2 möglicherweise Zeit spart oder nicht. *

André Ferraz
quelle

Antworten:

8

Voraussetzungen

  1. RabbitMQ
  2. Magento EE (Wenn Sie in CE sind, können Sie diese Erweiterung verwenden. Diese Antwort hilft Ihnen nicht beim Einrichten dieser Erweiterung.)
  3. Kennen Sie die Grundlagen des MQ-Protokolls hier ein nützliches Diagramm

Wie man anfängt?

Alles beginnt mit der communication.xmlDatei (ich nehme an, Sie erstellen ein neues Modul), in der Sie die Themen für den Austausch definieren. Themen werden zum Binden an Warteschlangen verwendet. Hier ist ein Beispiel:

<?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="productImport.topic" request="string" />
</config>

Wir müssen jetzt Magento mitteilen, in welchem ​​Port und Host RabbitMQ sich befindet env.php.

'queue' => 
  array (
    'amqp' => 
    array (
      'host' => '127.0.0.1',
      'port' => '5672',
      'user' => 'username',
      'password' => 'password',
      'virtualhost' => '/',
      'ssl' => '',
    ),
  ),

Dann queue_topology.xmlist diese Datei verantwortlich für die Erstellung von Routing - Regeln, Warteschlangen und Austausch.

<?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue_topology.xsd">
        <exchange name="product-import-exchange1" type="topic" connection="amqp">
            <binding id="productImportBinding1" topic="productImport.topic" destinationType="queue" destination="productImport-queue"/>
        </exchange>
    </config>

Dann haben wir die queue_publisher.xml, dies bestimmt, welche Austausch- und Verbindungsadapterverbindung für ein bestimmtes Thema verwendet werden soll.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue_publisher.xsd">
    <publisher topic="productImport.topic">
        <connection name="amqp" exchange="porduct-import-exchange1" />
    </publisher>
</config>

Bis zu diesem Punkt, wenn Sie ein Setup: Update durchführen, sollten Sie product-import-exchange1in der Austauschliste und productImport-queuein der Liste der Warteschlangen in rabbitMQ sehen können, dass Sie die Warteschlange oder den Austausch in rabbitMQ nicht manuell einrichten müssen, wie dies Magento EE tut Du schon.

Jetzt müssen wir eine Publisher-Klasse erstellen. Diese Klasse ist dafür verantwortlich, neue Nachrichten in unserer Warteschlange in rabbitMQ zu veröffentlichen. Es würde ungefähr so ​​aussehen

class ImagePublisher
{
    const TOPIC_NAME = "productImport.topic";

    /**
     * @var PublisherInterface
     */
    protected $publisher;

    /**
     * ImagePublisher constructor.
     *
     * @param   PublisherInterface  $publisher
     */
    public function __construct(
        PublisherInterface $publisher
    ) {
        $this->publisher = $publisher;
    }

    /**
     * Build and publishes message to RabbitMQ.
     *
     * @param   array   $data
     * @return  void
     */
    public function publish(array $data)
    {
        $this->publisher->publish(self::TOPIC_NAME, json_encode($data));
    }
}

Stellen Sie sicher, dass der von Ihnen gesendete Datentyp mit dem Datensatzattribut übereinstimmt communication.xml request. Sie können so etwas tun, um zu testen, ob rabbitMQ Nachrichten empfängt.

$count = 1;
while ($count <= 10000) {
   // @var ImagePublisher $publisher
   $publisher->publish(array("id" => $count));
   $count++;
}

Das Letzte, was Sie tun müssen, ist, einen oder mehrere Verbraucher zu erstellen. Sie definieren Verbraucher in queue_consumer.xml. Hier, wie es aussehen würde:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue_consumer.xsd">
    <consumer name="productimport.consumer.one" queue="productImport-queue" connection="amqp" handler="CLASS_TO_PROCESS_MESSAGE::METHOD"/>
</config>

Überprüfen Sie nun, ob der Consumer vorhanden ist bin/magento queue:consumers:list, und stellen Sie sicher, dass Sie Ihre Consumer-Klasse erstellen, die im Handler-Attribut von definiert ist queue_consumer.xml.

Um den Verbraucher zu starten, verwenden Sie Folgendes : bin/magento queue:consumers:start CONSUMER_NAME.

Verweise

RabbitMQ Tutorials

Magento 2.2.2 Handbuch

Magento Migrate 2.1 Queues to 2.2

Erste Schritte mit rabbitMQ und PHP

Schauen Sie sich auch die Module module-scalable-checkoutund an module-scalable-inventory.

André Ferraz
quelle
Es ist besser, wenn Sie auch Ordnerpfade der oben genannten Dateien hinzufügen.
Ashar Riaz