2015-02-23 55 views
0

我使用ajax上传照片,操作和上传到s3需要很长时间。我听说最好在后台完成这些任务。我的应用程序需要等待照片上传。但是,如果我选择背景方式,那么我将需要使用websockets或重复ajax来检查结果(链接到s3)(我对此不高兴)。 为什么在控制器(前景)中进行硬计算太糟糕了? 现在我使用Torquebox(Jruby),据我所知它具有完美的并发性。这是否意味着等待上传到s3不会占用资源,所有这些都可以正常工作? 请在我的情况下写下背部/前部地面的优缺点。谢谢!Rails中的前景或背景图像操作(Jruby,Torquebox)

回答

1

通常认为不好的做法是阻止对第三方服务的网络请求上的Web请求处理程序。如果该服务变得缓慢或不可用,则无论您使用的是何种Ruby,都会阻塞您的所有Web进程。这就是你所说的“前景”。

本质上讲,这是您的当前设置(在前景)的流量:

  1. 用户上载网站上的一个图像和需要的控制器接收所述请求。
  2. 您的控制器向012请求同步请求s3。这是一个阻止请求。
  3. 你的控制器等待
  4. 你的控制器等待
  5. 你的控制器(继续)等待
  6. 最后,(这是不保证的)你收到来自S3的回应和你的代码继续并呈现你定的视图/ JSON /文字/等。

显然步骤3-5是为您的服务器非常不好的消息,正如我前面所说,这名工人/线程/进程(根据您的Ruby/Rails服务器框架),直到响应将被“举起”从s3收到(这可能永远不会发生)。

这里是相同的流动与在前端一些JavaScript帮助通知后台作业:

  1. 用户上载网站上的一个图像和需要的控制器接收所述请求。
  2. 您的控制器创建一个新线程/进程向s3发出请求。这是非阻塞的方法。您在引用s3图像src的记录上设置了一个标记,例如完成:false,并且您的代码很好地继续到步骤3。您的新线程/进程将是等待s3响应的那个人,并且当s3响应时您将设置“已完成”标志为true。
  3. 您呈现您的视图/ json/text/etc,并固有地释放您的工人/线程/进程这个请求...好消息!
现在

为了娱乐前端东西:

  • 你的客户端接收的响应,触发在前端JavaScript来启动的setInterval状重复的函数“坪'你的服务器每隔3秒钟,你的后端控制器会检查你之前设置的“完成”标志是否为真,如果是,则响应/呈现为真。
  • 您的客户端JavaScript收到您的回复,并继续ping(直到您指定它应该放弃)或停止ping,因为您的应用程序回应为真。
  • 我希望这能让您走上正确的道路。我认为为这个答案编写代码是次要的,因为它好像你在寻找优点和缺点。对于实际的实施想法,我会看看以下内容:

    • sidekiq非常适合解决此处所述的背景工作问题。它将处理创建新的流程,您可以向s3发出请求。
    • 这是一个很好的railscast,这将有助于您更好地理解代码。
    +0

    1.我阅读了关于线程池的内容,并且(据我所知)我在jruby(java)中的应用程序将使用固定线程池。这意味着当系统资源结束时,一次性的大量图像上传可以停止所有线程。我对么? 2.你能回答吗,可重复的要求是否足够好?对于优秀的客户端,我需要每秒发送至少一个请求。 (Websocket是否有这种用法?我不会在第一个版本中使用它们,而是为了将来的想法。) 非常感谢! – makrusak 2015-02-23 11:56:54

    +0

    @makrusak,如果您正在从应用服务器同步上传到第三方,那么很多图片上传可能会消耗您的最大请求池大小是正确的。正如我上面解释的那样,这会因请求排队而放慢速度。 “可重复请求”是什么意思?和'每秒一个请求'?如果您在提出请求时更喜欢来自客户端和来自客户端的实时响应,则Websockets非常出色。正如我所解释的那样,这不会绕过同步上传问题。 Websockets只会取代'pinging'ajax请求。让我知道你是否需要任何帮助。 – mkralla11 2015-02-26 17:57:06