Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RoR:对同一长时间响应控制器的多个连续调用_Ruby On Rails_Heroku_Concurrency_Engineyard - Fatal编程技术网

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
更多信息: 我现在有2台云服务器正在运行

  • 独角兽赫罗库
  • 带有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}"