簡體   English   中英

Sidekiq作業未在Rails應用程序上持久保存數據

[英]Sidekiq jobs not persisting data on a rails app

我有以下設置,一個帶有nginx的ubuntu服務器-乘客,postgres數據庫,redis和sidekiq。

我已經設置了一個新貴工作來關注sidekiq流程。

description "Sidekiq Background Worker"

# no "start on", we don't want to automatically start
stop on (stopping workers or runlevel [06])

# change to match your deployment user
setuid deploy
setgid deploy

respawn
respawn limit 3 30

# TERM and USR1 are sent by sidekiqctl when stopping sidekiq.  Without declaring these as normal exit codes, it just respawns.
normal exit 0 TERM USR1

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv
exec /bin/bash <<EOT
  # use syslog for logging
  exec &> /dev/kmsg

  # pull in system rbenv
  export HOME=/home/deploy
  export RAILS_ENV=production
  source /home/deploy/.rvm/scripts/rvm

  cd /home/deploy/myapp/current
  bundle exec sidekiq -c 25 -L log/sidekiq.log -P tmp/pids/sidekiq.pid -q default -q payment -e production
EOT
end script

我實際上可以啟動,停止和重新啟動該過程。 我可以在sidekiq網站http監視器上看到該過程。 但是當我管理這名工人時,他們得到了處理。 這都是工人:

class EventFinishedWorker
  include Sidekiq::Worker

  def perform(event_id)
    event = Event.find(event_id)
    score_a = event.team_A_score
    score_b = event.team_B_score
    event.bets.each do |bet|
      if (score_a == bet.team_a_score) && (score_b == bet.team_b_score)
        bet.guessed = true
        bet.save
      end
    end
  end

end

class PayPlayersBetsWorker
  include Sidekiq::Worker
  sidekiq_options :queue => :payment

  def perform(event_id)
    event = Event.find(event_id)
    bets = event.bets.where(guessed: true)
    total_winning_bets = bets.count
    unless total_winning_bets == 0
      pot = event.pot
      amount_to_pay = pot / total_winning_bets

       unless bets.empty?
          bets.each do |bet|
            account = bet.user.account
            user = User.find_by_id(bet.user.id)
            bet.payed = true
            bet.save
            account.wincoins += amount_to_pay
            account.accum_wincoins.increment(amount_to_pay)
            account.save
            user.set_score(user.current_score)
          end
       end
    end
  end

end


2014-05-27T18:48:34Z 5985 TID-7agy8 EventFinishedWorker JID-33ef5d7e7de51189d698c1e7 INFO: start
2014-05-27T18:48:34Z 5985 TID-5s4rg PayPlayersBetsWorker JID-e8473aa1bc59f0b958d23509 INFO: start
2014-05-27T18:48:34Z 5985 TID-5s4rg PayPlayersBetsWorker JID-e8473aa1bc59f0b958d23509 INFO: done: 0.07 sec
2014-05-27T18:48:35Z 5985 TID-7agy8 EventFinishedWorker JID-33ef5d7e7de51189d698c1e7 INFO: done: 0.112 sec

運行兩個工作進程都沒有錯誤,但是...

檢查我的數據,EventFinishedWorker可以完成工作。 沒問題。 第二個工作PayPlayersBetsWorker不起作用。 但是當我進入控制台並執行類似操作時。

worker = PayPlayersBetsWorker.new

worker.perform(1)  

它可以正常運行工作。 我也檢測到,如果我直接從控制台運行sidekiq而不使用upstart,它也可以工作。

bundle exec sidekiq -P tmp/pids/sidekiq.pid -q default -q payment -e production

這可行。 問題似乎與新貴一起運行sidekiq。 幫助將不勝感激:D

看來您在兩個工作之間有競爭條件。 在PPBW查詢之前,EFW尚未完成,找不到任何內容並立即退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM