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

时间:2019-04-26 07:13:18

标签: php symfony caching deployment doctrine

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

我们为atomic deployment应用程序使用 策略。到目前为止,我们一直使用效果很好的默认file缓存方法。但是出于性能原因,我们希望切换到内存缓存,例如Redis / Memcached。

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

解决此问题的最佳方法是什么?我想避免在第一个请求进入并且还没有元数据缓存时出现CPU高峰。

2 个答案:

答案 0 :(得分:2)

  

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

是的,这是我使用过几次的方法。将代码存储在服务器上之后,就在进行切换之前,安装了供应商,并使用唯一的前缀预热了缓存。回滚将使用部署之前使用的缓存。

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

请记住,这种方法需要格外小心,以免填满所选缓存解决方案的存储空间。需要考虑的一些技巧:

  • 缓存条目应具有生存期(例如,使用Redis,请确保条目过期)
  • 从服务器中删除旧版本时,也应清除其缓存。

答案 1 :(得分:1)

这是我们的工作方式:

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上游)


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

我们仅使用缓存键进行分类,还使用了用于对事物进行分组的缓存池。我们为开发人员准备了一个redis,用于为生产准备一个redis,以防万一我们可以在每个redis-cli中“冲​​洗”并且不影响其他环境。

希望有帮助!