Mehrere Regions-Caches mit Second Level-Cache Doctrine 2 und Symfony 3.3

9

Betreiben Sie eine verteilte SF3.3-Anwendung auf mehreren AWS EC2-Instanzen mit einem zentralen ElastiCache-Cluster (Redis).

Jede EC2-Instanz führt auch eine lokale Redis-Instanz aus, die für Doctrine-Meta und Query-Caching verwendet wird.

Diese Anwendung verwendet Doctrines Second Level Cache, was aus funktionaler Sicht sehr gut funktioniert. Aber die Leistung ist schlecht (900-1200ms Seitenladezeit) auf AWS aufgrund der mehr als 400 Cache-Aufrufe, die in unseren Länder- und VatRate-Entitäten geladen werden, die auf vielen unserer Seiten benötigt werden.

Da sich diese Land- und VatRate-Entitäten nur selten ändern, möchte ich sowohl die lokale Redis-Instanz als auch ElastiCache für das Ergebnis-Caching verwenden, indem Sie verschiedene Bereiche verwenden, die im Cache der zweiten Ebene definiert sind. Dies sollte das Latenzproblem bei den mehr als 400 Cache-Aufrufen reduzieren, da beim Laden auf einer einzigen Box die Ladezeiten unter 100 ms liegen. Das Lesen der Dokumentation scheint alles möglich zu sein, nur nicht ganz sicher, wie man es mit Symfony und PHP-Cache konfiguriert.

Ein Beispiel für die aktuelle Konfiguration:

app / config / config.yml

%Vor%

src / AppBundle / Entität / Land.php

%Vor%

Quelle / AppBundle / Entity / VatRate.php

%Vor%

src / AppBundle / Entität / Order.php

%Vor%

versuchte Konfiguration

app / config / config.yml

%Vor%

src / AppBundle / Entität / Land.php

%Vor%

Quelle / AppBundle / Entity / VatRate.php

%Vor%

src / AppBundle / Entität / Order.php

%Vor%

Was zu

führt %Vor%

Nicht allzu sicher, wo ich von hier aus weitergehen sollte, habe ich an den Tests gearbeitet: Ссылка , aber der Mangel an Dokumentation für die Konfiguration macht es ein wenig schwieriger!

    
Nick 27.09.2017, 10:37
quelle

2 Antworten

1

Nachdem Sie viel mit der PHP-Cache-Bibliothek experimentiert haben, sehen Sie im CacheBundle-Compiler, dass nur eine DoctrineBridge-Instanz aus der Konfiguration unterstützt wird. Ссылка

Lösung war, meinen eigenen Compiler zu erstellen, nicht hübsch, aber es scheint zu funktionieren.

src / AppBundle / DependencyInjektion / Compiler / DoctrineCompilerPass.php

%Vor%

src / AppBundle / AppBundle.php

%Vor%

app / config / config.yml

%Vor%

Obwohl dies in gewissem Maße zu funktionieren scheint, gibt es einige Inkonsistenzen, bei denen lokale Cache-Aufrufe zu 500 Fehlern führen, wenn wahrscheinlich etwas im Cache fehlt. Insgesamt glaube ich, dass ich versuche, den Second-Level-Cache mehr zu verbiegen als geplant.

    
Nick 12.10.2017 21:20
quelle
-1

Die Fehlermeldung, die Sie erhalten, spiegelt die Ursache Ihres Problems wider. Sie übergeben DoctrineCacheBridge instances (die zugrunde liegende Klasse von doctrine.orm.default_result_cache ), wenn Instanzen der Doctrine\ORM\Cache\Region -Schnittstelle erwartet werden:

%Vor%

In Ihrer früheren Konfiguration wurde der doctrine.orm.default_result_cache -Cache-Service als Standard-Cache über die Einstellung region_cache_driver festgelegt. \Doctrine\ORM\Cache\DefaultCacheFactory generiert Instanzen von DefaultRegion im Flug (da keine vorkonfiguriert wurden) und füttert den Standard-Cache für sie.

Es ist zu erwarten, dass die letztere Konfiguration vorkonfigurierte Regionen hat und auf verschiedene Arten repariert werden kann. Ich schlage das nächste vor:

%Vor%

Hier sagen Sie Doctrine, dass Sie 2 DefaultRegion regions unter den Schlüsseln local und remote erstellen und ihnen local_cache und remote_cache entsprechend übergeben.

Und es ist besser, region_cache_driver auf den vorherigen Wert zurückzusetzen, andernfalls DefaultRegion s, das beim Flug generiert wird, verwendet array cache:

%Vor%     
origaminal 10.10.2017 21:42
quelle

Tags und Links