我是设计可扩展RoR应用的新手,所以我希望就如何重新配置/重新架构以下内容提出建议。我有一个在Heroku上托管的RoR应用程序,它通过Mailgun接收传入的电子邮件给控制器,然后控制器解析电子邮件并上传它们进行存储。
在尝试处理包含多个/大附件的电子邮件时,我的Heroku日志中出现H12-Request Timeout错误。超时被报告回Mailgun,然后Mailgun尝试以预定义的时间间隔重试请求,同时Heroku继续处理请求...因此它被一个循环捕获,最终将多个相同文件上传到存储中。
在Heroku中,我有1个网络和1个工作dyno,运行Puma作为我的网络服务器。
这是我的puma.rb文件:
preload_app!
min_threads = Integer(ENV['MIN_THREADS'] || 0)
max_threads = Integer(ENV['MAX_THREADS'] || 5)
threads min_threads, max_threads
workers Integer(ENV['WORKER_COUNT'] || 3 )
on_worker_boot do
ActiveSupport.on_load(:active_record) do
if Rails.application.config.database_configuration
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 5
ActiveRecord::Base.establish_connection(config)
end
# ActiveRecord::Base.establish_connection
end
end
我不清楚在这种情况下如何最好地利用工作人员dynos,以及如何向Mailgun报告一切都很好,以便它不会继续尝试相同的请求。
如果您需要其他信息,请与我们联系。
感谢您的时间和帮助。
修改 一些其他信息:
我的控制器正在进行所有处理。 我查询数据库以匹配传入的电子邮件给用户。 此外,我正在请求/向第三方API发送数据...这是为了获取有效的身份验证令牌并上传数据。
答案 0 :(得分:0)
我发现了这个:我发现了这个:https://appcasts.io/blog/writing-your-first-background-worker并且会开始寻求利用它。感谢。