标签: sidekiq

启动Sidekiq的问题

我正在尝试在我的rails应用程序中使用新的Sidekiq gem,但是当我运行时,sidekiq我得到:

Booting sidekiq 0.5.1 with Redis at redis://localhost:6379/0
/Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/task.rb:56: [BUG] Bus Error
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.2.0]

-- control frame ----------
c:0010 p:---- s:0034 b:0034 l:000033 d:000033 CFUNC  :resume
c:0009 p:0018 s:0030 b:0030 l:000029 d:000029 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/task.rb:56
c:0008 p:0081 s:0025 b:0025 l:000c40 d:000c40 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:181
c:0007 p:0052 s:0021 b:0021 l:000020 d:000020 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:130
c:0006 p:0061 s:0015 b:0015 l:001db0 d:000014 BLOCK  /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:89
c:0005 p:---- s:0013 b:0013 l:000012 d:000012 FINISH
c:0004 p:---- s:0011 b:0011 l:000010 d:000010 CFUNC …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 sidekiq

0
推荐指数
1
解决办法
1090
查看次数

在rails中使用sidekiq时未定义的方法`perform_asynch'

我写了一个工人:

class XmlParseWorker

  include Sidekiq::Worker
  sidekiq_options queue: "parsing"

  def perform
   ........
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试在控制台中运行它时:

XmlParseWorker.perform_asynch()
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

NoMethodError: undefined method `perform_asynch' for XmlParseWorker:Class
Run Code Online (Sandbox Code Playgroud)

我已将sidekiq添加到我的gemfile中:

gem 'sidekiq'
gem 'sinatra' , require: false
gem 'slim'
Run Code Online (Sandbox Code Playgroud)

并运行捆绑安装.

我跑了redis:

redis-server
Run Code Online (Sandbox Code Playgroud)

和sidekiq队列:

bundle exec sidekiq -q parsing
Run Code Online (Sandbox Code Playgroud)

但我甚至没有在sideqik网站管理员中看到它.

有任何想法吗?

ruby ruby-on-rails redis sidekiq

0
推荐指数
1
解决办法
1595
查看次数

如何在发动机厂启动sidekiq

我正在将一个rails3应用程序从heroku转移到引擎码.我想知道如何在每个部署的引擎码上启动(或重新启动)sidekiq?要检查sidekiq是否正常工作,我ssh到EY实例并手动启动sidekiq.我希望从EY部署脚本(config/deploy.yml)处理此过程.我习惯于mina部署和EC2.

deployment engineyard ruby-on-rails-3 sidekiq

0
推荐指数
1
解决办法
1239
查看次数

关于幂等性和函数的基本 Sidekiq 问题

我正在使用 Sidekiq 在后台执行一些繁重的处理。我在网上查了一下,但找不到以下问题的答案。我在用:

Class.delay.use_method(listing_id) 
Run Code Online (Sandbox Code Playgroud)

然后,在课堂上,我有一个

self.use_method(listing_id)
    listing = Listing.find_by_id listing_id
    UserMailer.send_mail(listing)
    Class.call_example_function()
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 如何使这个函数对 UserMailer sendmail 是幂等的?换句话说,如果延迟方法运行两次,我如何确保它只发送一次邮件?会把它包装成这样的工作吗?

    mail_sent = false if !mail_sent UserMailer.send_mail(listing) mail_sent = true end

我猜不是,因为再次尝试该函数,然后第二次运行时将 mail_sent 设置为 false。那么如何才能让 UserMailer 只运行一次。

  1. 在延迟异步方法中调用的函数是否也是异步的?换句话说, Class.call_example_function() 是否异步执行(不是响应/请求周期的一部分?)如果不是,我应该使用 Class.delay.call_example_function()

总的来说,只是熟悉 Sidekiq,所以任何想法都将不胜感激。

谢谢

ruby multithreading idempotent sidekiq

