ActiveJob
是一个管理job的framework(框架):作用是提供一套Job管理接口,背后具体使用什么queue(队列)可以具体配置。 Job是与主线程并行运行,它的运行基于队列,一旦队列里面有东西,Job就会去消费队列里面的消息。
retry_on可以对特定的异常进行重做,可以规定重新尝试的次数,如果达到次数后还是失败,还可以定义block参数来执行最后的操作, 如果在最后的操作里面还是raise exception,那么这个exception传给上一层,同时引发两种情况:
- 如果这个Job包含在另一个Job2里面,那么Job2获得这个exception
- 如果这个Job绑定的queue还绑定了一个dead letter queue,那么Job当前处理的消息会转入dlq里面。 如果整个Job结束时候不显示的raise exception(不管Job是不是处理exception了),那么上一层不会收到exception,只会收到这个Job的result是true还是false; 消息也不会转入到绑定的dlq里面。
Migration实战
新添migration
例如,向User表添加新属性contacts对象,contact对象包括email和phone两个string属性。
第一步:建立migration file rails generate migration CreateContacts email:string phone:string rails generate migration add_contacts_to_user contacts:string
第二步:打开之前创建的migration file做进一步具体修改
第三步:运行migration file rake db:migrate
第四步:查看sql定义结构是不是已经更新
删除migration
第一步:回退到要删除的migration版本xx+1的上一个版本xx rake db:migrate VERSION = xx
第二步:删除不需要的migration文件xx+1
第三步:继续migration,把xx+1之后的版本部署好 rake db:migrate
migration实战
不要轻易做production环境的migration,因为数据量太大,运行结果是未知的。在migration的时候,会导致整个的表被锁住,导致整个数据库服务不可用。 如果要做:
- migration尽可能少,能分开的尽量分开,不要一次性做太多改动
- 避免index创建,index创建也要分开一步步做。因为创建index时候会扫描整个表,非常耗时。
- 不要做直接属性修改,因为一旦失败由于数据进来了,导致不能回退,也会导致其他关联的相关数据转化崩溃; 正确做法是创建新的属性,然后使用trigger使得两者之间更新同步,然后回填新的属性,然后删除旧属性,最后把新属性改名成旧属性。
- 一旦migrate失败,立即要revert掉,防止后续的无法挽回的错误。