Voraussetzungen
- RabbitMQ
- Magento EE (Wenn Sie in CE sind, können Sie diese Erweiterung verwenden. Diese Antwort hilft Ihnen nicht beim Einrichten dieser Erweiterung.)
- Kennen Sie die Grundlagen des MQ-Protokolls hier ein nützliches Diagramm
Wie man anfängt?
Alles beginnt mit der communication.xml
Datei (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.xml
ist 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-exchange1
in der Austauschliste und productImport-queue
in 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-checkout
und an module-scalable-inventory
.