Indexelő és üzenetsor

Mi történik egy termékmentés után? Az Adobe Commerce a kirakatot nem a forrás-táblákból, hanem előre számolt indexekből szolgálja ki, a külső rendszerekkel pedig üzenetsoron át beszél. Állíts össze egy műveletsort: a szerver PHP-ben, minden kérésnél a nulláról lefuttatja mindkét indexelő-üzemmódban, és lépésenként, időméréssel mutatja, hol tart az adat.

Műveletsor

Háromszor mentett termék
Csoportos árváltozás
Letiltás, készlet, átnevezés

#1

Művelet
Mező

#2

Művelet
Mező

#3

Művelet
Kategória

#4

Művelet
Mező
Új érték

#5

Művelet

indexer_update_all_views: feldolgozza a változásnaplókat

5/25
Kötegméret (batch)

Hány entity_id-t indexel egyszerre a cron

// Update by Schedule: a mentés csak a forrást írja,
// a trigger a változásnaplóba jegyzi az entity_id-t
$changelog->insert($id);                // <indexer>_cl

// cron: indexer_update_all_views
$pending = $changelog->pendingIds($toVersion); // DISTINCT entity_id
foreach (array_chunk($pending, $batchSize) as $batch) {
    $indexer->reindexList($store, $batch);     // részleges újraindexelés
}
$changelog->setStateVersion($toVersion);       // mview_state.version_id

Miért kell indexelő, és mi a különbség a két üzemmód között?

Az Adobe Commerce a kategória-oldalt, a keresést és az árakat nem a normalizált (EAV) termék-táblákból számolja minden kérésnél, hanem előre felépített indexekből: ár vevőcsoportonként, készlet-státusz, kategória-termék kapcsolat, keresőindex. Az indexelők feladata, hogy ezeket szinkronban tartsák a forrással.

"Update on Save" módban a mentés maga futtatja le az érintett indexelőket: az index azonnal friss, de minden mentés lassabb, és egy tömeges módosítás (import, csoportos árváltozás) termékenként külön indexelést indít.

"Update by Schedule" módban a feliratkozott táblákon ülő adatbázis-triggerek csak a változásnaplóba (<indexer>_cl) jegyzik az entity_id-t. Az indexer_update_all_views cron-feladat a legutóbb feldolgozott verzió óta érkezett különböző azonosítókat kötegekben indexeli újra (a kötegméret indexelőnként állítható, alapértéke 1000). Ugyanaz a termék háromszor mentve így csak egyszer indexelődik.

Az ára: a mentés és a következő cron-futás között a kirakat még a régi adatot mutatja (a demóban ez a narancs "elavult" jelzés). Sokat importáló, nagy katalógusú áruháznál ennek ellenére az ütemezett mód a bevett választás, rendszeres, egymást át nem fedő cron-futtatással.

A demó tudatosan egyszerűsít: négy indexelő fut a memóriában, és minden mentés az összes feliratkozott indexelőt érinti. A valódi rendszerben az indexek adatbázis-táblák, a keresőindex OpenSearch-ben él, és jóval több indexelő van.