0
推荐指数
1
解决办法
1442
查看次数

无法将params传递给sidekiq

我正在为控制器操作构建一个worker,但是由于我在perform方法中调用params,sidekiq将无法启动.有关如何使其工作的任何想法?

调节器

def call_warrants_with_date_range
  CallLogWorker.perform_async(params[:call_log])
  redirect_to call_logs_path, notice: 'Calls were successfully made.'
end
Run Code Online (Sandbox Code Playgroud)

工人

class CallLogWorker
  include Sidekiq::Worker

  def perform(params[:call_log])
    client         = Twilio::REST::Client.new TWILIO_ACCOUNT_SID, TWILIO_ACCOUNT_AUTH_TOKEN
    start_date         = params[:call_log][:warrant_start_date]
    end_date           = params[:call_log][:warrant_end_date]
    query = "SELECT people.id, warrants.warn_type, warrants.warn_date_issued, phone_numbers.phone_number 
    FROM people
    LEFT OUTER JOIN warrants ON people.id = warrants.person_id
    LEFT OUTER JOIN phone_numbers ON people.id = phone_numbers.person_id
    WHERE warrants.warn_date_issued BETWEEN ? AND ? AND warrants.warn_type = 'AW'"

    @numbers = CallLog.find_by_sql(["#{query}", start_date, end_date])
    @numbers.each do |dial|
      begin
       call = client.account.calls.create( …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails redis sidekiq

0
推荐指数
1
解决办法
1447
查看次数

Ruby Sleep方法

我正在研究Rails/Ruby应用程序中的地理编码片段/ sidekiq作业.所以基本上当我们点击谷歌API时,我们会睡1秒钟以避免谷歌API查询限制.但是我想要考虑AR和SQL时间来推动信封并加快处理速度.所以我想弄清楚如何睡3/4秒.

我可以睡觉.75还是我需要做一些像睡眠一样的睡眠数学(1.0/??).

不确定睡眠是否可以像.75一样浮动.有什么想法吗?

ruby sidekiq ruby-on-rails-4

0
推荐指数
1
解决办法
8789
查看次数

为什么我们在Heroku上没有数据库连接?

我们在Herki上有一个带有Sidekiq的Rails应用程序,并且数据库连接不足.

ActiveRecord::ConnectionTimeoutError: could not obtain a database  
connection within 5.000 seconds (waited 5.000 seconds)
Run Code Online (Sandbox Code Playgroud)

Heroku的东西:

数据库计划:Standard0(120个连接)

Web dynos:2 Standard-2X

工作人员dynos:1标准-2X

heroku配置:

MAX_THREADS: 5
(DB_POOL not set)
(WEB_CONCURRENCY not set)
Run Code Online (Sandbox Code Playgroud)

Procfile:

web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq
Run Code Online (Sandbox Code Playgroud)

database.yml的:

...

production:
  url:  <%= ENV["DATABASE_URL"] %>
  pool: <%= ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5 %>
Run Code Online (Sandbox Code Playgroud)

puma.rb:

# https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#adding-puma-to-your-application

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 2)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || …
Run Code Online (Sandbox Code Playgroud)

connection-pooling ruby-on-rails heroku sidekiq

0
推荐指数
1
解决办法
741
查看次数

如何将ApplicationController中的帮助器包含到Sidekiq工作器中?

这是我的ApplicationController控制器:

class ApplicationController < ActionController::Base
  helper_method :is_admin?

  def is_admin?
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

我想is_admin?在Sidekiq工作者中使用这个助手.到目前为止,我在这里包括:

class GenerateInvoiceWorker
  include Sidekiq::Worker

  def perform(product_id)
    av = ActionView::Base.new()
    av.view_paths = ActionController::Base.view_paths

    av.class_eval do
      include Rails.application.routes.url_helpers
      include ApplicationHelper
    end

    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

如何在工作者中使用辅助方法?

