在Rails生产应用程序中清除列缓存是否安全?

4

运行是否安全

Klass.reset_column_information
Klass.connection.schema_cache.clear!

在Rails应用程序运行时进行生产吗?
我想要执行零停机部署,并在后台迁移完成后启动功能。后台迁移正在创建新表,因此它们会很快完成。
从我的简短调查中了解到,如果重新启动了Rails应用服务器并且尚未创建表,则Klass(当然继承自ActiveRecord::Base)将缓存表尚不存在的事实,在生产环境中启动Rails应用程序的急切加载过程期间。
只要在使用与Klass相关的特性的代码的某个部分中表不存在,我就希望检查是否存在名称为Klass.table_name的表,并尝试重新加载其模式。经过一段时间(分钟),表将通过后台迁移创建,稍后再重新加载模式,我就可以使用新功能了。
我不担心性能影响,因为这个特性并不经常使用,而且在迁移完成之前,它很可能不会被触发甚至一次。
TLDR:
部署Rails应用程序 重启Web服务器 开始运行后台迁移 功能不活动 完成运行后台迁移 功能活动
那就是该过程。
我知道我可以将其分成两个部分进行部署。在旧代码运行时添加新表,然后部署需要这些表的功能。但是,我想知道是否可以通过一次部署实现工作解决方案。我希望避免因新功能而进行两个部署以实现零停机部署。

当您有待处理的迁移时,进行零时间部署是非常棘手的。 - bronislav
1个回答

0

如果您没有未完成的迁移,此解决方案可用于零时间部署。迁移数据的必要性可能会给您带来意想不到的麻烦。 - bronislav
在正式上线之前,您应该在非生产环境中测试部署本身。使用 cap deploy:migrations 进行部署将确保在部署过程中为您运行迁移。 - Jon
你是对的。如果在迁移期间网站仍然可以访问,可能会导致数据库不一致。 - bronislav
我猜这取决于迁移。Capistrano还提供了在部署期间将站点置于“维护模式”的能力,以避免这些问题。 - Jon
是的,但它不会是零时间部署 :) - bronislav
1
在数据库模式更新或数据迁移方面,零停机部署并不存在。无论你有多快,都会有一个时期,应用程序要么需要不可用,要么需要锁定数据写入。但是,使用像 Capistrano 这样的自动化工具可以最大程度地减少这个问题。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接