Rails / Sidekiq:帮我理解在`initializers / sidekiq.rb`

时间:2018-10-01 22:15:10

标签: ruby-on-rails redis ruby-on-rails-5 sidekiq

我是第一次在Rails应用中使用Sidekiq。这也是我第一次使用Redis。

我看过几个示例(Hereherehere),其中initializers/sidekiq.rb包含以下几行:

Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
end

Sidekiq.configure_client do |config|
    config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
end 

我还没有找到任何文档来解释这里到底发生了什么。

我了解到哈希已分配给config.redis。哈希表具有指向redis服务器的URL,以及带有sidekiq_app_name_前缀的名称空间,后跟当前环境。我认为前缀可以是我选择的任何字符串-很有可能是我的应用程序中的应用程序。

我不明白的是,为什么重复这行?

为什么重复行?

完全相同。肯定Rails.env每次都会返回相同的内容吗?是错字还是重复有效果?如果是这样,重复的目的是什么?

1 个答案:

答案 0 :(得分:2)

有一个Sidekiq 服务器库和一个Sidekiq 客户端库,它们是独立配置的。服务器负责将作业弹出队列并执行。客户端负责将作业添加到队列。例如,调用MyWorker.perform_in(5.minutes)使用客户端库,而不使用服务器库。

Sidekiq不假定您的客户端和服务器位于同一主机上,甚至位于同一代码库中。您可能希望您的Sidekiq作业在一个主机(或一组主机)上执行,而Redis在本地运行,而Rails应用程序在另一台主机(或一组主机)上运行。在这种情况下,您将在服务器配置中使用本地主机地址,在客户端配置中使用远程地址。如果您的代码库是分开的,则服务器代码库中可能没有Rails,因此必须在没有Rails.env的情况下配置Redis。

如果您计划在同一主机上一起运行所有内容,那么对重复数据进行重复数据删除就很容易了:

REDIS_CONFIG = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }

Sidekiq.configure_server {|config| config.redis = REDIS_CONFIG }
Sidekiq.configure_client {|config| config.redis = REDIS_CONFIG }

或者:

sidekiq_config = proc do |config|
  config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
end

Sidekiq.configure_server &sidekiq_config
Sidekiq.configure_client &sidekiq_config

或者您可以仅在父环境中设置REDIS_PROVIDERREDIS_URL并完全跳过Ruby中的配置步骤!

export REDIS_URL="redis://localhost:6379/0/sidekiq_app_name_${APP_ENV}"