2015-03-30 44 views
0

我正在写一个使用Sinatra的终点,我将从客户那里接收原始pdf并需要处理pdf以供内部使用。现在PDF处理需要一段时间,我不一定希望客户端等待处理完成并冒着timeout504)的风险。而是想调用另一个处理pdf处理的方法,同时用适当的代码回应客户端。使用Sinatra的最佳方式是什么?Sinatra的“火与忘”电话

+1

有几个项目在单个请求之外实现作业队列。虽然通常与Rails一起使用(并且网上的大多数示例都会显示rails示例),但它们通常也可以从Sinatra很好地使用。示例是[delayed_job](https://github.com/collectiveidea/delayed_job),[resque](https://github.com/resque/resque)或[Sidekiq](http://sidekiq.org/)。这就是说,你的问题仍然非常广泛,StackOverflow不适合广泛的体系结构问题或寻找合适的工具来使用。你应该让自己的分析适合你。 – 2015-03-30 21:13:32

回答

1

所以有几个环节进行,所以让我崩溃的是将要发生的各个步骤:

  • 客户端上传了一个PDF文件:这取决于PDF的规模和速度的连接,这可能需要一段时间。在等待上传时,您的Web进程正在忙于接收数据,并且无法处理任何其他客户端的请求。
  • 然后,您需要处理上传的文件,将其存储在某处,可能会以某种方式对其进行处理。如果您将所有这些都作为请求流程的一部分来完成,那么您就有更多时间处理这一请求,无法为其他客户提供服务。

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

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