2011-05-17 281 views
2

我正在研究一個圖像託管網站,並且我有點醃製。我選擇了Amazon S3,因爲它速度很快,而且規模很大,而且隨收隨付的模式。將圖像上傳到S3

當我從我的網站上傳圖片時,我需要在服務器上處理它們 - 創建3種不同的尺寸,將數據插入數據庫,然後準備上傳到S3(所有3種尺寸的圖片)。

我目前正在使用plupload進行上傳,現在我把它全部設置爲與我的數據庫一起作爲圖像存儲 - 僅用於測試目的。但我只是意識到 - 這上傳到我的網絡服務器,處理,然後上傳到S3意味着每個圖像的上傳時間翻倍?

有沒有處理這種情況的智能方法?

+2

尋找再次,看來你很關心「上傳每個圖像的時間」 - 你指的是最終用戶等待你的web應用程序?您不必等到圖像調整大小並上傳到S3以向上傳用戶返回響應。一旦用戶的上傳完成,您應該排隊作業並立即向用戶返回響應。然後有一個單獨的後臺線程,將作業從隊列中取出,並在後臺進行圖像處理。作業完成後,將其上傳到S3並更新數據庫以反映已調整大小的圖像。 – heavi5ide 2011-05-17 16:43:32

+0

這很奇怪......我只是從我的一個朋友那裏得到了完全相同的建議。我認爲這是我現在的方式。我只好上讓用戶的一個很好的用戶友好的方式工作的知道,自己的形象正在處理:)如果你關心這個快速複製到一個答案,我會接受它:) – Dynde 2011-05-17 18:09:26

+0

乾杯!希望可以幫助你。 – heavi5ide 2011-05-17 18:17:14

回答

1

再次審視您的問題,您似乎關注「每張圖片上傳時間」 - 您是指最終用戶在等待您的網絡應用嗎?您不必等到圖像調整大小並上傳到S3以向上傳用戶返回響應。一旦用戶的上傳完成,您應該排隊作業並立即向用戶返回響應。然後有一個單獨的後臺線程,將作業從隊列中取出,並在後臺進行圖像處理。作業完成後,將其上傳到S3並更新數據庫以反映已調整大小的圖像。你的問題

1

當然,您將需要更多的時間保存圖像,因爲您實際上會有兩次HTTP傳輸。你可以嘗試與其他操作並行執行上傳,例如:

  1. 開始上傳原始/最大圖像S3
  2. 在此期間,準備了其他兩個圖像
  3. 上傳其他兩個圖像並行

我懷疑上傳原始/最大的圖像不僅僅是生成兩個較小的圖像,所以並行解決方案將工作得很好。即使上傳比生成其他兩張圖片少,上傳並不會佔用很多CPU時間,所以在任何情況下都應該看到改進。

當然它更復雜,特別是如果你考慮錯誤處理。

+0

我想有圍繞這些雙轉移只是沒有辦法 - 我希望有人有一個很酷的前沿伎倆,就像位並行從web服務器位上傳到文件進入該網絡服務器 - 但我想我在科幻土地這一思路:)不過,感謝您的指針 - 儘管它可能是微不足道的東西,我得到了它,因爲我真的不擔心imageresizing的CPU處理時間 - 但傳輸當我害怕:/ – Dynde 2011-05-17 16:10:06

2

我們正在做一些類似於S3中處理文件和存儲的事情。主要區別在於我們的網絡服務器和處理服務器位於EC2上,因此它們不會產生任何S3/S3的傳輸成本,並且它們對S3具有非常高的帶寬。是否可以在EC2實例上運行圖像大小調整過程?您可以:

  1. 立即接受上傳直接對EC2實例的服務器過程中,對它們進行處理,然後將圖像保存到S3,或直接...

  2. 將圖像上傳到S3,以某種方式告訴你的EC2過程圖像到達(SQS隊列也許),然後讓你的服務器進程響應信號,從S3抓取文件,處理圖像,並將調整後的圖像保存回S3。

基本上,我是說,你應該充分利用這一點(從AWS網站S3說明):

有亞馬遜EC2 和亞馬遜之間移送 數據沒有數據傳輸費用S3在同一地區 或在 亞馬遜EC2弗吉尼亞北部地區 和亞馬遜S3美國標準地區之間傳輸的數據。

+0

這看起來很有趣。儘管我認爲,爲了真正從中受益,我可能必須將整個Web應用程序移至EC2(因爲每個請求都需要執行其他操作,而不僅僅是圖像處理,比如db工作) - 而且我不瞭解EC2什麼,它看起來在其網站上相當複雜:) – Dynde 2011-05-17 16:05:02

+0

正確的,這絕對是一個概念障礙的一點點,如果你不需要它可能會造成不必要的併發症。我不認爲你必須將整個應用程序移至EC2。您可以使用消息隊列或其他方法在應用程序和EC2作業處理器之間進行協調,因此EC2進程只是在進行「啞巴」圖像大小調整並保存到S3。 – heavi5ide 2011-05-17 16:39:41