加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何使用Rails 4,Puma和Sidekiq配置Redis连接?

发布时间:2020-12-17 02:25:27 所属栏目:百科 来源:网络整理
导读:我正在使用Sidekiq(在Heroku上使用Puma)以异步方式发送电子邮件,并希望使用Redis来保留计数器和缓存模型. RedisCloud的免费计划包括30个与Redis的连接.我不清楚如何管理: Sidekiq使用的redis连接 模型中使用的redis连接(缓存和计数器) Sidekiq客户端大小配
我正在使用Sidekiq(在Heroku上使用Puma)以异步方式发送电子邮件,并希望使用Redis来保留计数器和缓存模型.

RedisCloud的免费计划包括30个与Redis的连接.我不清楚如何管理:

> Sidekiq使用的redis连接
>模型中使用的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的默认并发性是可以的.
正如Mike Perham所说,并发性一般不得超过(服务器池大小 – 2)* 2.

现在,它开始让我感到困惑的地方是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”)你需要两次连接,因为旧进程仍在运行一段时间>保留至少一个用于紧急调试的免费连接,因为您可能希望能够从控制台/直接连接,并在出现意外高负载时查看内部??数据

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读