mage-os/mageos-async-events

一个基于事件驱动的灵活的异步事件模块,允许您异步处理任何事件。

安装数: 2,749

依赖项: 4

建议者: 0

安全: 0

星标: 15

关注者: 10

分支: 3

开放问题: 1

类型:magento2-module

v4.0.1 2024-07-12 08:49 UTC

This package is auto-updated.

Last update: 2024-09-17 09:49:18 UTC


README

Integration Test REST

一个用于在 Magento 中可靠处理异步事件的框架。

  • 异步:该模块使用 RabbitMQ(或 DB 队列)利用异步消息传递。
  • 灵活:解耦事件和分发,为消息建模提供更大的灵活性。
  • 可扩展:自动处理背压并提供异步故障转移模型。

安装

$ composer require mage-os/mageos-async-events

安装模块

$ bin/magento setup:upgrade

使用

定义异步事件

在模块的 etc/ 目录下创建一个新的 async_events.xml

<?xml version="1.0"?>
<config
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:module:MageOS_AsyncEvents:etc/async_events.xsd"
>
    <async_event name="sales.order.created">
        <service class="Magento\Sales\Api\OrderRepositoryInterface" method="get"/>
    </async_event>
</config>

创建订阅

提示

要查看所有可用的事件接收器,请查看异步事件接收器

HTTP

curl --location --request POST 'https://test.mageos.dev/rest/V1/async_event' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
    "asyncEvent": {
        "event_name": "sales.order.created",
        "recipient_url": "https://example.com/order_created",
        "verification_token": "supersecret",
        "metadata": "http"
    }
}'

Amazon EventBridge

需要AWS 接收器

curl --location --request POST 'https://test.mageos.dev/rest/V1/async_event' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
    "asyncEvent": {
        "event_name": "sales.order.created",
        "recipient_url": "arn:aws:events:ap-southeast-2:ACCOUNT_ID:rule/BUS_NAME",
        "verification_token": "supersecret",
        "metadata": "eventbridge"
    }
}'

派发异步事件

use \MageOS\AsyncEvents\Model\AsyncEventPublisher;

// ...

public function __construct(private readonly AsyncEventPublisher $asyncEventPublisher) {}

public function execute(Observer $observer): void
{
    /** @var Order $order */
    $order = $observer->getData('order');

    // arguments are the inputs required by the service class in the asynchronous
    // event definition in async_events.xml
    // e.g: Magento\Sales\Api\OrderRepositoryInterface::get
    $message = ['id' => $order->getId()];

    $this->asyncEventPublisher->publish('sales.order.created', $message);
}

确保以下消费者正在运行

bin/magento queue:consumer:start event.trigger.consumer
bin/magento queue:consumer:start event.retry.consumer

功能

跟踪

所有事件都使用 UUID 在单独的订阅级别进行记录。

从第一次投递尝试到最新尝试的所有信息都作为跟踪表呈现。事件有效负载也可供调查查看。

Event Trace Page

重试

事件会自动重试,并使用二次退避。默认重试限制为 5。最大退避时间为 60 秒。

重要

重试使用退避时需要 RabbitMQ。如果您使用 DB 队列,则二次退避不可用,您将必须实现自己的 \MageOS\AsyncEvents\Api\RetryManagementInterface

二次退避的计算方式为 min(60, pow($deathCount, 2));

要更改默认重试限制,请访问 Admin > Stores > Settings > Configuration > Advanced > System > Async Events 并更新 Maximum Deaths

Retry Limit Config Page

重放

可以独立于事件状态重放事件。这在调试或重放已耗尽所有重试的事件时非常有用。

重放将启动新的投递尝试链,如果它们再次失败,将尊重相同的重试机制。

Lucene 查询语法

默认情况下,所有事件都在 Elasticsearch 中进行索引。这允许您搜索事件,包括事件有效负载!

该模块支持Lucene 查询语法来查询事件数据,如属性。

以下属性在所有异步事件中都是可用的。

log_id
uuid
event_name
success
created

以下属性在不同类型的异步事件之间存在差异。

data

示例

假设您已配置以下事件

customer.created
customer.updated
customer.deleted
sales.order.created
sales.invoice.created
shipment.created
shipment.updated
shipment.deleted

您可以使用通配符如 event_name: customer.* 来查询所有客户事件,它匹配以下事件

customer.created
customer.updated
customer.deleted

您可以使用 *.created 来查询所有创建的事件,它匹配以下事件

customer.created
sales.order.created
sales.invoice.created
shipment.created

您可以使用其他可用的属性,如状态或 uuid,进一步缩小范围。

以下查询返回所有失败的客户事件:customer.* AND success: false

您可以将复杂的 lucene 查询组合起来检索事件历史记录,然后通过管理员网格作为 csv 导出,如果需要的话。

在事件有效负载中搜索

搜索事件有效负载取决于您正在搜索的事件。

以下示例事件负载中,四个属性被索引为属性。因此,您可以在 data.customer_emaildata.customer_firstnamedata.customer_lastnamedata.increment_id 上进行查询。任何级别的数组内的属性都是不可搜索的。

{
    "data": {
        "customer_email": "roni_cost@example.com",
        "customer_firstname": "Veronica",
        "customer_lastname": "Costello",
        "increment_id": "CK00000001",
        "payment_additional_info": [
            {
                "key": "method_title",
                "value": "Check / Money order"
            }
        ]
    }
}

搜索所有客户电子邮件为 roni_cost@example.com 的事件

data.data.customer_email: roni_cost@example.com

Lucene Example 1

搜索所有以 CK 开头且状态为成功的订单增量ID的事件

data.data.increment_id: CK* AND success: true

Lucene Example 2

要关闭异步事件索引,请访问管理员 > 店铺 > 设置 > 配置 > 高级 > 系统 > 异步事件,并禁用 启用异步事件索引

支持