2015-03-30 75 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