Magento 2 で大量の属性を処理する

公開: 2022-08-30

Magento 2 で大量の属性を処理する

Magento 2 機能を拡張して、多数の合計属性 (10,000 を超える) および属性セットごとの多数の属性 (セットごとに 1000 を超える) をサポートします。

序章

オンライン マーケットプレイスは、2021 年に世界の e コマースの 67% を占めました。トップ 100 のオンライン マーケットプレイスでは、世界中で 3 兆 2,300 億ドルが費やされました。 ウォルマートのマーケットプレイスには 100,000 を超える売り手がいますが、Amazon はそのマーケットプレイスで 3 億 5000 万近くの製品を販売しています。 従来の e コマース プラットフォームは、現在処理する必要がある膨大な量のデータを処理するために、非常に高速にスケールアップする必要があります。

ますます多くの売り手が市場に参入するにつれて、提供される製品の品揃えが増えます。 これにより、全体的なパフォーマンスと使いやすさに影響を与えることなく、これらの製品を分類する際に固有の課題が生じます。 McFadyen Digital チームが最近のマーケットプレイスの実装中に直面したそのような課題の 1 つは、販売者の製品に付属する多数の製品属性を処理することでした。

米国で工業用ファスニング製品を販売しているクライアントの 1 社のために、Magento と Webkul に B2B マーケットプレイスを実装しました。 より多くの売り手が参加するにつれて、製品の品揃えが増え、それぞれがもたらすユニークな製品属性の数も増えました. 属性数が Magento の推奨値を超えたため、重大なパフォーマンスの問題に直面しました。 当社の技術専門家が問題の詳細な分析を行い、状況を処理するためのいくつかの回避策を講じることができました。 このブログでは、これらのいくつかについて説明します。

.

製品の輸入:

Magento では、多くの属性を複数の属性セットに分割することをお勧めします。 ただし、属性セットの数も多くなると、製品および属性のインポートのパフォーマンスに悪影響を及ぼします。 これは、Magento がすべての属性と属性セットをメモリにプリロードするために発生します。 たとえば、1000 の属性セットがあり、製品のサブセットのみをインポートするとします。 その場合でも、Magento は利用可能なすべての属性と属性セットをロードするため、メモリ消費量が増加し、インポート処理時間が長くなります。 製品をインポートすると、 AbstractType initメソッドが呼び出され、製品データベースで使用可能なすべての属性がロードされます。 最初にすべての属性がロードされ、次に属性セットがロードされ、属性 ID に基づいて配置されます。

ベンダー/マジェント/モジュール-カタログ-インポート-エクスポート/モデル/インポート/製品/タイプ/AbstractType

解決:

この問題の簡単な回避策は、完全なインポートを試みるのではなく、デフォルトの CSV ファイルから必要な属性セット /products のみをロードすることです。 たとえば、製品の 1 つのカテゴリをインポートしようとしているとします。 その場合、そのカテゴリからのみ属性をロードし、残りの属性 /attributes セットはメモリにロードしません。

このために、Simple Import タイプのinitメソッドを次のようにオーバーライドします。

これにより、パフォーマンスが大幅に向上し、インポートにかかる時間が約 30% 短縮されました。

製品リスト:

カテゴリ ページにアクセスすると、Magento はすべての属性データを Elastic Search に渡し、カテゴリと集計の詳細を取得します。 多くの属性がメモリ消費量の増加につながり、パフォーマンスが低下します。

FilterableAttributeList クラスは、特定のカテゴリでフィルタリングするために必要な属性のサブセットしかない場合でも、カテゴリ内のすべての属性および属性セットをロードします。

vendor/magento/module-catalog/Model/Layer/Category/FilterableAttributeList

Elastic Search に接続する場合、クエリを作成するときに MySQL で行うように、リクエストを 2 つのパラメーターで作成する必要があります。

  1. パラメータの一致
  2. 必要なすべてのデータをもたらす集約

Magento はレイヤー ナビゲーションとして集計を使用し、すべてのデータを返すため、大量のデータがあると集計カウントが増加します。 これは、1 つのクエリでより多くの集計データを取得しようとすると、Elastic Search に影響を与えます。

これにより、フラット エンティティ テーブルでのインデックス作成でも問題が発生する可能性があります。 フラット エンティティ テーブルは属性セットごとではないため、すべての属性の集約であり、MySQL の最大列制限に達する可能性があります。

MySQL 5.6.9 の時点で、列の最大数は 1017 です。これにより、管理製品編集ページが使用できなくなり、フロント エンドでの製品のレンダリングに深刻な影響を与えます。

Magento のしくみ:

Magento は属性メタデータをロードしてから、その属性の値をロードします。 エンティティは、この情報をメモリに保存する必要があります。 ただし、属性メタデータは Magento キャッシュに保存されるため、最初のページの読み込みで最悪の影響が見られます。

繰り返しますが、KnockoutJS は高性能を目的として設計されていません..

解決:

Magento は 1 つのカテゴリのすべての属性を渡そうとするため、リクエスト ビルダーをオーバーライドし、カテゴリに関連する特定の属性に絞り込み、カテゴリにマッピング機能を提供します。 そのため、カテゴリ ページが読み込まれるたびに、そのカテゴリの属性のみが読み込まれます。

Create () 関数をオーバーライドして、カテゴリ検索ページに基づいて動的リクエストを作成し、カテゴリ ID、ブランド ID、または販売者 ID を渡す必要があります。

Magento のドキュメントによると、製品属性の制限は 2000 で、500 がフィルター可能です。 500 を超える、または 10,000 を超える製品属性により、ストアフロントと Magento 管理者 (報告された問題を含む) でいくつかのパフォーマンスが低下します。

要約すると、多数の製品属性を処理する際には、次のベスト プラクティスを念頭に置く必要があります。

  • 製品ごとに異なる製品テンプレート (属性セット) を使用します。
  • Magento Admin には、「Use in Product Listing」というフィールドがあります。 カテゴリ ページで有効にする予定の属性のみを有効にする
  • バリエーション管理にカスタムオプションと複雑な製品を活用
  • 検索可能な属性の数を最小限に抑える
  • 未使用の製品プロパティを削除します。
  • 外部の PMS システムで非コマース関連の属性を保存および管理する

これらのソリューションは実際の問題の回避策として導入されましたが、長期的には、e コマース プラットフォームは、オンライン マーケットプレイスに付随する増え続ける製品データによってもたらされるこれらの課題に対処するためにスケールアップする必要があります。

McFadyen Digital では、15 年以上にわたってオンライン市場を開発しており、利用可能なプラットフォームに常にさらされています。 マーケットプレイス オペレーター向けのテクノロジー サービスには、アーキテクチャ レビュー、ベンダー分析、実装などが含まれます。 詳細については、当社のマーケットプレイス テクノロジー ソリューションをご覧ください。 カスタマイズされた Commerce ストアを構築および管理するために必要なすべての情報については、. https://devdocs.magento.com/ にアクセスしてください

著者について

Sharada Rao は、McFadyen Digital のシニア ソフトウェア エンジニアです。 彼女は新しい技術を学び、実装するのが好きです。 熱心な旅行者で美食家でもある Sharada は、新しい場所を探索するのが好きです。 彼女は夫と生後 11 か月の息子と一緒にバンガロールに滞在しています。 McFadyen Digital に勤務している間、彼女はいくつかの高額な e コマース/マーケットプレイス実装プロジェクトに参加してきました。