Symfony 原子部署期间的条令元数据缓存

Symfony 原子部署期间的条令元数据缓存,symfony,php,caching,deployment,doctrine,Symfony,Php,Caching,Deployment,Doctrine,在应用程序部署期间,如何处理Doctrine的元数据缓存 我们在应用程序中使用该策略。到目前为止,我们一直使用默认的文件缓存方法,这种方法工作得非常好。然而,出于性能原因,我们希望切换到内存中的缓存,如Redis/Memcached 我们应该为每个版本使用某种缓存ID前缀吗?例如,当发布新版本的软件时,部署脚本会预热应用程序,并用新的模式元数据填充缓存。如果部署失败,我们将执行回滚,元数据缓存仍然有效 最好的方法是什么?我希望在第一个请求到达并且还没有元数据缓存时避免CPU峰值。我们就是这样做的

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

我们在应用程序中使用该策略。到目前为止,我们一直使用默认的文件缓存方法,这种方法工作得非常好。然而,出于性能原因,我们希望切换到内存中的缓存,如Redis/Memcached

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

最好的方法是什么?我希望在第一个请求到达并且还没有元数据缓存时避免CPU峰值。

我们就是这样做的:

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上游交付生产

如果应该回滚某些内容,我们将对公共视图无法访问的新实例进行回滚预处理,然后再次清除缓存。如果一切顺利,我们将把这个新服务器带到loadbalancer上游

我们只使用缓存键进行分类,也使用缓存池进行分组。我们有一个用于开发的redis,一个用于登台,一个用于生产,这样我们就可以在每个redis cli中使用它,而不会影响其他环境

希望有帮助

我们就是这样做的:

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上游交付生产

如果应该回滚某些内容,我们将对公共视图无法访问的新实例进行回滚预处理,然后再次清除缓存。如果一切顺利,我们将把这个新服务器带到loadbalancer上游

我们只使用缓存键进行分类,也使用缓存池进行分组。我们有一个用于开发的redis,一个用于登台,一个用于生产,这样我们就可以在每个redis cli中使用它,而不会影响其他环境

希望有帮助

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

是的,我已经用过好几次了。一旦代码在服务器上,安装了供应商,在切换之前,使用唯一的前缀预热缓存。回滚将使用部署之前使用的缓存

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

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

缓存项应该有一个生存期,例如,对于Redis,请确保这些项有一个到期日 从服务器中删除旧版本时,还应清除其缓存。 我们应该为每个版本使用某种缓存ID前缀吗

是的,我已经用过好几次了。一旦代码在服务器上,安装了供应商,在切换之前,使用唯一的前缀预热缓存。回滚将使用部署之前使用的缓存

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

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

缓存项应该有一个生存期,例如,对于Redis,请确保这些项有一个到期日 从服务器中删除旧版本时,还应清除其缓存。
谢谢,但我担心这个策略对我没有任何用处,因为我的应用程序没有负载平衡。我的答案不是关于负载平衡,这只是一个例子。我只想告诉你,你只能:部署->清除缓存->如果出错->使用新部署回滚部署->再次清除缓存。你的方法将导致CPU峰值。请求将在缓存出现之前命中应用程序。你的情况和我的不同,你不会在一台服务器上进行原子部署。我理解,但使用单台服务器,你无法在depl之前对目标进行预处理和预热
哦。你可以试试局部热身,但那不是个好主意。我认为只需一个简单的提示,您就可以:部署->清除并预热。我看没有别的办法,让我们等别人吧!我不同意。本地缓存可以像往常一样进行预热,因为它在本地保存在部署目录中。如果每个新模式都有自己的缓存id,那么也可以在不接触当前模式的情况下对其进行预热。我希望得到一个和我们一样的人的回应。你的部署策略完全不同。谢谢,但我担心这个策略对我没有任何用处,因为我的应用程序没有负载平衡。我的答案不是关于负载平衡,这只是一个例子。我只想告诉你,你只能:部署->清除缓存->如果出错->使用新部署回滚部署->再次清除缓存。你的方法将导致CPU峰值。请求将在缓存出现之前命中应用程序。你的情况和我的不同,你不能在一台服务器上进行原子部署。我理解,但使用单台服务器,你不能在部署前对目标进行预处理和预热。你可以试试局部热身,但那不是个好主意。我认为只需一个简单的提示,您就可以:部署->清除并预热。我看没有别的办法,让我们等别人吧!我不同意。本地缓存可以像往常一样进行预热,因为它在本地保存在部署目录中。如果每个新模式都有自己的缓存id,那么也可以在不接触当前模式的情况下对其进行预热。我希望得到一个和我们一样的人的回应。您的部署策略完全不同。如果您使用的是symfony/dotenv>=4.2,您可以让部署脚本将版本转储到.env.prod.local文件,然后您的条令配置可以读取env var以添加前缀。谢谢你有没有关于如何更改doctrine metadata/dql等缓存的缓存id的示例?我手头没有示例,抱歉,请查看网站上的文档。将名称空间选项设置为类似于%envCACHE\u PREFIX%的值,其中CACHE_PREFIX配置了一个唯一的键。好的,我最终创建了一个控制台命令:1检查Redis中的当前架构版本我将此值存储在那里2如果当前架构版本更大,那么我在部署期间调用CACHE clear如果您使用的是symfony/dotenv>=4.2,您可以让部署脚本将版本转储到.env.prod.local文件,然后您的条令配置可以读取env var以添加前缀。谢谢你有没有关于如何更改doctrine metadata/dql等缓存的缓存id的示例?我手头没有示例,抱歉,请查看网站上的文档。将名称空间选项设置为类似于%envCACHE\u PREFIX%的值,其中CACHE\u PREFIX配置了一个唯一的键。确定后,我创建了一个控制台命令:1检查Redis中的当前架构版本我将此值存储在那里2如果当前架构版本更大,则在部署期间调用CACHE clear