在应用程序部署过程中如何处理Doctrine的元数据缓存?
我们为atomic deployment应用程序使用 symfony 策略。到目前为止,我们一直使用效果很好的默认file
缓存方法。但是出于性能原因,我们希望切换到内存缓存,例如Redis / Memcached。
我们应该为每个发行版使用某种缓存ID前缀吗?例如,当发布新版本的软件时,部署脚本会预热应用程序并使用新的架构元数据填充缓存。如果部署失败,我们将进行回滚,并且元数据缓存仍将有效。
解决此问题的最佳方法是什么?我想避免在第一个请求进入并且还没有元数据缓存时出现CPU高峰。
答案 0 :(得分:2)
我们应该为每个版本使用某种缓存ID前缀吗?
是的,这是我使用过几次的方法。将代码存储在服务器上之后,就在进行切换之前,安装了供应商,并使用唯一的前缀预热了缓存。回滚将使用部署之前使用的缓存。
设置前缀可能很棘手,具体取决于您的环境。您的应用程序可能会从某个版本文件中读取内容,该文件仅包含唯一的版本标识符。您的部署可能会创建此文件。一种选择是使用当前HEAD的git哈希(如果标记版本,则使用tag)。避免依赖开发人员手动修改版本。
请记住,这种方法需要格外小心,以免填满所选缓存解决方案的存储空间。需要考虑的一些技巧:
答案 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中“冲洗”并且不影响其他环境。
希望有帮助!