原子部署期间的Doctrine元数据缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原子部署期间的Doctrine元数据缓存相关的知识,希望对你有一定的参考价值。

在应用程序部署期间如何处理Doctrine的元数据缓存?

我们在atomic deployment应用中使用策略。到目前为止,我们习惯使用默认的file缓存方法,该方法非常有效。但是,出于性能原因,我们希望切换到像Redis / Memcached这样的内存缓存。

我们应该为每个版本使用某种缓存ID前缀吗?例如,当发布新版本的软件时,部署脚本会加热应用程序并使用新的架构元数据填充缓存。如果部署失败,我们会进行回滚,元数据缓存仍然有效。

什么是最好的方法来解决这个问题?当第一个请求进入并且还没有元数据缓存时,我想避免CPU峰值。

答案

我们应该为每个版本使用某种缓存ID前缀吗?

是的,这是我多次使用过的方法。一旦代码在服务器上,就会在进行交换之前安装供应商,使用唯一的前缀加热缓存。回滚将使用部署之前使用的缓存。

设置前缀可能很棘手,具体取决于您的环境。您的应用程序可能从某个版本文件中读取,该文件只包含唯一的版本标识符。您的部署可能会创建此。一种选择是使用当前HEAD的git哈希(如果您标记版本,则使用标记)。避免依赖开发人员手动压缩版本。

请记住,这种方法需要特别注意不要填满您选择的缓存解决方案的存储空间。一些要考虑的技巧:

  • 缓存条目应具有生命周期(例如,使用Redis,确保条目有效期)
  • 从服务器中删除旧版本时,也应清除其缓存。
另一答案

这是我们的做法:

1)我们将应用程序部署到目标服务器(我们使用AWS托管。所以我们启动一个新实例,部署应用程序,完成后我们将主服务器更改为新的,准备好的服务器)

2)我们按此顺序清理缓存:

php bin/console doctrine:cache:clear-metadata --env=prod
php bin/console doctrine:cache:clear-query --env=prod
php bin/console cache:clear --env=prod

3)将预备实例带到生产中(作为LB上游)


如果应该回滚某些内容,我们会在新实例上进行回滚(公共视图无法访问)并再次清除缓存。如果一切顺利,我们将这台新服务器带到负载均衡器上游。

我们只使用缓存键进行分类,也使用缓存池来分组。我们得到了dev的redis,一个用于生产的一个redis,以便我们可以在每个redis-cli中“FLUSHALL”并且它不会影响其他环境。

希望能帮助到你!

以上是关于原子部署期间的Doctrine元数据缓存的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 与 Doctrine 中的一对多关系

我得到 - 错误:在缓存中找不到条目 - 在 sls 部署期间

如何缓存片段视图

Symfony 3.4没有元数据类来处理错误

在 Symfony 中防止 Doctrine 的查询缓存

没有要处理的元数据类。 php bin / console doctrine:schema:update --force