浩文 联系 关于本站 登录 注册
  • 关注新浪微博:
  • 关注微信公众号:

Sidekiq Github wiki 中文文档

使用Redis

commit信息:REDISTOGO no longer supports Sidekiq because it is still running Redis v3.2.12 and Sidekiq requires Redis v4.0.0 or greater | 提交者:michaelrbock | 提交时间:2020-07-28 | 版本:989ea81

Sidekiq用Redis储存所有的作业和操作数据。

默认,Sidekiq试着用localhost:6379连接Redis。这在开发者模式工作的很好,但是在产品模式要调整这些。

使用ENV变量

你可以使用环境变量设置Redis URL。这使得在Heroku上配置Sidekiq非常简单。

将“ REDIS_PROVIDER”环境变量设置为包含Redis服务器URL的环境变量名称。
(搭配RedisGreen的例子:REDIS_PROVIDER=REDISGREEN_URL然后Redis将使用REDISGREEN_URL环境变量值来连接Redis。)

heroku config:set REDIS_PROVIDER=REDISTOGO_URL

你也可以使用通用的REDIS_URL,以便设置为自己私有的Redis server。

使用初始化器

注意配置Redis位置很重要,必须一起定义Sidekiq.configure_serverSidekiq.configure_client块。为了做这些配置把下面的代码放入config/initializers/sidekiq.rb

Sidekiq.configure_server do | config |
  config.redis = { url: 'redis://redis.example.com:7372/' }
end

Sidekiq.configure_client do | config |
  config.redis = { url: 'redis://redis.example.com:7372/0' }
end

注意: 未知的参数会传递给基础Redis客户端,因此任何驱动程序支持的参数都可以放入哈希中。

注意: 配置哈希 必须 具有符号键。

全面控制

当创建Redis连接时,如果需要全面控制。例如:如果使用redis-failover 或者Redis Sentinel,可以给Sidekiq预构建连接池:

redis_conn = proc {
  redis.new # 在这里添加你想做的事情
}

Sidekiq.configure_client do |config|
  config.redis = ConnectionPool.new(size: 5, &redis_conn)
end

Sidekiq.configure_server do |config|
  config.redis = ConnectionPool.new(size: 25, &redis_conn)
end

注意这个size的调整。应该确保运行的每个进程的线程有足够多的连接数。连接根据需要才会创建,因此如果不确定需要多少连接可以设置一个大的数字(例如:20-30)。一个Sidekiq服务进程请求至少(5个并发)连接。

使用云

在云系统像EC2和Heroku上有一个不可预知的网络性能问题。如何偶尔遇到超时错误,应该调整网络超时设置让它有更宽泛的时间,默认是1秒。

config.redis = { url: 'redis://...', network_timeout: 5 }

记着:这是一个临时措施。 你并没有解决实际的慢性能问题。

如果看到Redis超时错误,应该使用 redis-cli --latency--latency-history 标志来检测Redis延迟。

$ redis-cli --latency-history localhost
min: 0, max: 1, avg: 0.20 (1359 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.18 (1356 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.18 (1355 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1359 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.19 (1358 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.18 (1353 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.19 (1357 samples) -- 15.01 seconds range

这说明到localhost的平均延迟是0.2ms或是200微秒:这是极好的。在用户遇到Redis的奇怪行为时,我常看到延迟超过5秒的设置:这是糟糕的。你可以转移到一个不同的Redis提供商或者在一个专业的机器上运行你的Redis服务,如果网络性能是糟糕的,Sidekiq解决不了该问题。联系你的Redis提供商并且询问有效的选项。

客户端命名

如果你的Redis服务支持它,当建立连接时,你可以指示Sidekiq使用 CLIENT SETNAME。这样在使用CLIENT LIST调试时能轻松地识别Sidekiq客户端。

config.redis = { url: ENV["REDIS_URL"], id: "Sidekiq-server-PID-#{::Process.pid}" }

因为许多SAAS Redis hosts不支持这个,此功能默认是被关闭。

架构

Redis 支持许多不同的拓扑结构:

集群是为了大规模的数据集设计的,像缓存,可以平均分布在机器之间。 Sidekiq不适合使用集群 因为Sidekiq有许多经常改变的热键(亦称,队列)。我推荐使用Redis守卫或者支持故障转移的Redis Saas。

调整

你可以使用redis-cli info命令来查看Redis的配置变量。

规模

客户有报告在一个Redis实例中可以运行每秒20000+的作业。请确保你使用最近的版本; Redis 6 搭配新的 --io-threads 选项会有重大性能提升。

内存

当所有数据装入内存时,Redis会运行良好。为了Redis不悄悄地减少Sidekiq的数据,你应该在redis.conf中设置 maxmemory-policy noeviction

多Redis实例

很多人用Redis做缓存 (它作为Rails 缓存存储 工作的很好),但是再运行一个 被配置为缓存而是作为持久存储的Redis实例是非常必要的。如果你想同时使用Redis作为缓存和使用Sidekiq, 我推荐你使用两个被合理的配置的、独立的Redis 实例。Redis命名空间不允许此配置,并且会造成许多其它问题,因曾最好使用离散的Redis实例。

超时

Redis 网络超时的最常见原因:

  1. swapping - 你的RAM即将用完,磁盘交换会导致大量的峰值延迟。使用Redis来支持缓存数据会消耗许多RAM,如果需要,使用独立的Redis实例来搭配Sidekiq。
  2. command latency - 你正在运行需要大量时间的Redis命令。 阅读下面的监督者博客文章。

笔记

上一篇: 最佳实践 下一篇: 错误支持