'Fire & Forget'来自辛纳屈的电话



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

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

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

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

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

最新更新