elasticbeanstalk中的非线程安全Rails 5 App

Posted

技术标签:

【中文标题】elasticbeanstalk中的非线程安全Rails 5 App【英文标题】:Non thread safe Rails 5 App in elasticbeanstalk 【发布时间】:2019-05-13 04:32:35 【问题描述】:

我在 Elastic Beanstalk 中部署我的 Rails 5.2 应用程序,其中 puma 作为应用程序服务器,nginx 作为 Elastic Beanstalk 的默认设置。

我正面临竞争条件问题。在我检查容器实例中的更多详细信息后,我发现了这个:

#example /opt/elasticbeanstalk/support/conf/pumaconf.rb
directory '/var/app/current'
threads 8, 32
workers %x(grep -c processor /proc/cpuinfo)
bind 'unix:///var/run/puma/my_app.sock'
pidfile '/var/run/puma/puma.pid'
stdout_redirect '/var/log/puma/puma.log', '/var/log/puma/puma.log', true
daemonize false

如此处所示,worker 的数量等于我的 CPU 内核的数量。

但是,在 Heroku.com 中我们可以这样做:

# config/puma.rb

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end

如何在弹性豆茎中减少线程数并增加工人数?考虑到我启用了负载均衡器,并且上面的配置由弹性 beanstalk 管理。

在 Heroku 的情况下,我可以使用 puma.rb 进行管理,但是在弹性 beanstalk 中,除了更改文件之外,我没有看到任何其他方法

/opt/elasticbeanstalk/support/conf/pumaconf.rb

手动。当实例数量减少或增加时,手动修改会导致问题。

【问题讨论】:

【参考方案1】:

不确定,您的问题是否已解决。我有一个类似的问题,我使用 .ebextensions 解决了它。

您可以在代码的配置目录中创建一个新的 pumaconf.rb 文件。然后在 .ebextensions 目录中,创建一个文件,该文件将复制出新的 pumaconf.rb 并替换默认的 pumaconf.rb。

另外,如果你打算这样。在您的 .ebextensions 代码中,将此路径用于您的新文件

/var/app/ondeck/config/pumaconf.rb

而不是

/var/app/current/config/pumaconf.rb

因为使用后者,所以不会复制出你最新的 pumaconf.rb

cp /var/app/ondeck/config/pumaconf.rb /opt/elasticbeanstalk/support/conf/pumaconf.rb

【讨论】:

以上是关于elasticbeanstalk中的非线程安全Rails 5 App的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程之~~~线程安全容器的非堵塞容器

Elastic Beanstalk 上的 Tomcat - Tomcat 线程中的多线程

多线程 - 多线程中使用静态方法存在线程安全的问题

多线程 - 多线程中使用静态方法存在线程安全的问题

CUDA 中的非活动线程与断定线程

Java多线程编程——多线程技能