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

Sidekiq Github wiki 中文文档

分片

commit信息:Updated Sharding (markdown) | 提交者:mperham | 提交时间:2015-06-05 | 版本:452f0b5

在Sidekiq 3.0+中有效

Sidekiq有一个扩展限制:通常它只能用一个Redis server。这通常不是一个问题:Redis是非常快的,并且在好的硬件上,在你开始遇到瓶颈之前,你可以使用Redis每秒输送5-10000个作业。想要超越这个限制,你有两个选项:

如何分片

搭配着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

限制

分片有一些严重的局限性:

  1. Sidekiq API(所有的在sidekiq/api中的代码)不支持分片,它只适用于Sidekiq.redis中的默认全局Redis链接
  2. Web UI有相同的限制。你要为使用Web UI监视的每个Redis分片启动不同的Rack程序。(Sidekiq Pro 支持一个进程中多个Web UIs)
  3. 你需要spin up Sidekiq进程来从每一个Redis实例中执行作业。一个Sidekiq服务进程仅仅从一个redis实例中执行作业。
  4. 分片增加了你的系统复杂度。思考追踪哪个作业到了哪里会更困难,调式也更困难。

我不建议分片,除非所有的其它选项都不起作用。

上一篇: 测试 下一篇: 问题和分析解决