Mieć rozproszoną aplikację SF3.3 działającą na wielu instancjach AWS EC2 z centralnym klastrem ElastiCache (redis).Pamięć podręczna wielu regionów z pamięcią podręczną Doctrine 2 second level i Symfony 3.3
Każda instancja EC2 uruchamia również lokalną instancję Redis, która jest używana do buforowania meta i zapytań Doctrine.
Ta aplikacja wykorzystuje pamięć podręczną drugiego poziomu Doctrines, która działa bardzo dobrze z funkcjonalnego punktu widzenia. Ale wydajność jest niska (ładowanie stron 900-1200ms) na AWS z powodu ponad 400 wywołań bufora podręcznego, które ładuje w naszych jednostkach Country i VatRate wymaganych na wielu naszych stronach.
Ponieważ te jednostki krajowe i VAT rzadko się zmieniają, chciałbym wykorzystać zarówno lokalną instancję Redis, jak i ElastiCache do buforowania wyników, używając różnych regionów zdefiniowanych w pamięci podręcznej drugiego poziomu. Powinno to zmniejszyć problem z latencją w przypadku wywołań w pamięci podręcznej 400+, ponieważ w przypadku ładowania jednej strony ładuje się mniej niż 100 ms. Czytanie dokumentacji to wszystko wydaje się możliwe, ale nie do końca pewna, jak skonfigurować go z Symfony i PHP-Cache.
Przykład obecnej konfiguracji:
APP/konfiguracji/config.yml
doctrine:
dbal:
# .. params
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
auto_mapping: true
second_level_cache:
enabled: true
region_cache_driver:
type: service
id: doctrine.orm.default_result_cache
cache_adapter:
providers:
meta: # Used for version specific
factory: 'cache.factory.redis'
options:
host: 'localhost'
port: '%redis_local.port%'
pool_namespace: "meta_%hash%"
result: # Used for result data
factory: 'cache.factory.redis'
options:
host: '%redis_result.host%'
port: '%redis_result.port%'
pool_namespace: result
cache:
doctrine:
enabled: true
use_tagging: true
metadata:
service_id: 'cache.provider.meta'
entity_managers: [ default ]
query:
service_id: 'cache.provider.meta'
entity_managers: [ default ]
result:
service_id: 'cache.provider.result'
entity_managers: [ default ]
src/AppBundle/jednostka/Country.php
/**
* @ORM\Table(name = "countries")
* @ORM\Cache(usage = "READ_ONLY")
*/
class Country
{
// ...
/**
* @var VatRate
*
* @ORM\OneToMany(targetEntity = "VatRate", mappedBy = "country")
* @ORM\Cache("NONSTRICT_READ_WRITE")
*/
private $vatRates;
// ...
}
src/AppBundle/Entity/VatRate.php
/**
* @ORM\Table(name = "vatRates")
* @ORM\Cache(usage = "READ_ONLY")
*/
class VatRate
{
// ...
/**
* @var Country
*
* @ORM\ManyToOne(targetEntity = "Country", inversedBy = "vatRates")
* @ORM\JoinColumn(name = "countryId", referencedColumnName = "countryId")
*/
private $country;
// ...
}
src/AppBundle/jednostka/Order.php
/**
* @ORM\Table(name = "orders")
* @ORM\Cache(usage = "NONSTRICT_READ_WRITE")
*/
class Order
{
// ...
/**
* @var Country
*
* @ORM\ManyToOne(targetEntity = "Country")
* @ORM\JoinColumn(name = "countryId", referencedColumnName = "countryId")
*/
private $country;
// ...
}
Próba konfiguracji
APP/konfiguracji/config.yml
doctrine:
dbal:
# .. params
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
auto_mapping: true
second_level_cache:
enabled: true
region_cache_driver: array
regions:
local:
type: service
service: "doctrine.orm.default_result_cache" # TODO: needs to be local redis
remote:
type: service
service: "doctrine.orm.default_result_cache" # TODO: needs to be remote redis
cache_adapter:
providers:
meta: # Used for version specific
factory: 'cache.factory.redis'
options:
host: 'localhost'
port: '%redis_local.port%'
pool_namespace: "meta_%hash%"
result: # Used for result data
factory: 'cache.factory.redis'
options:
host: '%redis_result.host%'
port: '%redis_result.port%'
pool_namespace: result
cache:
doctrine:
enabled: true
use_tagging: true
metadata:
service_id: 'cache.provider.meta'
entity_managers: [ default ]
query:
service_id: 'cache.provider.meta'
entity_managers: [ default ]
result:
service_id: 'cache.provider.result'
entity_managers: [ default ]
src/AppBundle/Entity/Country.php
/**
* @ORM\Table(name = "countries")
* @ORM\Cache(usage = "READ_ONLY", region = "local")
*/
class Country
{
// as above
}
src/AppBundle/Entity/VatRate.php
/**
* @ORM\Table(name = "vatRates")
* @ORM\Cache(usage = "READ_ONLY", region = "local")
*/
class VatRate
{
// as above
}
src/AppBundle/Entity/Order.php
/**
* @ORM\Table(name = "orders")
* @ORM\Cache(usage = "NONSTRICT_READ_WRITE", region = "remote")
*/
class Order
{
// as above
}
co skutkuje
Type error: Argument 1 passed to Doctrine\ORM\Cache\DefaultCacheFactory::setRegion() must be an instance of Doctrine\ORM\Cache\Region, instance of Cache\Bridge\Doctrine\DoctrineCacheBridge given,
Nie jestem pewien, dokąd się udać, pracowałem na testach tutaj: https://github.com/doctrine/DoctrineBundle/blob/74b408d0b6b06b9758a4d29116d42f5bfd83daf0/Tests/DependencyInjection/Fixtures/config/yml/orm_second_level_cache.yml, ale brak dokumentacji do konfiguracji sprawia, że jest to trochę trudniejsze!
Dzięki, problem polegał na próbie prawidłowego utworzenia tych usług. Jak wspomniano w moim komentarzu do todo na temat próby konfiguracji - app/config/config.yml – Nick