Có một ứng dụng SF3.3 được phân phối chạy trên nhiều cá thể AWS EC2 với một cụm ElastiCache trung tâm (redis).Nhiều vùng lưu trữ với Doctrine 2 cache cấp hai và Symfony 3.3
Mỗi cá thể EC2 cũng chạy một phiên bản Redis cục bộ được sử dụng cho siêu dữ liệu và truy vấn bộ đệm Doctrine.
Ứng dụng này sử dụng Doctrines Second Level Cache, hoạt động rất tốt từ quan điểm chức năng. Nhưng hiệu suất là tải (900-1200ms trang) kém trên AWS do có hơn 400 cuộc gọi bộ nhớ cache mà nó làm cho tải ở các quốc gia và các thực thể VatRate của chúng tôi được yêu cầu trên nhiều trang của chúng tôi.
Vì các thực thể Quốc gia và VatRate này hiếm khi tôi muốn sử dụng cả phiên bản Redis cục bộ và ElastiCache để lưu trữ kết quả bằng cách sử dụng các vùng khác nhau được xác định trong bộ nhớ cache cấp thứ hai. Điều này sẽ làm giảm vấn đề độ trễ với hơn 400 cuộc gọi bộ nhớ cache như khi chạy trên một trang tải hộp duy nhất là 100ms phụ. Đọc tài liệu này tất cả có vẻ là có thể, chỉ cần không hoàn toàn chắc chắn làm thế nào để cấu hình nó với Symfony và PHP-Cache.
Một ví dụ về cấu hình hiện tại:
app/config/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/Entity/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/Entity/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;
// ...
}
Cấu hình Cố gắng
app/config/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
}
mà kết quả trong
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,
Không quá chắc chắn nơi cần đi từ đây, được làm việc từ các bài kiểm tra ở đây: https://github.com/doctrine/DoctrineBundle/blob/74b408d0b6b06b9758a4d29116d42f5bfd83daf0/Tests/DependencyInjection/Fixtures/config/yml/orm_second_level_cache.yml nhưng thiếu tài liệu để định cấu hình điều này làm cho nó khó khăn hơn một chút!
Cảm ơn, sự cố đã cố gắng tạo các dịch vụ đó một cách chính xác. Như đã đề cập trong nhận xét todo của tôi về cấu hình đã cố gắng - app/config/config.yml – Nick