使用 Magento 2 处理大量归因
已发表: 2022-08-30使用 Magento 2 处理大量归因
扩展 Magento 2 的功能以支持大量总属性(超过 10,000 个)和每个属性集的大量属性(每组超过 1000 个)
介绍
2021 年,在线市场占全球电子商务的 67%。全球排名前 100 的在线市场花费了 3.23 万亿美元。 沃尔玛的市场拥有超过 100,000 名卖家,而亚马逊在其市场上销售近 3.5 亿种产品。 传统电子商务平台必须非常快速地扩展以处理他们现在需要处理的海量数据。
随着越来越多的卖家加入市场,提供的产品种类也越来越多。 这在不影响整体性能和易用性的情况下对这些产品进行分类带来了独特的挑战。 McFadyen Digital 团队在最近的市场实施过程中面临的一个挑战是处理卖家产品附带的众多产品属性。
我们在 Magento 和 Webkul 上为我们在美国销售工业紧固产品的一位客户实施了 B2B 市场。 随着越来越多的卖家加入,产品种类增加了,每个带来的独特产品属性的数量也增加了。 属性数量超出了 Magento 的建议,我们面临着严重的性能问题。 我们的技术专家对问题进行了详细分析,并提出了一些变通办法来处理这种情况。 我们将在本博客中讨论其中的几个。
.
产品进口:
Magento 建议将许多属性划分为多个属性集。 但是,如果属性集的数量也变得很大,则会对产品和属性导入的性能产生不利影响。 这是因为 Magento 将所有属性和属性集预加载到内存中。 例如,假设有 1000 个属性集,我们只导入产品的一个子集。 在这种情况下,Magento 仍然会加载所有可用的属性和属性集,这会增加内存消耗,从而增加导入处理时间。 导入产品时,会调用AbstractType init方法,该方法会加载产品数据库中所有可用的属性。 首先,加载所有属性,然后加载属性集,然后根据属性 id 排列这些属性。
供应商/magento/module-catalog-import-export/Model/Import/Product/Type/AbstractType

解决方案:
此问题的简单解决方法是仅从默认 CSV 文件加载所需的属性集 /products,而不是尝试进行完全导入。 例如,假设我们正在尝试导入单一类别的产品。 在这种情况下,我们仅从该类别加载属性,而不是将其余属性 /attributes 集加载到内存中。
为此,我们重写了 Simple Import 类型的init方法,如下所示:

这帮助我们显着提高了性能,导入时间减少了近 30%。
产品清单:
在访问任何类别页面时,Magento 将所有属性数据传递给 Elastic Search 以检索类别和聚合详细信息。 许多属性导致高内存消耗,导致性能下降。
FilterableAttributeList 类将加载一个类别中的所有属性和属性集,即使我们只需要过滤特定类别的属性子集。
供应商/magento/module-catalog/Model/Layer/Category/FilterableAttributeList
当我们使用 Elastic Search 连接时,请求必须使用两个参数构建,就像我们在 MySQL 中创建查询时所做的那样,
- 匹配参数
- 聚合,带来我们需要的所有数据
Magento 使用聚合作为图层导航并返回所有数据,因此当我们有大量数据时,聚合计数会增加。 当我们尝试在单个查询中获取更多聚合数据时,这将影响 Elastic Search。

这也可能导致平面实体表中的索引出现问题。 平面实体表不是每个属性集,因此是所有属性的聚合,可以运行到 MySQL 最大列限制。
从 MySQL 5.6.9 开始,最大列数为 1017,这将使 admin 产品编辑页面成为无法使用的爬网,从而严重影响前端产品的渲染。

Magento 的工作原理:
Magento 加载属性元数据,然后加载该属性的值。 实体必须将此信息存储在内存中。 但是,由于属性元数据存储在 Magento 缓存中,因此在第一页加载时会看到最坏的影响。

同样,KnockoutJS 不是为高性能而设计的。
解决方案:
由于 Magento 尝试传递单个类别的所有属性,因此覆盖请求构建器,缩小到与该类别相关的特定属性,并为该类别提供映射功能。 因此,每当加载类别页面时,我们只加载该类别的属性。
必须重写 create() 函数以创建基于类别搜索页面的动态请求,传递类别 ID 或品牌 ID 或卖家 ID。

根据 Magento 文档,产品属性的限制为 2000 个,可过滤的为 500 个。 超过 500 或超过 10k 的产品属性会在店面和 Magento 管理员中引入若干性能下降(包括报告的问题)。
综上所述,在处理大量产品属性时应牢记以下最佳实践:
- 对不同的产品使用不同的产品模板(属性集)。
- 在 Magento Admin 中,有一个“在产品列表中使用”字段。 仅启用我们计划在类别页面上启用的那些属性
- 利用自定义选项和复杂产品进行变化管理
- 最小化可搜索属性的数量
- 删除未使用的产品属性。
- 在外部 PMS 系统中存储和管理与商务无关的属性
虽然这些解决方案是作为解决实际问题的解决方案而引入的,但从长远来看,电子商务平台将不得不扩大规模,以应对在线市场带来的不断增加的产品数据量所带来的这些挑战。
在 McFadyen Digital,我们已经开发在线市场超过 15 年,并且不断接触可用平台。 我们为市场运营商提供的技术服务包括架构审查、供应商分析、实施等。 要了解更多信息,请访问我们的市场技术解决方案。 有关构建和管理定制 Commerce 商店所需的一切的更多信息。 访问 https://devdocs.magento.com/
关于作者
Sharada Rao 是 McFadyen Digital 的高级软件工程师。 她喜欢学习和实施新技术。 Sharada 是一名狂热的旅行者和美食家,喜欢探索新的地方。 她与丈夫和 11 个月大的儿子住在班加罗尔。 在 McFadyen Digital 任职期间,她参与了一些大型电子商务/市场实施项目。