'火&忘记来自Sinatra的电话

时间:2015-03-30 20:41:40

标签: ruby api pdf sinatra

我正在使用Sinatra编写一个终点,我将从客户端接收原始pdf,并需要处理pdf以供内部使用。现在pdf处理需要一段时间,我不一定希望客户端等到处理完成并冒timeout504)的风险。相反,当我用适当的代码回复客户端时,想要调用另一个处理pdf处理的方法。使用Sinatra实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

所以这里有几个部分,所以让我分解将要发生的各个步骤:

  • 客户端上传PDF文件:根据PDF的大小和连接速度,这可能需要一段时间。当您等待上传时,您的网络流程正忙于接收数据,并且无法处理任何其他客户的任何其他请求。
  • 然后,您需要处理上传的文件,将其存储在某处,可能以某种方式操纵它。如果您在请求流程中执行所有操作,那么您将有更多时间处理这一请求并无法为其他客户提供服务。

解决后者这些问题,操纵或处理上传资产的典型方法是使用后台作业队列,例如Sidekiq(http://sidekiq.org)。您将所需数据存储在某处,保留足够的信息以了解要处理的内容(例如,存储相关信息的模型的数据库ID,文件名等),然后将所有必需的信息传递到后台工作。然后,您可以使用单独的工作流程来完成工作并完成工作,但它们不属于您的Web流程,因此它们不会阻止其他客户端接收信息。

这仍然让我们处理大型上传的问题,幸运的是,它也有解决方案。利用亚马逊拥有的所有网络容量,并让客户端将文件直接上传到S3,当它完成时,他们可以只发布文件名给你,然后你可以从上一步将它排队到你的工作人员并拥有它一切都发生在后台。这篇博客文章很好地解释了如何使用Paperclip http://blog.littleblimp.com/post/53942611764/direct-uploads-to-s3-with-rails-paperclip-and

将它连接在一起