aldidigitalservices/lean-publisher

Spryker 的轻量级出版模块

v1.0.3 2023-03-14 15:32 UTC

This package is auto-updated.

Last update: 2024-09-14 18:53:20 UTC


README

描述

Lean Publisher 是一种基于 sprykers "发布 & 同步" 流程(https://docs.spryker.com/docs/scos/dev/back-end-development/data-manipulation/data-publishing/publish-and-synchronization.html)的发布流程。

此流程的目标是在以前端为中心的数据存储(如 Redis 和 Elasticsearch)中提供数据。

Lean Publisher 旨在与 spryker 系统一起使用。

Screenshot

优点

  1. Lean publisher 集中了所有写入操作,因此连接的模块不需要考虑批量发布
  2. Redis 和 Elasticsearch 中的同步是同步发生的 - 防止数据存储不同步
  3. 队列、事件和消息的数量大幅减少,从而提高了高吞吐量环境中的 RabbitMQ 性能
  4. 事件映射得到改进并集中在一个地方。使发布者进程的连接更容易理解
  5. 为实施模块提供指导结构,因此发布的方法不会太多样化

安装

composer require ALDIDigitalservices/lean-publisher

集成

config_default.php

在 config_default.php 中将 "ALDIDigitalServices" 添加到您的 CORE_NAMESPACES

$config[KernelConstants::CORE_NAMESPACES] = [
	...
	'ALDIDigitalServices',
	...
];

控制台

src/Pyz/Zed/Console/ConsoleDependencyProvider.php 中请注册

[...]
new LeanPublisherResynchronizationConsole(),
[...]

可用命令

docker/sdk console lean-publisher:sync $RESOURCE $IDS

其中 $RESOURCE 是您要发布的资源

而 $IDS 是要发布的实体 ID 列表,以逗号分隔

事件

src/Pyz/Zed/Event/EventDependencyProvider.php 中注册

[...]
$eventSubscriberCollection->add(new LeanPublisherEventSubscriber());
[...]

将您的模块连接到 Lean Publisher

如果您想将实体连接到 Lean Publisher,您需要遵循以下步骤

步骤 1:创建您的发布模块

我们建议以 "<ENTITY_NAME>Publish" 开头创建一个模块。例如 CategoryPublish,MerchantPublish 等。

步骤 2:创建一个新的队列 + 重试队列

src/Pyz/Zed/Queue/QueueDependencyProvider.php 中使用 LeanPublisherQueueMessageProcessorPlugin

[...]
<ENTITY_NAME>PublishConfig::PUBLISH_MY_ENTITY_QUEUE_NAME => new LeanPublisherQueueMessageProcessorPlugin(),
<ENTITY_NAME>PublishConfig::PUBLISH_MY_ENTITY_RETRY_QUEUE_NAME => new EventRetryQueueMessageProcessorPlugin()
[...]

步骤 3:在

src/Pyz/Client/RabbitMq/RabbitMqConfig.php 中添加

[...]
<ENTITY_NAME>PublishConfig::PUBLISH_<MY_ENTITY>_QUEUE_NAME => [
    static::ROUTING_KEY_RETRY => <ENTITY_NAME>PublishConfigConfig::PUBLISH_<ENTITY_NAME>_RETRY_QUEUE_NAME,
    static::ROUTING_KEY_ERROR => <ENTITY_NAME>PublishConfigConfig::PUBLISH_<ENTITY_NAME>_ERROR_QUEUE_NAME,
],
[...]

通过控制台命令设置新注册的队列。 docker/sdk console queue:setup

步骤 4:创建一个遵循 Lean Publisher 规范的数据库表

<?xml version="1.0"?>
<database xmlns="spryker:schema-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="zed"
          xsi:schemaLocation="spryker:schema-01 https://static.spryker.com/schema-01.xsd"
          namespace="Orm\Zed\<MyModule>\Persistence"
          package="src.Orm.Zed.<MyModule>.Persistence">

    <table name="MY_ENTITY_publish" identifierQuoting="true">
        <column name="id_MY_ENTITY_publish" required="true" type="INTEGER" autoIncrement="true"
                primaryKey="true"/>
        <column name="reference" required="true" type="VARCHAR" size="255"/>
        <column name="key_search" type="VARCHAR" size="255"/>
        <column name="key_storage" type="VARCHAR" size="255"/>
        <column name="data_search" type="LONGVARCHAR"/>
        <column name="data_storage" type="LONGVARCHAR"/>
        <column name="store" type="VARCHAR" size="128" required="true"/>

        <index name="MY_ENTITY_publish-reference">
            <index-column name="reference"/>
        </index>

        <unique name="MY_ENTITY_publish-unique-key_storage">
            <unique-column name="key_storage"/>
        </unique>
        <unique name="MY_ENTITY_publish-unique-key_search">
            <unique-column name="key_search"/>
        </unique>

        <id-method-parameter value="id_MY_ENTITY_publish_pk_seq"/>

        <behavior name="timestampable"/>
    </table>

</database>

通过控制台命令创建新表

docker/sdk console propel:schema:copy && docker/sdk console propel:model:build && docker/sdk console propel:diff && docker/sdk console propel:migrate && docker/sdk console transfer:entity:generate

步骤 5:创建一个实现 Lean Publisher 接口的 EventHandler 插件

步骤 6:注册 EventHandler

src/Pyz/Zed/LeanPublisher/LeanPublisherDependencyProvider.php::getEventHandlerPlugins()

return [
    [...]
    <ENTITY_NAME>PublishConfig::PUBLISH_<ENTITY_NAME>_QUEUE_NAME => new <ENTITY_NAME>PublishEventHandlerPlugin(),
    [...]
];

步骤 7:创建并注册 PublisherTriggerPlugin

创建一个实现 两者 PublisherTriggerPluginInterface 和 LeanPublisherTriggerPluginInterface 的 PublishTriggerPlugin,并在 \Pyz\Zed\Publisher\PublisherDependencyProvider::getPublisherTriggerPlugins 中设置它

return [
    [...]
     new <ENTITY_NAME>PublishPublisherTriggerPlugin(),
     [...]
];

步骤 8:设置处理事件的作业

根据您的设置,您可能需要添加 jenkins 作业或其他作业来处理来自您的 publish.ENTITY_NAME 队列的消息