Rails 中的前景或背景图像操作(Jruby、Torquebox)
Foreground or background image manipulations in Rails (Jruby, Torquebox)
我用 ajax 上传照片,操作和上传到 s3 需要很多时间。我听说最好在后台完成这些任务。我的应用程序需要等待照片上传。但是,如果我选择后台方式,那么我将需要使用 websockets 或重复 ajax 来检查结果(链接到 s3)(我对此并不满意)。
为什么在控制器(前台)中进行硬计算太糟糕了?
现在我使用 Torquebox(Jruby),据我所知,它具有完美的并发性。这是否意味着等待上传到 s3 不会占用资源并且一切正常?
请根据我的情况写下 back/fore 地面的优缺点。谢谢!
在向第三方服务发出网络请求时阻止 Web 请求处理程序通常被认为是不好的做法。如果该服务变慢或不可用,这可能会阻塞您所有的 Web 进程,无论您使用什么 ruby。这就是您所说的 'foreground.'
基本上这是您当前设置的流程(在前台):
- 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
- 您的控制器向 s3 发出 同步 请求。这是一个阻塞请求。
- 您的控制器正在等待
- 您的控制器正在等待
- 您的控制器(继续)等待
- 最后,(并不能保证)您会收到来自 s3 的响应,并且您的代码会继续并呈现给定的 view/json/text/etc。
显然第 3-5 步对您的服务器来说是个坏消息,正如我之前所说,此 worker/thread/process(取决于您的 ruby/rails 服务器框架)将 'held up' 直到收到来自 s3 的响应(这可能永远不会发生)。
这里是带有后台作业的相同流程,在前端有一些 javascript 帮助用于通知:
- 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
- 您的控制器创建一个 new thread/process 来向 s3 发出请求。这是一种 非阻塞 方法。您在引用您的 s3 图像 src 的记录上设置了一个标志,例如 completed: false 并且您的 代码很好地继续到步骤 3。您的新 thread/process 将成为等待 s3 响应的那个,您将在 s3 响应时将 'completed' 标志设置为 true。
- 您呈现您的 view/json/text/etc,并且固有地 释放您的 worker/thread/process 为此请求...好消息!
现在开始有趣的前端内容:
- 您的客户端收到您的响应,触发您的前端 javascript 启动类似 setInterval 的重复函数,'pings' 您的服务器每 3 秒检查一次,后端控制器会在此处检查查看您之前设置的 'completed' 标志是否为真,如果是,则 respond/render 为真。
- 您的客户端 javascript 收到您的响应并继续 ping(直到您指定它应该放弃)或停止 ping,因为您的应用响应为真。
我希望这能让您走上正确的道路。我认为为这个答案编写代码是次等的,因为您似乎在寻找利弊。对于实际的实施想法,我会研究以下内容:
我用 ajax 上传照片,操作和上传到 s3 需要很多时间。我听说最好在后台完成这些任务。我的应用程序需要等待照片上传。但是,如果我选择后台方式,那么我将需要使用 websockets 或重复 ajax 来检查结果(链接到 s3)(我对此并不满意)。 为什么在控制器(前台)中进行硬计算太糟糕了? 现在我使用 Torquebox(Jruby),据我所知,它具有完美的并发性。这是否意味着等待上传到 s3 不会占用资源并且一切正常? 请根据我的情况写下 back/fore 地面的优缺点。谢谢!
在向第三方服务发出网络请求时阻止 Web 请求处理程序通常被认为是不好的做法。如果该服务变慢或不可用,这可能会阻塞您所有的 Web 进程,无论您使用什么 ruby。这就是您所说的 'foreground.'
基本上这是您当前设置的流程(在前台):
- 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
- 您的控制器向 s3 发出 同步 请求。这是一个阻塞请求。
- 您的控制器正在等待
- 您的控制器正在等待
- 您的控制器(继续)等待
- 最后,(并不能保证)您会收到来自 s3 的响应,并且您的代码会继续并呈现给定的 view/json/text/etc。
显然第 3-5 步对您的服务器来说是个坏消息,正如我之前所说,此 worker/thread/process(取决于您的 ruby/rails 服务器框架)将 'held up' 直到收到来自 s3 的响应(这可能永远不会发生)。
这里是带有后台作业的相同流程,在前端有一些 javascript 帮助用于通知:
- 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
- 您的控制器创建一个 new thread/process 来向 s3 发出请求。这是一种 非阻塞 方法。您在引用您的 s3 图像 src 的记录上设置了一个标志,例如 completed: false 并且您的 代码很好地继续到步骤 3。您的新 thread/process 将成为等待 s3 响应的那个,您将在 s3 响应时将 'completed' 标志设置为 true。
- 您呈现您的 view/json/text/etc,并且固有地 释放您的 worker/thread/process 为此请求...好消息!
现在开始有趣的前端内容:
- 您的客户端收到您的响应,触发您的前端 javascript 启动类似 setInterval 的重复函数,'pings' 您的服务器每 3 秒检查一次,后端控制器会在此处检查查看您之前设置的 'completed' 标志是否为真,如果是,则 respond/render 为真。
- 您的客户端 javascript 收到您的响应并继续 ping(直到您指定它应该放弃)或停止 ping,因为您的应用响应为真。
我希望这能让您走上正确的道路。我认为为这个答案编写代码是次等的,因为您似乎在寻找利弊。对于实际的实施想法,我会研究以下内容: