我是第一次在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每次都会返回相同的内容吗?是印刷错误还是复制有效果?如果是的话,复制的意义是什么?

最佳答案

有一个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并完全跳过in ruby configure步骤!
export REDIS_URL="redis://localhost:6379/0/sidekiq_app_name_${APP_ENV}"

10-08 04:37