【问题标题】:SIdekiq doesn't perform async (Sinatra & Rack)SIdekiq 不执行异步 (Sinatra & Rack)
【发布时间】:2016-12-28 12:05:25
【问题描述】:

我真的是 Ruby 的新手。我理解这门语言,但我很难找到正确的方式来构建项目,有很多文章和教程建议不要使用简单的ruby 命令运行,而是例如rackup。如果我的应用程序使用多个 gem,我无法理解使用其他命令,它们被用作包装器?

至于我的项目。我正在使用 SinatraRack & Sidekiq 创建简单的 API,我正在按如下方式启动我的应用程序。

rackup -p1600 --host 192.168.0.130  config.ru 

但我刚刚开始使用sidekiq,它需要Redis server 我已经安装了它,现在一切正常,没有错误。

但问题是我的任务没有得到处理。

这是我的例子

我的终点

  post '/items' do
    item_url = params[:item_url]
    halt(400, {error: 'Item url is not provided'}.to_json) if item_url.nil?
    begin
      item_handler = ItemHandler.new item_url
      item_handler.start_processing
      item_handler.item_status.to_json
    rescue APIErrors::AlreadyExistsError => e
      halt(409, {error: e.message}.to_json)
    rescue APIErrors::InvalidPayloadError => e
      halt(400, {error: e.message}.to_json)
    end
  end

还有我的ItemHandler

Sidekiq.configure_server do |config|
  config.redis = {password: 'password'}
end
Sidekiq.configure_client do |config|
  config.redis = {password: 'password'}
end

class ItemHandler
...
...
...
  def start_processing
    ItemWorker.perform_async(@item.id)
  end

最后是ItemWorker

require 'sidekiq'

class ItemWorker
  include Sidekiq::Worker
  attr_accessor :item

  def perform(id)
    # Get item model
    @item = ItemModel.where(_id: id)
    logger.info "Doing hard work"
    puts @item.status
    # Start item processing
    process_item
  end

  def process_item
    logger.info "Doing hard work"
    puts 'Start processing'
    @item.status = ItemModel::STATUS[:downloading]
    @item.save
    result = download_item_file
    if result > RESULT_OK
      @item.status = ItemModel::STATUS[:failed_download]
      @item.save
      puts 'Failed to download file'
    else
      puts 'File downloaded'
      @item.status = ItemModel::STATUS[:downloaded]
      @item.save
    end
  end

  def download_item_file
    return if @item.nil?
    dl_command = EXTERNAL_DOWNLOAD.dup
    dl_command['|url|'] = @item.url
    system dl_command
    $?.exitstatus
  end
end

什么也没有发生,控制台没有输出,什么都没有。以前我使用fork 而不是sidekiq 并且效果很好。

请帮我找出问题。

附:如果我以错误的方式做其他事情(不遵循最佳实践和指南),请告诉我。

【问题讨论】:

  • 还是不行吗?一切似乎都很好,您能确定触发功能后的日志吗?

标签: ruby sinatra config rack sidekiq


【解决方案1】:

感谢大家的帮助,我刚刚意识到一件重要的事情,要让sidekiq工作,首先应该启动它:))

所以我只是使用这个命令来启动'sidekiq',现在它工作正常。

sidekiq -r ./item_downloader.rb

我的错

【讨论】:

  • 感谢发布。我根据您的示例创建了一个更简单的应用程序,我也看不到任何日志消息。我已经用头撞墙一天了。从您的帖子中不清楚您应该在 sidekiq 命令中指定什么文件 - 我指定了包含其中包含行 include Sidekiq:Worker 的类的文件,例如item_worker.rb。然后在我发出 sideqik 命令的终端窗口中(v. 我发出 rackup 命令的窗口或我启动 redis 的窗口),我可以看到记录的消息。
【解决方案2】:

这是一个使用 sidekiq/redissinatra 的完整示例应用:

~/sinatra_projects$ tree myapp/    
myapp/
├── config.ru
├── item_handler.rb
├── item_worker.rb
└── sinatra_app.rb

sinatra_app.rb

require 'sinatra'
require_relative 'item_handler' #=>look for item_handler.rb in the same directory as this file

get '/' do
  "hello world"
end

post '/item' do
  puts "--->#{params[:item_url]}<---"

  item_handler = ItemHandler.new params[:item_url]
  item_handler.start_processing

  "Thanks for the work\n"
end

item_handler.rb

require_relative 'item_worker'  #look for item_worker.rb in the same directory as this file

class ItemHandler
  def initialize(url)
    @url = url
  end

  def start_processing
    ItemWorker.perform_async @url
  end
end

item_worker.rb

require 'sidekiq'

Sidekiq.configure_server do |config|
  #Not much documentation on what you can/should do in here
end

Sidekiq.configure_client do |config|
  #Not much documentation on what you can/should do in here
end

class ItemWorker
  include Sidekiq::Worker

  def perform(url)
    logger.info "Things are happening"

    case url
    when /joe_blow.com/
      sleep 5
      logger.info "joe_blow.com took a really long time" 
    when /twitter_clone.com/
      sleep 3
      logger.info "twitter_clone.com was pretty slow"
    else /google.com/
      sleep 1
      logger.info "google.com response was the quickest"
    end

  end

end

config.ru

require_relative 'sinatra_app'  #=>look for sinatra_app.rb in the same directory as this file 

run Sinatra::Application

启动和运行:

1)Download并安装redis(和redis gem不一样),然后在terminal_window1启动redis:

$ ~/Downloads/redis-3.2.6/src$ ./redis-server 

2) 安装sidekiq gem(它也将安装redis gem,因为它是一个依赖项):

$ gem install sidekiq

3) 在 terminal_window2 中启动 sidekiq:

~/sinatra_projects/myproj$ sidekiq -r ./item_worker.rb

4) 在 terminal_window3 中启动 Sinatra 应用:

~/sinatra_projects/myproj$ rackup config.ru

5) 在 terminal_window4 中向您的应用发送 post 请求:

$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item

立即,卷曲窗口将显示输出:

Thanks for the work

sidekiq 窗口会显示输出:

2016-12-28T02:34:59.149Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: start
2016-12-28T02:34:59.149Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: Things are happening

5 秒后,sidekiq 窗口将显示:

2016-12-28T02:35:04.153Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: joe_blow.com took a really long time
2016-12-28T02:35:04.154Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: done: 5.004 sec

如果你快速连续发送三个 curl 请求(up_arrow + Return):

$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item
Thanks for the work
$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item
Thanks for the work
$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item
Thanks for the work

然后在sideqik窗口中你会看到:

2016-12-28T02:38:01.218Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: start
2016-12-28T02:38:01.218Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: Things are happening
2016-12-28T02:38:01.983Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: start
2016-12-28T02:38:01.983Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: Things are happening
2016-12-28T02:38:02.602Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: start
2016-12-28T02:38:02.602Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: Things are happening

...时间流逝...

2016-12-28T02:38:06.220Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: joe_blow.com took a really long time
2016-12-28T02:38:06.220Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: done: 5.003 sec
2016-12-28T02:38:06.985Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: joe_blow.com took a really long time
2016-12-28T02:38:06.985Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: done: 5.002 sec
2016-12-28T02:38:07.603Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: joe_blow.com took a really long time
2016-12-28T02:38:07.603Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: done: 5.001 sec

不是总共需要 15 秒来运行所有三个工人,而是在 5 秒后所有三个工人都完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多