Yêu cầu trước
- ThỏMQ
- Magento EE (Nếu bạn đang ở CE bạn có thể sử dụng này mở rộng, câu trả lời này sẽ không giúp bạn thiết lập với phần mở rộng đó.)
- Biết những điều cơ bản của giao thức MQ ở đây một sơ đồ hữu ích
Làm thế nào để bắt đầu?
Mọi thứ bắt đầu từ communication.xml
tệp (Tôi giả sử bạn đang tạo một mô-đun mới), trong đó bạn xác định chủ đề cho các trao đổi, chủ đề được sử dụng để liên kết với hàng đợi. Đây là mẫu:
<?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>
Bây giờ chúng ta cần nói với magento cổng và máy chủ RabbitMQ đang ở trong đó env.php
.
'queue' =>
array (
'amqp' =>
array (
'host' => '127.0.0.1',
'port' => '5672',
'user' => 'username',
'password' => 'password',
'virtualhost' => '/',
'ssl' => '',
),
),
Sau đó queue_topology.xml
, tệp này chịu trách nhiệm tạo quy tắc định tuyến, hàng đợi và trao đổi.
<?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>
Sau đó, chúng ta có queue_publisher.xml
, điều này xác định kết nối bộ chuyển đổi và kết nối nào sẽ được sử dụng cho một chủ đề cụ thể.
<?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>
Cho đến thời điểm này khi bạn thực hiện cài đặt: cập nhật, bạn sẽ có thể thấy product-import-exchange1
trong danh sách trao đổi và productImport-queue
trong danh sách hàng đợi trong rabbitMQ, bạn không cần phải thiết lập thủ công hàng đợi hoặc trao đổi trong rabbitMQ vì Magento EE thực hiện điều này cho bạn đã.
Bây giờ chúng ta cần tạo một lớp nhà xuất bản, lớp này sẽ chịu trách nhiệm xuất bản thông báo mới vào hàng đợi của chúng tôi trong rabbitMQ. Nó sẽ trông giống như thế này
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));
}
}
Đảm bảo loại dữ liệu bạn đang gửi khớp với tập dữ liệu trong communication.xml
request
thuộc tính. Bạn có thể làm một cái gì đó như thế này để kiểm tra xem rabbitMQ có nhận được bất kỳ tin nhắn nào không.
$count = 1;
while ($count <= 10000) {
// @var ImagePublisher $publisher
$publisher->publish(array("id" => $count));
$count++;
}
Điều cuối cùng bạn cần làm là tạo ra một người tiêu dùng hoặc người tiêu dùng. Bạn xác định người tiêu dùng trong queue_consumer.xml
. Đây là những gì nó sẽ trông như:
<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>
Bây giờ hãy kiểm tra xem người tiêu dùng có tồn tại không bin/magento queue:consumers:list
, cũng đảm bảo bạn xây dựng lớp tiêu dùng của mình, được xác định trong thuộc tính xử lý của queue_consumer.xml
.
Để bắt đầu người tiêu dùng, bạn sử dụng như sau : bin/magento queue:consumers:start CONSUMER_NAME
.
Người giới thiệu
Hướng dẫn của RabbitMQ
Hướng dẫn Magento 2.2.2
Magento Di chuyển 2.1 Hàng đợi đến 2.2
Bắt đầu với rabbitMQ và PHP
Cũng có một cái nhìn tại các mô-đun module-scalable-checkout
và module-scalable-inventory
.