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

时间:2014-01-19 13:43:36

标签: ruby-on-rails rails-migrations

运行是否安全

Klass.reset_column_information
Klass.connection.schema_cache.clear!
在rails应用程序运行时

正在生产中?

我希望实现零停机部署,并在后台迁移完成运行后启动功能。后台迁移正在创建新表,以便快速完成。

从我在短期研究中收集到的内容。如果我的Rails应用服务器重新启动并且尚未创建表,Klass(当然继承自ActiveRecord::Base)将在启动Rails的急切加载过程中缓存表尚未存在的事实应用程序在生产中。

只要当我的部分代码使用与Klass相关的功能时,该表不存在,我想检查是否存在名为Klass.table_name的表,并尝试重新加载其架构。在一段时间(分钟),表将由后台迁移创建,最后一次重新加载模式,我可能正在使用我的新功能。

我不担心性能影响,因为此功能不经常使用,并且很可能在迁移完成之前甚至不会触发一次。

TLDR:

  • 部署rails app
  • 重新启动网络服务器
  • 开始运行后台迁移
  • 功能无效
  • 完成后台迁移
  • 功能有效

那将是程序。

我知道我可以把它分成两个部署。在旧代码运行时在后台添加新表,然后部署需要这些表的功能。但我想知道我是否可以通过一次部署获得可行的解决方案。我想避免为新功能进行两次部署,只是为了实现零停机时间。

1 个答案:

答案 0 :(得分:0)

您应该查看Capistrano,它会提供您正在寻找的所有功能。

  • 将新代码部署到新目录(不是实时)
  • 运行待定迁移
  • 运行任何其他部署任务,例如资产编译等
  • 使用符号链接
  • 将“实时”网站重新指向新代码
  • 重新启动应用服务器

这是项目:

https://github.com/capistrano/capistrano

这是一个很好的教程(需要专业会员资格):

http://railscasts.com/episodes/373-zero-downtime-deployment