Rails Rails 项目多机部署后,job 中生成文件代码造成的困惑

eastrj · 2020年01月06日 · 最后由 hooopo 回复于 2020年01月06日 · 2746 次阅读
  • rails 项目是使用 2 台服务器部署的,共用一个数据库,使用 F5 做的负载均衡
  • 我们有个 job 任务,每天定时执行,这个 job 的作用是生成多个 doc 文件
  • 之前单台部署的时候是没有问题的
  • 现在的情况是:在 A 服务器上用 rails runner 执行 job 生成的 doc 文件不全,有的 doc 文件会生产到 B 服务器上!!!

job 里 生产 doc 的相关代码如下

today_orders = Order.where(created_on: Date.today)
today_orders.each do  |order|
  doc1 = Docx::Document.open("#{Rails.root}/vendor/example.docx")
  doc1.bookmarks['bookmark1'].insert_text_after(order.id) 
  doc1.save("#{Rails.root}/vendor/order_#{order.id}_detail.docx")
end

最后的结果就是 可能 A 服务器上有 order_1_detail.docx order_3_detail.docx B 服务器上有 order_2_detail.docx order_4_detail.docx 如果多跑几次结果还会不一样,完全没有规律

删减过度看不出来,10.times 都写在一个文件名,不是只有一个文件么?

Rei 回复

不好意思,实际代码比较长我随便写的,稍等我修改一下

定时 job 是用什么跑的,sidekiq 还是 whenever 之类?

Rei 回复

sidekiq

eastrj 回复
  1. 用了 sidekiq-cron,sidekiq-scheduler 还是其它?
  2. 先要知道,如果 A B 都跑有 sidekiq worker,在 A 服务器调用 delay job,是有可能在 B 服务器执行,但同一时间只在一个 woker 执行。现在问题是执行一次 job 分别在两边服务器都产生文件了么?
  3. 需要打一些日志,查询之后把 today_orders 的 ids 打印出来,写文件后把文件名打印出来。然后调用一次 delay job 分析执行情况。

因为你两台服务器都是 sidekiq 的 consumer,job 可能被被分配到任意一台执行

有个东西叫 nfs 或者云存储

需要 登录 后方可回复, 如果你还没有账号请 注册新账号