Используйте Sidekiq для обработки асинхронных задач в проектах Rails.

Rails

Sidekiq — это реализация, которая обеспечиваетсинхронизация/асинхронностьСистема фоновой обработки задач, которую можно интегрировать в проект Rails или использовать независимо. В этой статье мы представим и проанализируем, как использовать Sidekiq в Rails.

добавить зависимости

В настоящее время Sidekiq обновлен до версии 6.0, здесь мы используем последнюю версию

$ gem install sidekiq
gem 'sidekiq', '~> 6.0', '>= 6.0.3'

Изменить настройку

Добавить кconfig/sidekiq.ymlдокумент

# 最大并发数
concurrency: 5

# 进程和日志的输出位置
pidfile: tmp/pids/sidekiq.pid
logfile: log/sidekiq.log

# 任务队列
queues:
  - default
  - schedule

development:
  concurrency: 5

staging:
  concurrency: 10

production:
  concurrency: 20

Добавить кconfig/initializers/sidekiq.rbдокумент

# 设置 sidekiq cron 每秒钟检查一次任务,默认是 15 秒钟检查一次任务
Sidekiq.options[:poll_interval]                   = 1
Sidekiq.options[:poll_interval_average]           = 1

# 设置 sidekiq 服务端
Sidekiq.configure_server do |config|

  # 配置 redis 连接
  config.redis = { url: "redis://localhost:6379/0" }

  # 设置 sidekiq 每秒钟都会检查一次作业(默认每5秒检查一次)
  config.average_scheduled_poll_interval = 1

  # 从配置文件中读取定时任务
  schedule_file = 'config/sidekiq_schedule.yml'
  if File.exists?(schedule_file)
    Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
  end
end

Sidekiq.configure_client do |config|
  config.redis = { url: "redis://localhost:6379/0" }
end

существуетconfig/application.rbУстановите элементы конфигурации в:

config.active_job.queue_adapter = :sidekiq # 使用 sidekiq 作为异步任务的适配器

асинхронная задача

Используйте генератор для создания задачи, которая отправляет сообщение:

$ rails g job SendMessage

Приведенная выше команда создастapp/jobs/send_message_job.rb

class SendMessageJob < ActiveJob::Base
  queue_as :default
  def perform(*args)
    Rails.logger.info "send message..."
  end
end

как использовать:

SendMessageJob.perform_async(xxx, xxx, xxx) # 创建异步作业
SendMessageJob.perform_in(1.minutes, xxx, xxx) # 创建延时异步作业
SendMessageJob.perform_at(1.minutes.from_now, xxx, xxx) # 指定时间创建异步作业

задача на время

Добавить кapp/worker/send_message_worker.rbдокумент

class SendMessageWorker
  include Sidekiq::Worker
  sidekiq_options queue: :schedule, backtrace: true, retry: false
  # 无需显示调用,sidekiq 运行后会自动执行
  # 传入参数和执行周期在 config/sidekiq_schedule.yml 中配置
  def perform(*args)
      Rails.logger.info 'every second execution...'
  end
end

Добавить кconfig/sidekiq_schedule.ymlконфигурационный файл

SendMessageWorker:
  cron: '* * * * * *'
  class: SendMessageWorker

пройти черезsidekiq -C config/sidekiqКоманда запущена, и запланированная задача будет выполняться периодически

Настроить мониторинг

Sidekiq имеет встроенный набор страниц мониторинга в версиях выше 4.2, а в версиях до 4.2 необходимо добавить дополнительные зависимости:

gem 'sinatra', '~> 2.0', '>= 2.0.7'

существуетconfig/router.rbМаршрут для подключения страницы WebUI в файле.

require 'sidekiq/web'
Rails.application.routes.draw do
  mount Sidekiq::Web => '/sidekiq'
end

rails sСтартовый проектsidekiq -C config/sidekiq.ymlЗапустите sidekiq, посетитеhttp://localhost:3000/sidekiq

использованная литература