谢谢

ruby ruby-on-rails helper sidekiq

0
推荐指数
1
解决办法
2392
查看次数

Rails Sidekiq 队列大小不起作用

我有一个包含 2 个作业的 Rails 应用程序(ImportCsvJob 和 ProcessCsvJob)。这样我就可以在应用程序中明显地提示队列中仍然有作业,我有这个辅助方法(在 application_helper.rb 内):

module ApplicationHelper
   def queued_job_count
        Sidekiq::Queue.new.size
    end
end
Run Code Online (Sandbox Code Playgroud)

然后我在索引控制器上使用它,然后将其传递到视图进行处理并在应用程序中给出视觉提示。

  def index
    @still_have_jobs = !queued_job_count.zero?
  end
Run Code Online (Sandbox Code Playgroud)

但是,当我仍然有 1 个后台作业 (ImportCsvJob) 时,此方法有效,但当我添加 (ProcessCsvJob) 时,它不再有效。

导入_csv_job.rb

require 'open-uri'

class ImportCsvJob < ActiveJob::Base
  queue_as :default

  def perform(csv_record)
    csv_record[:object_changes] = ApplicationController.helpers.generate_hash(csv_record[:object_changes])
    ObjectRecord.create(csv_record)
  end
end
Run Code Online (Sandbox Code Playgroud)

process_csv_job.rb

class ProcessCsvJob < ActiveJob::Base
  queue_as :default

  def perform(csv_path)
    csv_file = open(csv_path,'rb:UTF-8')

    options = {
        row_sep: :auto, col_sep: ",", 
        user_provided_headers: [:object_id, :object_type, :timestamp, :object_changes], 
        remove_empty_values: true, 
        headers_in_file: true
    }

    SmarterCSV.process(csv_file, options) do |array| …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails sidekiq rails-activejob

0
推荐指数
1
解决办法
1591
查看次数

查找 sidekiq 作业的运行时间

有没有一种简单的方法可以查看工作的已用时间sidekiq

ruby-on-rails sidekiq

0
推荐指数
1
解决办法
629
查看次数

Rails:Sidekiq Worker必须是线程安全的。这是什么意思?

我读到有关Sidekiq的内容:

Sidekiq是多线程的,因此您的工作线程必须是线程安全的。

这是什么意思?什么是“线程安全”代码?有人可以举例说明吗?非常感谢你。

ruby model-view-controller multithreading ruby-on-rails sidekiq

0
推荐指数
1
解决办法
858
查看次数

如何从 ActiveJob 队列中清除作业?

我有一个执行状态更改的工作,而且我使用它的方式是,只有在经过一定时间后才会更改状态。

在我的工作课上:

class ItemJob < ApplicationJob
 queue_as :default

 def perform(item)
  item.do_this!
 end
end
Run Code Online (Sandbox Code Playgroud)

它是从模型调用的:

def create_item_worker
 ItemJob.set(wait: 30.seconds).perform_later(self)
end
Run Code Online (Sandbox Code Playgroud)

但是,这是行不通的,因为 ActiveJob 有一个用于不再存在的记录的作业队列。我输入bundle exec sidekiq终端,它吐出像ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Item with 'id'=67.

那么我该如何清除呢?Sidekiq::Queue.all.each(&:clear)似乎没有做任何事情。

ruby-on-rails sidekiq rails-activejob

0
推荐指数
1
解决办法
1705
查看次数

sidekiq 的任务是否有任何“组异步等待”?

像 javascript 的 Promise.all 可以等待所有请求完成,然后执行以下工作。

例如,我有 A、B、C 任务:

C 需要 A 和 B 都完成运行并使用 A 和 B 计算的结果。

(因为 3 个进程都是非常昂贵的计算,所以它们被放在 sidekiq 队列中运行)

ruby ruby-on-rails sidekiq

0
推荐指数
1
解决办法
172
查看次数