后台任务设计的一些原则-ActiveJob-Sidekiq


ActiveJob-Sidekiq


目录 [隐藏] 
  • 1设计原则
    • 1.1关联任务举例值说明
      • 1.1.1多页的调用的问题:
      • 1.1.2连续调用某单个任务
  • 2sidekiq/web
  • 3任务管理
    • 3.1redis
    • 3.2说明

设计原则

  1. 单个job的任务量尽量小、任务功能要单纯,比如执行一次外部调用、一次的数据插入等。
  2. 减少人为干预任务的执行,人工只负责重置任务。人工多次执行不影响任务运行。
  3. 同类的任务只设置一个入口由人工触发,后续程序自动运行。
  4. 最好能够做到:任务都有‘任务管理者’来分发,而不是任务的传递。
  5. 任务的调用都最好有记录。

关联任务举例值说明

多页的调用的问题:
可以分成2类任务,1.获取所有分页的任务,2.抓取单页的任务。

连续调用某单个任务
调用任务1,如果成功,半小时后再次调用任务1.
提交任务管理分发?还是任务直接传递?


sidekiq/web

Restful Authentication or Sorcery
Checks a User model instance that responds to admin?

# lib/admin_constraint.rb
class AdminConstraint
  def matches?(request)
    return false unless request.session[:user_id]
    user = User.find request.session[:user_id]
    user && user.admin?
  end
end

# config/routes.rb
require 'sidekiq/web'
require 'admin_constraint'
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new



任务管理

  • 如果有任何计划的工作。 您可以使用以下命令删除所有作业:
Sidekiq::ScheduledSet.new.clear 

  • 如果有任何队列要删除所有作业,可以使用以下命令:
 Sidekiq::Queue.new.clear 

  • 重试也可以通过以下命令删除作业:
Sidekiq::RetrySet.new.clear 

  • The API documentation has an overview of what you can do but you really need to dive into the source to discover all the capabilities. You can do this but it won't be efficient. It's a linear scan for find a scheduled job by JID.
require 'sidekiq/api'
Sidekiq::ScheduledSet.new.find_job(jid).try(:delete)


Alternatively your job can look to see if it's still relevant when it runs.



redis
select:切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值
查看所有的key>  keys *
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
dbsize:返回当前数据库中key的数目



说明

sidekiq清空队列里任务的方式主要有两种,一是使用sidekiq的api,二是直接操作redis


一、使用sidekiq的api清空队列的任务   sidekiq里有提供操作队列的api,首先引入


  require'sidekiq/api'


  获取所有队列:Sidekiq::Queue.all


  获取默认队列:Sidekiq::Queue.new# the "default" queue


  按名称获取队列:Sidekiq::Queue.new("mailer")


  清空队列的所有任务:Sidekiq::Queue.new.clear


  按条件来删除队列的任务:


  queue=Sidekiq::Queue.new("mailer")


  queue.eachdo |job| 


      job.klass# => 'MyWorker'  job.args# => [1, 2, 3]


      job.delete if    job.jid=='abcdef1234567890'


  end


二、直接操作redis来删除队列里的任务 首先获取配置文件config,再连接redis,这里使用了redis的Gem包

redis= Redis.new(:host => config['host'], 
:port => config['port'], 
:db=> config['db'], 
:password => config['password'])

由于queues用的是set类型的数据,所以要用srem来删除相应的数据


redis.srem(‘queues’, ‘队列的名称’)  # 这种情况会直接删除该名称的队列


阅读量: 373
发布于:
修改于: