介绍「Ruby on Rails」的 Sidekiq gem

1. 概括描述

・Sidekiq 是一个用于在 Rails 应用中执行后台任务的 gem。
・Sidekiq 使用多线程和 Redis 同时处理多个任务。
・Redis 被理解为用于存储任务队列的数据库存储。

2. 配置

Sidekiq:

在Gemfile中添加以下行:gem “sidekiq”

接下来,运行 bundle install。

Redis:Redis是一种开源的内存数据结构存储系统,常用于构建高性能的、高并发的应用程序。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并具备强大的缓存功能,能够快速读写数据。Redis还提供了多种功能,例如发布订阅、事务处理、持久化等,使得它成为一个非常灵活和强大的存储解决方案。

请按照以下链接安装 Redis: https://redis.io/topics/quickstart

在config/initializers/sidekiq.rb文件中配置Sidekiq以连接Redis。

Sidekiq.configure_server do |config|
  config.redis = {
    url: "redis://127.0.0.1:6379/12"
  }
end

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

3. 活动的顺序

Sidekiq由Sidekiq客户端、Sidekiq服务器和Redis这三个主要部分组成。

Sidekiq 客户端:

责任在于将作业推送到Redis队列中。

使用JSON.dump函数将数据转换为哈希。

请注意:传递的参数必须是简单的 JSON 类型,如字符串、整数、布尔值、浮点数、空值(null)、哈希和数组。

Sidekiq服务器:

需要负责从Redis队列中获取作业以进行处理。

开始 Worker,并使用传递的参数调用 perform 函数。

Redis:这里是用来存储作业的地方。

4. 工作的生命周期

jobcyclelife.png
1. 日程安排:待执行的作业清单
2. 正在执行队列中的作业。
3. 忙碌:工作进行中
4. 未能成功的计数器:

工作执行但失败并未完成的次数。
默认情况下,工作可以失败的次数为25次,之后工作将被丢弃。
如果超过规定次数,工作将被移动到死信队列。
可以在创建工作时进行个性化设置,如下所示:sidekiq_options :retry => 5。

5. 已处理:作业已完成。
6.重试机会:

如果工作失败,且未超过允许的失败次数,该工作将始终包含在重新尝试队列中。

7. 行人死亡队:

超过容许次数的作业将被推送到死亡队列中。

5. 使用方法

当您配置了 Sidekiq 和 Redis,就准备好使用 Sidekiq 了。

执行以下命令:rails g sidekiq:worker Hard

随后,将会自动创建文件 app/workers/hard_worker.rb。或者,您也可以手动创建该文件。

class HardWorker
  include Sidekiq::Worker

  def perform(*args)
    # do something
  end
end

在其中,”perform” 是一个执行后台任务的函数。

*args 是传递的参数。输入参数必须是简单的 JSON 类型,如字符串、整数、布尔值、浮点数、空值(nil)、哈希、数组等,不能使用符号、命名参数、日期、时间等 Ruby 对象。

创建一个在后台运行的作业。

创建用于异步处理的作业。

HardWorker.perform_async('bob', 5)

默认情况下,Sidekiq 调度程序每隔 5 秒(如果是 Sidekiq < 5.1,则为 15 秒)检查一次计划任务,并且您可以在 config/initializers/sidekiq.rb 文件中重置该值。

Sidekiq.configure_server do |config|
  config.average_scheduled_poll_interval = 15
end

进行测试:需要打开三个选项卡才能执行。

・选项一:标签1:运行 redis-server redis-server

在第二个标签页上执行sidekiq的命令:bundle exec sidekiq

・标签 3:运行 rails s 服务器。

1148e952-458f-4399-bca5-279259fa0578.png

6. 参考 -> 参考资料

请提供中文译文:https://github.com/mperham/sidekiq
广告
将在 10 秒后关闭
bannerAds