rails console 可以用reload!来重新加载所有的源文件,方便一边开发一边调试。原理是清除掉所有的常量,下次使用的时候会再自动加载。
reload!
我在想,是否可以在生产环境下面这样做(config.cache_classes=true),平时不开启这样的功能,更新了代码之后,手动触发一个force_reload!,之后代码就更新了?
config.cache_classes=true
force_reload!
tmp/restart.txt
@wuwx 这种是容器级别的重启,会有 downtime。。
unicorn 这类容器都可以做到 gracefully restart 吧
Unicorn, Passenger 4 的重启都是无缝的,只是重启期间需要 2 倍内存。
#2 楼 @linjunhalida 应该没有 downtime 啊,除非你的应用压力太大,一段时间的不响应会导致 OS 的 socket 队列过长而开始丢包。如果已经是这个情况了,那你应该前面有一个 LB 顶着,然后后端轮流升级才对。
是的,unicorn 这类是可以做到无缝重启,我是看到 reload! 这个功能后,想到可以在 ruby 进程里面实现重启。所以问一下大家。
unicorn 的重启是热重启吧,加了 Gem 或者修改了配置需要关闭进程后再启动才有效
#8 楼 @sanivbyfish Unicorn 虽然是热重启,但是项目过大的时候,重启的瞬间 (几秒钟) 是卡住的
config.cache_classes 关掉会有性能问题,另外生产环境这样 reload 会产生不可预知的结果。
好的办法是使用集群分批重启(分批下线,重启,上线)
你以为你用的是 Erlang 啊。
感觉又回到了我的某个论调..."运维是成本和技术上的平衡".......套过来说的就是与其花时间研究如何在 ruby 里面 reload(全部 reload 相当于重启,部分 reload 则不知道哪些需要 reload, 以及 reload 的顺序), 不如在更通用的层面上统一解决这个问题 (比如大集群分批重启,或者小集群使用提供的无缝重启功能)
如果你在产品环境 config.cache_classes = true 那么每一次请求都会让你的代码重载一次。性能将成为悲剧
config.cache_classes = true