Problem mit Produktindexierungen und dem ninepoint Shopware 6 Connector Plugin

Wir haben ein großes Problem bei welchem sich die queue für die Indexierung von Produkten schnell füllt bis einige Millionen Einträge vorhanden sind. Wir benutzen einen Redis Transport und einen cronjob um die async messages abzuarbeiten. Der Server ist potent kommt aber mit der Masse an Indexierungsjobs nicht hinterher.

Einträge in der Queue sehen beispielsweise so aus:

1) "1724998717074-0"
     2) 1) "message"
        2) "s:970:"{"body":"{\"data\":[\"01907e2082a3707ab6a6fb9e81efd80c\"],\"offset\":null,\"indexer\":\"product.indexer\",\"context\":{\"extensions\":[],\"languageIdChain\":[\"2fbb5fe2e29a4d70aa5854ce7ce3e20b\"],\"scope\":\"crud\",\"rulesLocked\":false,\"source\":{\"type\":\"admin-api\",\"isAdmin\":true,\"permissions\":[],\"userId\":null,\"integrationId\":\"0190113efd557926bc4246bd954d0914\"},\"ruleIds\":[],\"currencyId\":\"b7d2554b0ce847cd82f3ac9bd1c0dfca\",\"versionId\":\"0fa91ce3e96a4bc2be4bd9ce752c3425\",\"currencyFactor\":1.0,\"considerInheritance\":false,\"taxState\":\"gross\",\"rounding\":{\"extensions\":[],\"decimals\":2,\"interval\":0.01,\"roundForNet\":true}},\"skip\":[],\"forceQueue\":false,\"isFullIndexing\":false}","headers":{"type":"Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage","X-Message-Stamp-Symfony\\Component\\Messenger\\Stamp\\BusNameStamp":"[{\"busName\":\"messenger.bus.default\"}]","Content-Type":"application\/json"}}";"
 98) 1) "1724998717074-1"
     2) 1) "message"
        2) "s:1011:"{"body":"{\"data\":[\"0190ed9e776b718c95572841fe35dd82\"],\"offset\":null,\"indexer\":\"product.indexer\",\"context\":{\"extensions\":[],\"languageIdChain\":[\"2fbb5fe2e29a4d70aa5854ce7ce3e20b\"],\"scope\":\"crud\",\"rulesLocked\":false,\"source\":{\"type\":\"admin-api\",\"isAdmin\":true,\"permissions\":[],\"userId\":null,\"integrationId\":\"0190113efd557926bc4246bd954d0914\"},\"ruleIds\":[],\"currencyId\":\"b7d2554b0ce847cd82f3ac9bd1c0dfca\",\"versionId\":\"0fa91ce3e96a4bc2be4bd9ce752c3425\",\"currencyFactor\":1.0,\"considerInheritance\":false,\"taxState\":\"gross\",\"rounding\":{\"extensions\":[],\"decimals\":2,\"interval\":0.01,\"roundForNet\":true}},\"skip\":[\"product.inheritance\",\"product.stock\"],\"forceQueue\":false,\"isFullIndexing\":false}","headers":{"type":"Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage","X-Message-Stamp-Symfony\\Component\\Messenger\\Stamp\\BusNameStamp":"[{\"busName\":\"messenger.bus.default\"}]","Content-Type":"application\/json"}}";"
 99) 1) "1724998718087-0"
     2) 1) "message"
        2) "s:970:"{"body":"{\"data\":[\"01907e2082a3707ab6a6fb9e81efd80c\"],\"offset\":null,\"indexer\":\"product.indexer\",\"context\":{\"extensions\":[],\"languageIdChain\":[\"2fbb5fe2e29a4d70aa5854ce7ce3e20b\"],\"scope\":\"crud\",\"rulesLocked\":false,\"source\":{\"type\":\"admin-api\",\"isAdmin\":true,\"permissions\":[],\"userId\":null,\"integrationId\":\"0190113efd557926bc4246bd954d0914\"},\"ruleIds\":[],\"currencyId\":\"b7d2554b0ce847cd82f3ac9bd1c0dfca\",\"versionId\":\"0fa91ce3e96a4bc2be4bd9ce752c3425\",\"currencyFactor\":1.0,\"considerInheritance\":false,\"taxState\":\"gross\",\"rounding\":{\"extensions\":[],\"decimals\":2,\"interval\":0.01,\"roundForNet\":true}},\"skip\":[],\"forceQueue\":false,\"isFullIndexing\":false}","headers":{"type":"Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage","X-Message-Stamp-Symfony\\Component\\Messenger\\Stamp\\BusNameStamp":"[{\"busName\":\"messenger.bus.default\"}]","Content-Type":"application\/json"}}";"
100) 1) "1724998718087-1"
     2) 1) "message"
        2) "s:1011:"{"body":"{\"data\":[\"0190ed9e9bc47074acac3f6c35062de7\"],\"offset\":null,\"indexer\":\"product.indexer\",\"context\":{\"extensions\":[],\"languageIdChain\":[\"2fbb5fe2e29a4d70aa5854ce7ce3e20b\"],\"scope\":\"crud\",\"rulesLocked\":false,\"source\":{\"type\":\"admin-api\",\"isAdmin\":true,\"permissions\":[],\"userId\":null,\"integrationId\":\"0190113efd557926bc4246bd954d0914\"},\"ruleIds\":[],\"currencyId\":\"b7d2554b0ce847cd82f3ac9bd1c0dfca\",\"versionId\":\"0fa91ce3e96a4bc2be4bd9ce752c3425\",\"currencyFactor\":1.0,\"considerInheritance\":false,\"taxState\":\"gross\",\"rounding\":{\"extensions\":[],\"decimals\":2,\"interval\":0.01,\"roundForNet\":true}},\"skip\":[\"product.inheritance\",\"product.stock\"],\"forceQueue\":false,\"isFullIndexing\":false}","headers":{"type":"Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage","X-Message-Stamp-Symfony\\Component\\Messenger\\Stamp\\BusNameStamp":"[{\"busName\":\"messenger.bus.default\"}]","Content-Type":"application\/json"}}";"

Was mir aufgefallen ist, ist dass der Katalogexport teilweise über 24 Stunden lang läuft:

Gibt eine Möglichkeit Indexierungen global zu deaktivieren oder irgendwie abzuschalten? Dann könnte ich geregelt jede Stunde z.B. die Indexierung über die dal cli anstoßen.

Wir haben einen Workaround entwickelt mit einer Middleware in Shopware die das Indexieren bei sync api requests stoppt. Stattdessen triggern wir manuell die Indexierung von Produten wenn wir es benötigen.

class DisableIndexingMiddleware
{
    public function onKernelRequest(RequestEvent $event): void
    {
        $request = $event->getRequest();

        if ($request->getPathInfo() === '/api/_action/sync')
        {
            // https://shopware.stoplight.io/docs/admin-api/faf8f8e4e13a0-bulk-payloads#performance
            $request->headers->set('indexing-behavior', 'disable-indexing');
        }
    }
}