ruby – 如何使用Rails 4,Puma和Sidekiq配置Redis连接?
我正在使用Sidekiq(在Heroku上使用Puma)以异步方式发送电子邮件,并希望使用Redis来保留计数器和缓存模型.
RedisCloud的免费计划包括30个与Redis的连接.我不清楚如何管理: > Sidekiq使用的redis连接 Sidekiq客户端大小配置如下: Sidekiq.configure_client do |config| config.redis = {url: ENV["REDISCLOUD_URL"],size: 3} end 如果我理解这一点,Puma会分配多个进程,在我的情况下为2,这将导致: 2 (Puma Workers) * 3 (size) * 1 (Web Dyno) = 6 connections to redis used to push jobs. Sidekiq服务器 随着Sidekiq采用2个连接(或版本4中的5个),将并发性设置为10将默认服务器大小为12或15. 如果我想使用所有剩余的可用连接(30 – 6 = 24),我可以设置: Sidekiq.configure_client do |config| config.redis = { size: 19 } end 总redis连接将是19 5(Sidekiq 4)= 24,并且使用25的默认并发性是可以的. 现在,它开始让我感到困惑的地方是Redki使用Sidekiq. # initializers/redis.rb $redis = Redis.new(:url => uri) 每当我在模型或控制器中使用Redis时,我都这样称呼: $redis.hincrby("mycounter","key",1) 据我了解,当调用$redis.whateverFunction时,所有puma线程在单个Redis连接上相互等待. 在这个答案What is the best way to use Redis in a Multi-threaded Rails environment? (Puma / Sidekiq)中,推荐的方法是使用与Sidekiq Wiki https://github.com/mperham/sidekiq/wiki/Advanced-Options#connection-pooling相关的connection_pool gem require 'connection_pool' $redis = ConnectionPool.new(size: 10) { Redis.new } 如果我理解正确,那就是$redis.whateverFunction会有自己的10连接池,而sidekiq有自己的连接工作池,现在可以设置新的20个redis连接(30个(总共可用) – 10个) (redis模型连接),Sidekiq客户端和服务器大小需要更改. 如何确定模型/控制器redis连接所需的连接池(此处为10)的大小?由于Redis是单线程的,增加连接池实际上如何提高redis操作性能? 对此的任何想法都会有很大的帮助. 解决方法
Redis是单线程的,但是用纯C编写,在内部使用事件循环并异步处理连接,因此连接计数不会影响它,只要提供相同数量的请求.由于网络延迟,ruby比编译和优化的C等慢,因此它能够比应用程序生成请求更快地处理请求,因此您不必担心它是单线程的.
增加连接数对于来自不同线程的并发请求是有益的,因为不需要等待通过网络传递响应来解锁连接,而且ruby可以执行并行IO. 此外,当连接检出时间变得比预期/容忍更差并且相应的线程/工作人员在等待时空闲时,您可以判断池是否太小,因此对您的代码进行基准测试并仔细查看您的实际使用和行为模式. 另一方面,我建议不要使用所有的连接数限制,有时你可能需要这些额外的连接.例如: > for graceful /“zero downtime”dyno restarts(“preboot”)你需要两次连接,因为旧进程仍在运行一段时间>保留至少一个用于紧急调试的免费连接,因为您可能希望能够从控制台/直接连接,并在出现意外高负载时查看内部??数据 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |