zoukankan      html  css  js  c++  java
  • ruby on rails中sidekiq的使用

    参考文章:
    https://www.jianshu.com/p/7ea473097023

    安装redis

    1. 配置redis

    配置sidekiq所依赖的redis位置,必须同时定义sidekiq的server和client
    config/initializers/sidekiq.rb

    # 这里的地址和端口号(1643)都需要配置成正确的
    Sidekiq.configure_server do |config|
      config.redis = { url: 'redis://redis.wdxtub.com:1643/12' } #标准格式 config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace }
    end
    Sidekiq.configure_client do |config|
      config.redis = { url: 'redis://redis.wdxtub.com:1643/12' } #标准格式 config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace }
    end
    

    如果要使用 UNIX socket,URL 应该类似于 unix://#{Rails.root}/tmp/sockets/redis.sock

    1. 配置文件

    配置config/sidekiq.yml文件,一般只有在需要配置高级选项的时候才需要配置这个文件(如果不使用这个名字,可以使用-c指定 sidekiq -c config/name.yml)

    :verbose: false
    :concurrency: 5 # 并发数
    :pidfile: ./tmp/pids/sidekiq.pid
    :logfile: ./log/sidekiq.log # 输出的日志地址
    :timeout: 30
    :queues:
      - default # 写在队列参数中的, 表示让 sidekiq 处理这个 queue
      - [HardWorker, 2] # 使用数组的形式写, 第一个参数为打开的 queue 的名称, 第二个为优先级
      - [EmailWorker, 3]
      - [PasswordWorker, 4]
    
    development:
    :concurrency: 5
    staging:
    :concurrency: 10
    production:
    :concurrency: 5
    
    1. gemfile中添加对应的包
      gem 'sidekiq', '4.0.1', :require => false

    执行bundle install

    在app/jobs文件下新建一个job,来处理异步请求(可以使用命令也可以手动创建)

    rails g job add_lots_of_users
    #rails g sidekiq:worker Hard # will create app/workers/add_lots_of_users_job.rb #在app/workers文件下新建一个worker,来处理异步请求(可以使用命令也可以手动创建)
    

    app/workers/add_lots_of_users_job.rb

    注意:下面的类名AddLotsOfUsersJob要和上面的文件名一致

    文件中会生成如下内容

    例子1 继承< ActiveJob::Base

    class AddLotsOfUsersJob < ActiveJob::Base
      queue_as :default
    
      def perform(*args)
        # Do something later
         sleep 10
         1000.times do |index|
           user = User.new
           user.name = "atpking#{index}"
           user.save
         end
      end
    end
    
    #class HardWorker
      #include Sidekiq::Worker
      #def perform(name, count)
        # do something
      #end
    #end
    

    例子2 不继承< ActiveJob::Base 可以不在rails使用

    class AddLotsOfUsersJob 
      include Sidekiq::Worker
      sidekiq_options :queue => :update_is_scan_state, :retry => 3, :backtrace => true
      def perform(*args)
        # Do something later
         sleep 10
         1000.times do |index|
           user = User.new
           user.name = "atpking#{index}"
           user.save
         end
      end
    end
    
    

    在需要的地方controller或者model中调用,调用示例如下

    # 如果AddLotsOfUsersJob任务类继承ActiveJob::Base 例如:class AddLotsOfUsersJob < ActiveJob::Base
    #注意:perform是一个实例方法,但是在调用的时候是用类调用
    AddLotsOfUsersJob.perform_later #常规异步执行
    AddLotsOfUsersJob.set( wait: 20.minutes ).perform_later #指定延迟多久执行
    @users = User.all
    
    # 如果AddLotsOfUsersJob任务类不继承ActiveJob::Base 例如:class AddLotsOfUsersJob
    #HardWorker.perform_async('bob', 5) #常规异步执行
    #HardWorker.perform_in(5.minutes, 'bob', 5) #延迟执行
    #User.delay.do_some_stuff(current_user.id, 20) # 也可以通过 delay 来新建任务
    

    在config/application.rb中指定active_job的adapter

    adapter默认使用的adapter是Active Job Inline需要指定为sidekiq才支持异步(如果是使用worker这一步可以省略)

    config.active_job.queue_adapter = :sidekiq

    在rails项目的根目录启动sidekiq
    bundle exec sidekiq -d -C config/sidekiq.yml #-d是指后台运行 -c指定配置文件,默认sidekiq.yml文件

    1. sidekiq web可视化(这个步骤是可选的)
    [Haima的博客] http://www.cnblogs.com/haima/
  • 相关阅读:
    PAT 1017 Queueing at Bank
    一句有意思的代码
    PAT 1031 Hello World for U
    PAT 1024 Palindromic Number
    PAT 1032 Sharing
    各显神通
    ZJU PAT 1023
    静夜,乱思
    PAT 1024 Palindromic Number
    虚函数表
  • 原文地址:https://www.cnblogs.com/haima/p/15740604.html
Copyright © 2011-2022 走看看