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_server
和Sidekiq.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 支持许多不同的拓扑结构:
- 单节点 -- 不支持容错能力
- Redis 守卫 -- 提供容错能力,当主Redis故障时,转移到副本Redis
- 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 网络超时的最常见原因:
- swapping - 你的RAM即将用完,磁盘交换会导致大量的峰值延迟。使用Redis来支持缓存数据会消耗许多RAM,如果需要,使用独立的Redis实例来搭配Sidekiq。
- command latency - 你正在运行需要大量时间的Redis命令。 阅读下面的监督者博客文章。
笔记
redis-cli --help
显示很多实用的选项,包括--latency-history
以及--bigkeys
。- redis-rdb-tools 有一些选项来内省丢弃的RDB文件。
- 监视Redis 涵盖大部分在使用Redis时应该监督的重要的东西。
- Datadog 关于Redis本质和监视的优质白皮书。
- BRPOPLPUSH 和 其它的 B* 命令是 阻塞的;使用它们造成大的峰值延迟是 正常的,不要担忧。