Ruby on rails RoR:对同一长时间响应控制器的多个连续调用
更新: 如果您有相同的问题,请先阅读“”。谢谢Ruby on rails RoR:对同一长时间响应控制器的多个连续调用,ruby-on-rails,heroku,concurrency,engineyard,Ruby On Rails,Heroku,Concurrency,Engineyard,更新: 如果您有相同的问题,请先阅读“”。谢谢 我有一个并发问题。我让一个控制器抓取几个网站,但每次给控制器打电话都需要大约4-5秒的响应时间 因此,如果我连续呼叫2次(或更多),第二次呼叫需要等待第一次呼叫后再开始 那么我如何在控制器中解决这个问题呢?也许是用类似EventMachine的东西 更新&示例: 应用程序\u控制器.rb 因此,现在我需要同一用户/浏览器/等在同一时间多次请求 我尝试了Heroku(和local)和Unicorn,但没有成功,这是我的设置: 独角兽.rb Pro
我有一个并发问题。我让一个控制器抓取几个网站,但每次给控制器打电话都需要大约4-5秒的响应时间 因此,如果我连续呼叫2次(或更多),第二次呼叫需要等待第一次呼叫后再开始 那么我如何在控制器中解决这个问题呢?也许是用类似EventMachine的东西 更新&示例: 应用程序\u控制器.rb 因此,现在我需要同一用户/浏览器/等在同一时间多次请求 我尝试了Heroku(和local)和Unicorn,但没有成功,这是我的设置:
- 独角兽.rb
- Procfile
- Heroku设置
- 我需要一个安静的解决方案。这是API,所以我需要响应JSON
- 独角兽赫罗库
- 带有Nginx+Panssenger的引擎场云
- 您可能正在开发模式中使用webrick。Webrick一次只处理一个请求
您有多种解决方案,许多ruby web服务器都可以处理并发性
这里有一些
稀薄的
Thin最初基于mongrel,并使用eventmachine处理多个并发连接
独角兽
Unicorn使用一个主进程将请求分派给web工作者,4个工作者等于4个并发的可能请求
彪马
Puma是一个相对较新的ruby服务器,它的闪亮特性是它在线程中处理并发请求,确保您的代码是线程安全的
乘客
Passenger是捆绑在nginx或apache中的ruby服务器,非常适合生产和开发
其他
这些是一些替代方案,还有许多其他的,但我认为它们是当今使用最多的
要使用所有这些服务器,请查看它们的说明。它们通常可以在github自述文件中找到。尝试使用unicorn之类的工具,因为它通过workers处理并发性。如果每个请求有很多工作要做的话,需要考虑的是,在请求时旋转一个延迟的任务。 延迟作业的一个问题是响应不同步,这意味着它不会返回到用户的浏览器
但是,您可以让延迟的作业将其响应保存到数据库中的表中。然后,您可以查询该表中的所有请求及其相关响应。上述答案是解决方案的一部分:您需要一个服务器环境,该环境可以正确地将并发请求分派给不同的工作人员;unicorn或passenger都可以通过在单独的进程或线程中创建工人来工作。这允许许多工作人员在不阻止其他传入请求的情况下静坐等待 如果您正在构建一个典型的bot,其主要任务是从其他来源获取内容,那么这些解决方案可能还可以。但是,如果您需要一个简单的控制器,可以接受数百个并发请求,所有这些请求都向其他服务器发送独立的请求,那么您需要自己管理线程或进程。您的目标是让许多工人等待完成一项简单的工作,以及一个或多个主人,他们的工作是发送请求,然后在那里接收响应。Ruby的Thread类很简单,在Ruby2.x或1.9.3中可以很好地处理这种情况
您需要提供更多详细信息,以帮助您获得更具体的解决方案。对于任何长响应时间控制器功能, 这是一个好办法。虽然它通常用于批量邮寄,但它也适用于任何长时间运行的任务 控制器启动延迟的作业,并立即响应带有占位符(通常是带有进度指示器的图形)的页面,以及Ajax或定时重新加载,在页面可用时用完整信息更新页面。有关如何实现这一点的一些信息如下所示
本文中没有提到的是,您可以使用redis或其他内存缓存来存储结果,而不是主数据库 您使用的是什么ruby版本 Ruby&Webserver 红宝石 如果它是一个简单的应用程序,我建议如下。尝试使用rubinius(rbx)或jruby,因为它们更擅长并发。尽管它们有缺点,因为它们不是主线ruby,所以一些扩展无法工作。但如果它是一个简单的应用程序,你应该很好 网络服务器 如果你有耐心,可以使用美洲狮或独角兽 如果您的应用程序正在访问API服务 当您在抓取其他站点(可能是允许抓取的站点)时,您表示全局锁正在杀死您,如果是这种情况,应该使用sidekiq或延迟作业之类的东西,但要小心。这些将是幂等工作。i、 e.它们可能会运行多次。如果你开始多次访问一个网站,你会很快达到网站的速率限制,例如twitter将你的请求限制为每小时150次。因此,谨慎使用背景工作 如果你是提供数据的人 然而,阅读你的问题,听起来你的控制器就是API,锁是由用户点击它引起的
如果是这种情况,您应该利用dalli+memcached为您的数据提供服务。这样,您就不会受到SQL查找的I/O限制,因为memcached是基于内存的。内存速度>I/O速度谢谢你,伙计。你说得对,我在用webrick。现在我正在测试开发中的Unicorn(localhost),但我无法让它与多个工作人员一起工作。这是我的
config/unicorn.rb
顺便说一句,我在生产中使用Heroku Puma是新的,但它基本上是对Zed Shaw的Mongrel服务器的现代版本,它很旧。我喜欢它,并且已经成功地将它作为默认设置使用了一段时间
def func1
i=0
while i<=2
puts "func1 at: #{Time.now}"
sleep(2)
i=i+1
end
end
def func2
j=0
while j<=2
puts "func2 at: #{Time.now}"
sleep(1)
j=j+1
end
end
puts ">>>>>>>> Started At #{Time.now}"
func1()
func2()
puts "End at #{Time.now}"