Новое в Symfony 5.2: Перерасчет асинхронного кеша

Паника кэша — это тип каскадного сбоя, который может произойти, когда механизмы кэширования подвергаются очень высокой нагрузке. Компонент Symfony Cache обеспечивает встроенную защиту от паники за счет «вероятностного досрочного истечения срока действия».

При таком подходе каждый процесс, обращающийся к кэшированному значению, принимает решение о пересчете значения или нет. Это чисто вероятностное решение, вероятность которого возрастает по мере приближения срока действия значения кэша.

В Symfony 5.2 улучшили эту функцию, чтобы вы могли асинхронно пересчитывать значение кеша, отправляя его в шину сообщений (с помощью компонента Messenger). Сначала добавьте новую опцию early_expiration_message_bus в ваш пул кешей и определите имя шины, на которую будет отправлено сообщение:

# config/packages/cache.yaml
framework:
    cache:
        pools:
            test.cache:
                early_expiration_message_bus: messenger.default_bus

Затем направьте новое сообщение EarlyExpirationMessage в один из ваших транспортов:

# config/packages/messenger.yaml
framework:
    messenger:
        routing:
            'Symfony\Component\Cache\Messenger\EarlyExpirationMessage': amqp

Это оно. Symfony теперь будет отправлять сообщения всякий раз, когда значение кеша требует перерасчета. Пусть ваши рабочие будут воспринимать эти сообщения и выполнять работу. При использовании этой функции следует помнить о двух вещах:

  • Вы можете использовать вызываемые объекты только в форме [$someService, 'someMethod'], потому что замыкания PHP не могут быть сериализованы. Более того, чтобы это работало, служба должна быть общедоступной или должна реализовывать CallbackInterface для автоматической пометки как container.reversible;
  • Служба должна вычислить значение, используя только свой ключ кеша, который является единственной контекстной информацией, включенной в сообщение.