Sidekiq Github wiki 中文文档
分片
commit信息:Updated Sharding (markdown) | 提交者:mperham | 提交时间:2015-06-05 | 版本:452f0b5
在Sidekiq 3.0+中有效
Sidekiq有一个扩展限制:通常它只能用一个Redis server。这通常不是一个问题:Redis是非常快的,并且在好的硬件上,在你开始遇到瓶颈之前,你可以使用Redis每秒输送5-10000个作业。想要超越这个限制,你有两个选项:
- 划分应用到更小的应用。你可以在每个应用中使用一个Redis 服务。
- 分片应用的作业到许多Redis实例。
如何分片
搭配着Sidekiq 3.0中Sidekiq::Client的更新,后一种选择是相当的简单:
REDIS_A = ConnectionPool.new { Redis.new(...) }
REDIS_B = ConnectionPool.new { Redis.new(...) }
# To create a new connection pool for a namespaced Sidekiq worker:
ConnectionPool.new do
client = Redis.new(:url => "Your Redis Url")
Redis::Namespace.new("Your Namespace", :redis => client)
end
# Create a job in the default redis instance
SomeWorker.perform_async
# Push a job to REDIS_A using the low-level Client API
client = Sidekiq::Client.new(REDIS_A)
client.push(...)
client.push_bulk(...)
Sidekiq::Client.via(REDIS_B) do
# All jobs defined within this block will go to B
SomeWorker.perform_async
end
限制
分片有一些严重的局限性:
- Sidekiq API(所有的在
sidekiq/api
中的代码)不支持分片,它只适用于Sidekiq.redis
中的默认全局Redis链接 - Web UI有相同的限制。你要为使用Web UI监视的每个Redis分片启动不同的Rack程序。(Sidekiq Pro 支持一个进程中多个Web UIs)
- 你需要spin up Sidekiq进程来从每一个Redis实例中执行作业。一个Sidekiq服务进程仅仅从一个redis实例中执行作业。
- 分片增加了你的系统复杂度。思考追踪哪个作业到了哪里会更困难,调式也更困难。
我不建议分片,除非所有的其它选项都不起作用。